From df6e94c3d38e20acdf4f09b43932df73345031d9 Mon Sep 17 00:00:00 2001
From: Ryan Sauge <ryan.sauge@protonmail.com>
Date: Tue, 9 Jul 2024 17:57:27 +0200
Subject: [PATCH 1/2] update doc

---
 LICENSE.md                                    |  373 +++++
 RuleEngineV2.0.2.json                         | 1449 +++++++++++++++++
 RuleWhitelistWrapper.json                     |    1 +
 RuleWhitelistv2.0.2.json                      | 1081 ++++++++++++
 doc/schema/RuleEngine                         |    2 +-
 doc/schema/rule/ruleWhitelistWrapper.drawio   |    2 +-
 .../rule/ruleWhitelistWrapperV2.drawio.png    |  Bin 0 -> 111165 bytes
 7 files changed, 2906 insertions(+), 2 deletions(-)
 create mode 100644 LICENSE.md
 create mode 100644 RuleEngineV2.0.2.json
 create mode 100644 RuleWhitelistWrapper.json
 create mode 100644 RuleWhitelistv2.0.2.json
 create mode 100644 doc/schema/rule/ruleWhitelistWrapperV2.drawio.png

diff --git a/LICENSE.md b/LICENSE.md
new file mode 100644
index 0000000..a612ad9
--- /dev/null
+++ b/LICENSE.md
@@ -0,0 +1,373 @@
+Mozilla Public License Version 2.0
+==================================
+
+1. Definitions
+--------------
+
+1.1. "Contributor"
+    means each individual or legal entity that creates, contributes to
+    the creation of, or owns Covered Software.
+
+1.2. "Contributor Version"
+    means the combination of the Contributions of others (if any) used
+    by a Contributor and that particular Contributor's Contribution.
+
+1.3. "Contribution"
+    means Covered Software of a particular Contributor.
+
+1.4. "Covered Software"
+    means Source Code Form to which the initial Contributor has attached
+    the notice in Exhibit A, the Executable Form of such Source Code
+    Form, and Modifications of such Source Code Form, in each case
+    including portions thereof.
+
+1.5. "Incompatible With Secondary Licenses"
+    means
+
+    (a) that the initial Contributor has attached the notice described
+        in Exhibit B to the Covered Software; or
+
+    (b) that the Covered Software was made available under the terms of
+        version 1.1 or earlier of the License, but not also under the
+        terms of a Secondary License.
+
+1.6. "Executable Form"
+    means any form of the work other than Source Code Form.
+
+1.7. "Larger Work"
+    means a work that combines Covered Software with other material, in
+    a separate file or files, that is not Covered Software.
+
+1.8. "License"
+    means this document.
+
+1.9. "Licensable"
+    means having the right to grant, to the maximum extent possible,
+    whether at the time of the initial grant or subsequently, any and
+    all of the rights conveyed by this License.
+
+1.10. "Modifications"
+    means any of the following:
+
+    (a) any file in Source Code Form that results from an addition to,
+        deletion from, or modification of the contents of Covered
+        Software; or
+
+    (b) any new file in Source Code Form that contains any Covered
+        Software.
+
+1.11. "Patent Claims" of a Contributor
+    means any patent claim(s), including without limitation, method,
+    process, and apparatus claims, in any patent Licensable by such
+    Contributor that would be infringed, but for the grant of the
+    License, by the making, using, selling, offering for sale, having
+    made, import, or transfer of either its Contributions or its
+    Contributor Version.
+
+1.12. "Secondary License"
+    means either the GNU General Public License, Version 2.0, the GNU
+    Lesser General Public License, Version 2.1, the GNU Affero General
+    Public License, Version 3.0, or any later versions of those
+    licenses.
+
+1.13. "Source Code Form"
+    means the form of the work preferred for making modifications.
+
+1.14. "You" (or "Your")
+    means an individual or a legal entity exercising rights under this
+    License. For legal entities, "You" includes any entity that
+    controls, is controlled by, or is under common control with You. For
+    purposes of this definition, "control" means (a) the power, direct
+    or indirect, to cause the direction or management of such entity,
+    whether by contract or otherwise, or (b) ownership of more than
+    fifty percent (50%) of the outstanding shares or beneficial
+    ownership of such entity.
+
+2. License Grants and Conditions
+--------------------------------
+
+2.1. Grants
+
+Each Contributor hereby grants You a world-wide, royalty-free,
+non-exclusive license:
+
+(a) under intellectual property rights (other than patent or trademark)
+    Licensable by such Contributor to use, reproduce, make available,
+    modify, display, perform, distribute, and otherwise exploit its
+    Contributions, either on an unmodified basis, with Modifications, or
+    as part of a Larger Work; and
+
+(b) under Patent Claims of such Contributor to make, use, sell, offer
+    for sale, have made, import, and otherwise transfer either its
+    Contributions or its Contributor Version.
+
+2.2. Effective Date
+
+The licenses granted in Section 2.1 with respect to any Contribution
+become effective for each Contribution on the date the Contributor first
+distributes such Contribution.
+
+2.3. Limitations on Grant Scope
+
+The licenses granted in this Section 2 are the only rights granted under
+this License. No additional rights or licenses will be implied from the
+distribution or licensing of Covered Software under this License.
+Notwithstanding Section 2.1(b) above, no patent license is granted by a
+Contributor:
+
+(a) for any code that a Contributor has removed from Covered Software;
+    or
+
+(b) for infringements caused by: (i) Your and any other third party's
+    modifications of Covered Software, or (ii) the combination of its
+    Contributions with other software (except as part of its Contributor
+    Version); or
+
+(c) under Patent Claims infringed by Covered Software in the absence of
+    its Contributions.
+
+This License does not grant any rights in the trademarks, service marks,
+or logos of any Contributor (except as may be necessary to comply with
+the notice requirements in Section 3.4).
+
+2.4. Subsequent Licenses
+
+No Contributor makes additional grants as a result of Your choice to
+distribute the Covered Software under a subsequent version of this
+License (see Section 10.2) or under the terms of a Secondary License (if
+permitted under the terms of Section 3.3).
+
+2.5. Representation
+
+Each Contributor represents that the Contributor believes its
+Contributions are its original creation(s) or it has sufficient rights
+to grant the rights to its Contributions conveyed by this License.
+
+2.6. Fair Use
+
+This License is not intended to limit any rights You have under
+applicable copyright doctrines of fair use, fair dealing, or other
+equivalents.
+
+2.7. Conditions
+
+Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted
+in Section 2.1.
+
+3. Responsibilities
+-------------------
+
+3.1. Distribution of Source Form
+
+All distribution of Covered Software in Source Code Form, including any
+Modifications that You create or to which You contribute, must be under
+the terms of this License. You must inform recipients that the Source
+Code Form of the Covered Software is governed by the terms of this
+License, and how they can obtain a copy of this License. You may not
+attempt to alter or restrict the recipients' rights in the Source Code
+Form.
+
+3.2. Distribution of Executable Form
+
+If You distribute Covered Software in Executable Form then:
+
+(a) such Covered Software must also be made available in Source Code
+    Form, as described in Section 3.1, and You must inform recipients of
+    the Executable Form how they can obtain a copy of such Source Code
+    Form by reasonable means in a timely manner, at a charge no more
+    than the cost of distribution to the recipient; and
+
+(b) You may distribute such Executable Form under the terms of this
+    License, or sublicense it under different terms, provided that the
+    license for the Executable Form does not attempt to limit or alter
+    the recipients' rights in the Source Code Form under this License.
+
+3.3. Distribution of a Larger Work
+
+You may create and distribute a Larger Work under terms of Your choice,
+provided that You also comply with the requirements of this License for
+the Covered Software. If the Larger Work is a combination of Covered
+Software with a work governed by one or more Secondary Licenses, and the
+Covered Software is not Incompatible With Secondary Licenses, this
+License permits You to additionally distribute such Covered Software
+under the terms of such Secondary License(s), so that the recipient of
+the Larger Work may, at their option, further distribute the Covered
+Software under the terms of either this License or such Secondary
+License(s).
+
+3.4. Notices
+
+You may not remove or alter the substance of any license notices
+(including copyright notices, patent notices, disclaimers of warranty,
+or limitations of liability) contained within the Source Code Form of
+the Covered Software, except that You may alter any license notices to
+the extent required to remedy known factual inaccuracies.
+
+3.5. Application of Additional Terms
+
+You may choose to offer, and to charge a fee for, warranty, support,
+indemnity or liability obligations to one or more recipients of Covered
+Software. However, You may do so only on Your own behalf, and not on
+behalf of any Contributor. You must make it absolutely clear that any
+such warranty, support, indemnity, or liability obligation is offered by
+You alone, and You hereby agree to indemnify every Contributor for any
+liability incurred by such Contributor as a result of warranty, support,
+indemnity or liability terms You offer. You may include additional
+disclaimers of warranty and limitations of liability specific to any
+jurisdiction.
+
+4. Inability to Comply Due to Statute or Regulation
+---------------------------------------------------
+
+If it is impossible for You to comply with any of the terms of this
+License with respect to some or all of the Covered Software due to
+statute, judicial order, or regulation then You must: (a) comply with
+the terms of this License to the maximum extent possible; and (b)
+describe the limitations and the code they affect. Such description must
+be placed in a text file included with all distributions of the Covered
+Software under this License. Except to the extent prohibited by statute
+or regulation, such description must be sufficiently detailed for a
+recipient of ordinary skill to be able to understand it.
+
+5. Termination
+--------------
+
+5.1. The rights granted under this License will terminate automatically
+if You fail to comply with any of its terms. However, if You become
+compliant, then the rights granted under this License from a particular
+Contributor are reinstated (a) provisionally, unless and until such
+Contributor explicitly and finally terminates Your grants, and (b) on an
+ongoing basis, if such Contributor fails to notify You of the
+non-compliance by some reasonable means prior to 60 days after You have
+come back into compliance. Moreover, Your grants from a particular
+Contributor are reinstated on an ongoing basis if such Contributor
+notifies You of the non-compliance by some reasonable means, this is the
+first time You have received notice of non-compliance with this License
+from such Contributor, and You become compliant prior to 30 days after
+Your receipt of the notice.
+
+5.2. If You initiate litigation against any entity by asserting a patent
+infringement claim (excluding declaratory judgment actions,
+counter-claims, and cross-claims) alleging that a Contributor Version
+directly or indirectly infringes any patent, then the rights granted to
+You by any and all Contributors for the Covered Software under Section
+2.1 of this License shall terminate.
+
+5.3. In the event of termination under Sections 5.1 or 5.2 above, all
+end user license agreements (excluding distributors and resellers) which
+have been validly granted by You or Your distributors under this License
+prior to termination shall survive termination.
+
+************************************************************************
+*                                                                      *
+*  6. Disclaimer of Warranty                                           *
+*  -------------------------                                           *
+*                                                                      *
+*  Covered Software is provided under this License on an "as is"       *
+*  basis, without warranty of any kind, either expressed, implied, or  *
+*  statutory, including, without limitation, warranties that the       *
+*  Covered Software is free of defects, merchantable, fit for a        *
+*  particular purpose or non-infringing. The entire risk as to the     *
+*  quality and performance of the Covered Software is with You.        *
+*  Should any Covered Software prove defective in any respect, You     *
+*  (not any Contributor) assume the cost of any necessary servicing,   *
+*  repair, or correction. This disclaimer of warranty constitutes an   *
+*  essential part of this License. No use of any Covered Software is   *
+*  authorized under this License except under this disclaimer.         *
+*                                                                      *
+************************************************************************
+
+************************************************************************
+*                                                                      *
+*  7. Limitation of Liability                                          *
+*  --------------------------                                          *
+*                                                                      *
+*  Under no circumstances and under no legal theory, whether tort      *
+*  (including negligence), contract, or otherwise, shall any           *
+*  Contributor, or anyone who distributes Covered Software as          *
+*  permitted above, be liable to You for any direct, indirect,         *
+*  special, incidental, or consequential damages of any character      *
+*  including, without limitation, damages for lost profits, loss of    *
+*  goodwill, work stoppage, computer failure or malfunction, or any    *
+*  and all other commercial damages or losses, even if such party      *
+*  shall have been informed of the possibility of such damages. This   *
+*  limitation of liability shall not apply to liability for death or   *
+*  personal injury resulting from such party's negligence to the       *
+*  extent applicable law prohibits such limitation. Some               *
+*  jurisdictions do not allow the exclusion or limitation of           *
+*  incidental or consequential damages, so this exclusion and          *
+*  limitation may not apply to You.                                    *
+*                                                                      *
+************************************************************************
+
+8. Litigation
+-------------
+
+Any litigation relating to this License may be brought only in the
+courts of a jurisdiction where the defendant maintains its principal
+place of business and such litigation shall be governed by laws of that
+jurisdiction, without reference to its conflict-of-law provisions.
+Nothing in this Section shall prevent a party's ability to bring
+cross-claims or counter-claims.
+
+9. Miscellaneous
+----------------
+
+This License represents the complete agreement concerning the subject
+matter hereof. If any provision of this License is held to be
+unenforceable, such provision shall be reformed only to the extent
+necessary to make it enforceable. Any law or regulation which provides
+that the language of a contract shall be construed against the drafter
+shall not be used to construe this License against a Contributor.
+
+10. Versions of the License
+---------------------------
+
+10.1. New Versions
+
+Mozilla Foundation is the license steward. Except as provided in Section
+10.3, no one other than the license steward has the right to modify or
+publish new versions of this License. Each version will be given a
+distinguishing version number.
+
+10.2. Effect of New Versions
+
+You may distribute the Covered Software under the terms of the version
+of the License under which You originally received the Covered Software,
+or under the terms of any subsequent version published by the license
+steward.
+
+10.3. Modified Versions
+
+If you create software not governed by this License, and you want to
+create a new license for such software, you may create and use a
+modified version of this License if you rename the license and remove
+any references to the name of the license steward (except to note that
+such modified license differs from this License).
+
+10.4. Distributing Source Code Form that is Incompatible With Secondary
+Licenses
+
+If You choose to distribute Source Code Form that is Incompatible With
+Secondary Licenses under the terms of this version of the License, the
+notice described in Exhibit B of this License must be attached.
+
+Exhibit A - Source Code Form License Notice
+-------------------------------------------
+
+  This Source Code Form is subject to the terms of the Mozilla Public
+  License, v. 2.0. If a copy of the MPL was not distributed with this
+  file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+If it is not possible or desirable to put the notice in a particular
+file, then You may include the notice in a location (such as a LICENSE
+file in a relevant directory) where a recipient would be likely to look
+for such a notice.
+
+You may add additional accurate notices of copyright ownership.
+
+Exhibit B - "Incompatible With Secondary Licenses" Notice
+---------------------------------------------------------
+
+  This Source Code Form is "Incompatible With Secondary Licenses", as
+  defined by the Mozilla Public License, v. 2.0.
diff --git a/RuleEngineV2.0.2.json b/RuleEngineV2.0.2.json
new file mode 100644
index 0000000..aaf230e
--- /dev/null
+++ b/RuleEngineV2.0.2.json
@@ -0,0 +1,1449 @@
+{
+  "contractName": "RuleEngine",
+  "abi": [
+    {
+      "type": "constructor",
+      "inputs": [
+        { "name": "admin", "type": "address", "internalType": "address" },
+        {
+          "name": "forwarderIrrevocable",
+          "type": "address",
+          "internalType": "address"
+        },
+        {
+          "name": "tokenContract",
+          "type": "address",
+          "internalType": "address"
+        }
+      ],
+      "stateMutability": "nonpayable"
+    },
+    {
+      "type": "function",
+      "name": "DEFAULT_ADMIN_ROLE",
+      "inputs": [],
+      "outputs": [{ "name": "", "type": "bytes32", "internalType": "bytes32" }],
+      "stateMutability": "view"
+    },
+    {
+      "type": "function",
+      "name": "RULE_ENGINE_OPERATOR_ROLE",
+      "inputs": [],
+      "outputs": [{ "name": "", "type": "bytes32", "internalType": "bytes32" }],
+      "stateMutability": "view"
+    },
+    {
+      "type": "function",
+      "name": "TOKEN_CONTRACT_ROLE",
+      "inputs": [],
+      "outputs": [{ "name": "", "type": "bytes32", "internalType": "bytes32" }],
+      "stateMutability": "view"
+    },
+    {
+      "type": "function",
+      "name": "addRuleOperation",
+      "inputs": [
+        {
+          "name": "rule_",
+          "type": "address",
+          "internalType": "contract IRuleOperation"
+        }
+      ],
+      "outputs": [],
+      "stateMutability": "nonpayable"
+    },
+    {
+      "type": "function",
+      "name": "addRuleValidation",
+      "inputs": [
+        {
+          "name": "rule_",
+          "type": "address",
+          "internalType": "contract IRuleValidation"
+        }
+      ],
+      "outputs": [],
+      "stateMutability": "nonpayable"
+    },
+    {
+      "type": "function",
+      "name": "clearRulesOperation",
+      "inputs": [],
+      "outputs": [],
+      "stateMutability": "nonpayable"
+    },
+    {
+      "type": "function",
+      "name": "clearRulesValidation",
+      "inputs": [],
+      "outputs": [],
+      "stateMutability": "nonpayable"
+    },
+    {
+      "type": "function",
+      "name": "detectTransferRestriction",
+      "inputs": [
+        { "name": "_from", "type": "address", "internalType": "address" },
+        { "name": "_to", "type": "address", "internalType": "address" },
+        { "name": "_amount", "type": "uint256", "internalType": "uint256" }
+      ],
+      "outputs": [{ "name": "", "type": "uint8", "internalType": "uint8" }],
+      "stateMutability": "view"
+    },
+    {
+      "type": "function",
+      "name": "detectTransferRestrictionValidation",
+      "inputs": [
+        { "name": "_from", "type": "address", "internalType": "address" },
+        { "name": "_to", "type": "address", "internalType": "address" },
+        { "name": "_amount", "type": "uint256", "internalType": "uint256" }
+      ],
+      "outputs": [{ "name": "", "type": "uint8", "internalType": "uint8" }],
+      "stateMutability": "view"
+    },
+    {
+      "type": "function",
+      "name": "getRoleAdmin",
+      "inputs": [
+        { "name": "role", "type": "bytes32", "internalType": "bytes32" }
+      ],
+      "outputs": [{ "name": "", "type": "bytes32", "internalType": "bytes32" }],
+      "stateMutability": "view"
+    },
+    {
+      "type": "function",
+      "name": "getRuleIndexOperation",
+      "inputs": [
+        {
+          "name": "rule_",
+          "type": "address",
+          "internalType": "contract IRuleOperation"
+        }
+      ],
+      "outputs": [
+        { "name": "index", "type": "uint256", "internalType": "uint256" }
+      ],
+      "stateMutability": "view"
+    },
+    {
+      "type": "function",
+      "name": "getRuleIndexValidation",
+      "inputs": [
+        {
+          "name": "rule_",
+          "type": "address",
+          "internalType": "contract IRuleValidation"
+        }
+      ],
+      "outputs": [
+        { "name": "index", "type": "uint256", "internalType": "uint256" }
+      ],
+      "stateMutability": "view"
+    },
+    {
+      "type": "function",
+      "name": "grantRole",
+      "inputs": [
+        { "name": "role", "type": "bytes32", "internalType": "bytes32" },
+        { "name": "account", "type": "address", "internalType": "address" }
+      ],
+      "outputs": [],
+      "stateMutability": "nonpayable"
+    },
+    {
+      "type": "function",
+      "name": "hasRole",
+      "inputs": [
+        { "name": "role", "type": "bytes32", "internalType": "bytes32" },
+        { "name": "account", "type": "address", "internalType": "address" }
+      ],
+      "outputs": [{ "name": "", "type": "bool", "internalType": "bool" }],
+      "stateMutability": "view"
+    },
+    {
+      "type": "function",
+      "name": "isTrustedForwarder",
+      "inputs": [
+        { "name": "forwarder", "type": "address", "internalType": "address" }
+      ],
+      "outputs": [{ "name": "", "type": "bool", "internalType": "bool" }],
+      "stateMutability": "view"
+    },
+    {
+      "type": "function",
+      "name": "messageForTransferRestriction",
+      "inputs": [
+        { "name": "_restrictionCode", "type": "uint8", "internalType": "uint8" }
+      ],
+      "outputs": [{ "name": "", "type": "string", "internalType": "string" }],
+      "stateMutability": "view"
+    },
+    {
+      "type": "function",
+      "name": "operateOnTransfer",
+      "inputs": [
+        { "name": "from", "type": "address", "internalType": "address" },
+        { "name": "to", "type": "address", "internalType": "address" },
+        { "name": "amount", "type": "uint256", "internalType": "uint256" }
+      ],
+      "outputs": [
+        { "name": "isValid", "type": "bool", "internalType": "bool" }
+      ],
+      "stateMutability": "nonpayable"
+    },
+    {
+      "type": "function",
+      "name": "removeRuleOperation",
+      "inputs": [
+        {
+          "name": "rule_",
+          "type": "address",
+          "internalType": "contract IRuleOperation"
+        },
+        { "name": "index", "type": "uint256", "internalType": "uint256" }
+      ],
+      "outputs": [],
+      "stateMutability": "nonpayable"
+    },
+    {
+      "type": "function",
+      "name": "removeRuleValidation",
+      "inputs": [
+        {
+          "name": "rule_",
+          "type": "address",
+          "internalType": "contract IRuleValidation"
+        },
+        { "name": "index", "type": "uint256", "internalType": "uint256" }
+      ],
+      "outputs": [],
+      "stateMutability": "nonpayable"
+    },
+    {
+      "type": "function",
+      "name": "renounceRole",
+      "inputs": [
+        { "name": "role", "type": "bytes32", "internalType": "bytes32" },
+        {
+          "name": "callerConfirmation",
+          "type": "address",
+          "internalType": "address"
+        }
+      ],
+      "outputs": [],
+      "stateMutability": "nonpayable"
+    },
+    {
+      "type": "function",
+      "name": "revokeRole",
+      "inputs": [
+        { "name": "role", "type": "bytes32", "internalType": "bytes32" },
+        { "name": "account", "type": "address", "internalType": "address" }
+      ],
+      "outputs": [],
+      "stateMutability": "nonpayable"
+    },
+    {
+      "type": "function",
+      "name": "ruleOperation",
+      "inputs": [
+        { "name": "ruleId", "type": "uint256", "internalType": "uint256" }
+      ],
+      "outputs": [{ "name": "", "type": "address", "internalType": "address" }],
+      "stateMutability": "view"
+    },
+    {
+      "type": "function",
+      "name": "ruleValidation",
+      "inputs": [
+        { "name": "ruleId", "type": "uint256", "internalType": "uint256" }
+      ],
+      "outputs": [{ "name": "", "type": "address", "internalType": "address" }],
+      "stateMutability": "view"
+    },
+    {
+      "type": "function",
+      "name": "rulesCountOperation",
+      "inputs": [],
+      "outputs": [{ "name": "", "type": "uint256", "internalType": "uint256" }],
+      "stateMutability": "view"
+    },
+    {
+      "type": "function",
+      "name": "rulesCountValidation",
+      "inputs": [],
+      "outputs": [{ "name": "", "type": "uint256", "internalType": "uint256" }],
+      "stateMutability": "view"
+    },
+    {
+      "type": "function",
+      "name": "rulesOperation",
+      "inputs": [],
+      "outputs": [
+        { "name": "", "type": "address[]", "internalType": "address[]" }
+      ],
+      "stateMutability": "view"
+    },
+    {
+      "type": "function",
+      "name": "rulesValidation",
+      "inputs": [],
+      "outputs": [
+        { "name": "", "type": "address[]", "internalType": "address[]" }
+      ],
+      "stateMutability": "view"
+    },
+    {
+      "type": "function",
+      "name": "setRulesOperation",
+      "inputs": [
+        { "name": "rules_", "type": "address[]", "internalType": "address[]" }
+      ],
+      "outputs": [],
+      "stateMutability": "nonpayable"
+    },
+    {
+      "type": "function",
+      "name": "setRulesValidation",
+      "inputs": [
+        { "name": "rules_", "type": "address[]", "internalType": "address[]" }
+      ],
+      "outputs": [],
+      "stateMutability": "nonpayable"
+    },
+    {
+      "type": "function",
+      "name": "supportsInterface",
+      "inputs": [
+        { "name": "interfaceId", "type": "bytes4", "internalType": "bytes4" }
+      ],
+      "outputs": [{ "name": "", "type": "bool", "internalType": "bool" }],
+      "stateMutability": "view"
+    },
+    {
+      "type": "function",
+      "name": "trustedForwarder",
+      "inputs": [],
+      "outputs": [{ "name": "", "type": "address", "internalType": "address" }],
+      "stateMutability": "view"
+    },
+    {
+      "type": "function",
+      "name": "validateTransfer",
+      "inputs": [
+        { "name": "_from", "type": "address", "internalType": "address" },
+        { "name": "_to", "type": "address", "internalType": "address" },
+        { "name": "_amount", "type": "uint256", "internalType": "uint256" }
+      ],
+      "outputs": [{ "name": "", "type": "bool", "internalType": "bool" }],
+      "stateMutability": "view"
+    },
+    {
+      "type": "function",
+      "name": "validateTransferValidation",
+      "inputs": [
+        { "name": "_from", "type": "address", "internalType": "address" },
+        { "name": "_to", "type": "address", "internalType": "address" },
+        { "name": "_amount", "type": "uint256", "internalType": "uint256" }
+      ],
+      "outputs": [{ "name": "", "type": "bool", "internalType": "bool" }],
+      "stateMutability": "view"
+    },
+    {
+      "type": "event",
+      "name": "AddRule",
+      "inputs": [
+        {
+          "name": "rule",
+          "type": "address",
+          "indexed": true,
+          "internalType": "address"
+        }
+      ],
+      "anonymous": false
+    },
+    {
+      "type": "event",
+      "name": "ClearRules",
+      "inputs": [
+        {
+          "name": "rulesRemoved",
+          "type": "address[]",
+          "indexed": false,
+          "internalType": "address[]"
+        }
+      ],
+      "anonymous": false
+    },
+    {
+      "type": "event",
+      "name": "RemoveRule",
+      "inputs": [
+        {
+          "name": "rule",
+          "type": "address",
+          "indexed": true,
+          "internalType": "address"
+        }
+      ],
+      "anonymous": false
+    },
+    {
+      "type": "event",
+      "name": "RoleAdminChanged",
+      "inputs": [
+        {
+          "name": "role",
+          "type": "bytes32",
+          "indexed": true,
+          "internalType": "bytes32"
+        },
+        {
+          "name": "previousAdminRole",
+          "type": "bytes32",
+          "indexed": true,
+          "internalType": "bytes32"
+        },
+        {
+          "name": "newAdminRole",
+          "type": "bytes32",
+          "indexed": true,
+          "internalType": "bytes32"
+        }
+      ],
+      "anonymous": false
+    },
+    {
+      "type": "event",
+      "name": "RoleGranted",
+      "inputs": [
+        {
+          "name": "role",
+          "type": "bytes32",
+          "indexed": true,
+          "internalType": "bytes32"
+        },
+        {
+          "name": "account",
+          "type": "address",
+          "indexed": true,
+          "internalType": "address"
+        },
+        {
+          "name": "sender",
+          "type": "address",
+          "indexed": true,
+          "internalType": "address"
+        }
+      ],
+      "anonymous": false
+    },
+    {
+      "type": "event",
+      "name": "RoleRevoked",
+      "inputs": [
+        {
+          "name": "role",
+          "type": "bytes32",
+          "indexed": true,
+          "internalType": "bytes32"
+        },
+        {
+          "name": "account",
+          "type": "address",
+          "indexed": true,
+          "internalType": "address"
+        },
+        {
+          "name": "sender",
+          "type": "address",
+          "indexed": true,
+          "internalType": "address"
+        }
+      ],
+      "anonymous": false
+    },
+    { "type": "error", "name": "AccessControlBadConfirmation", "inputs": [] },
+    {
+      "type": "error",
+      "name": "AccessControlUnauthorizedAccount",
+      "inputs": [
+        { "name": "account", "type": "address", "internalType": "address" },
+        { "name": "neededRole", "type": "bytes32", "internalType": "bytes32" }
+      ]
+    },
+    {
+      "type": "error",
+      "name": "RuleEngine_AdminWithAddressZeroNotAllowed",
+      "inputs": []
+    },
+    { "type": "error", "name": "RuleEngine_ArrayIsEmpty", "inputs": [] },
+    {
+      "type": "error",
+      "name": "RuleEngine_RuleAddressZeroNotAllowed",
+      "inputs": []
+    },
+    { "type": "error", "name": "RuleEngine_RuleAlreadyExists", "inputs": [] },
+    { "type": "error", "name": "RuleEngine_RuleDoNotMatch", "inputs": [] },
+    { "type": "error", "name": "RuleEngine_TransferInvalid", "inputs": [] }
+  ],
+  "bytecode":"0x60a06040523480156200001157600080fd5b5060405162001db338038062001db3833981016040819052620000349162000246565b6001600160a01b0380831660805283166200006257604051630872273360e21b815260040160405180910390fd5b6001600160a01b03811615620000a0576200009e7fd32fd1ee5f4f111da6f27444787e5200ec57a8849509c00ef2998467052b32a382620000e4565b505b620000ad600084620000e4565b50620000da7fb3c151d85eb431da97012a1682e6ab41bddc7db1012e7c40bd326c24bf56f99984620000e4565b505050506200030f565b6000828152602081815260408083206001600160a01b038516845290915281205460ff166200018b576000838152602081815260408083206001600160a01b03861684529091529020805460ff191660011790556200014262000195565b6001600160a01b0316826001600160a01b0316847f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45060016200018f565b5060005b92915050565b6000620001a1620001a6565b905090565b6000366014620001b63362000202565b8015620001c35750808210155b15620001fa57600036620001d8838562000290565b620001e5928290620002b2565b620001f091620002de565b60601c9250505090565b339250505090565b60006200020e60805190565b6001600160a01b0316826001600160a01b0316149050919050565b80516001600160a01b03811681146200024157600080fd5b919050565b6000806000606084860312156200025c57600080fd5b620002678462000229565b9250620002776020850162000229565b9150620002876040850162000229565b90509250925092565b818103818111156200018f57634e487b7160e01b600052601160045260246000fd5b60008085851115620002c357600080fd5b83861115620002d157600080fd5b5050820193919092039150565b6001600160601b03198135818116916014851015620003075780818660140360031b1b83161692505b505092915050565b608051611a7a620003396000396000818161033d01528181610384015261137d0152611a7a6000f3fe608060405234801561001057600080fd5b50600436106101fa5760003560e01c80638a1b6c8e1161011a578063c6946a12116100ad578063ce29ed351161007c578063ce29ed3514610495578063d0e835f2146104a8578063d4ce1415146104bb578063d547741f146104ce578063eb2647e3146104e157600080fd5b8063c6946a1214610449578063ca1f6c4d1461045c578063ca3e16e71461046f578063cd1d4dc71461048257600080fd5b8063a39eda14116100e9578063a39eda1414610406578063c03888c21461041b578063c57086a11461042e578063c68a651a1461043657600080fd5b80638a1b6c8e146103db5780638a2021b1146103e357806391d14854146103eb578063a217fddf146103fe57600080fd5b806336568abe116101925780636728f545116101615780636728f5451461036d5780637da0a877146103825780637f4ab1dd146103a857806383304df0146103c857600080fd5b806336568abe146102dc578063397a7d3c146102ef5780634d53374e1461031a578063572b6c051461032d57600080fd5b806328aa67bc116101ce57806328aa67bc146102895780632f2ff15d146102ae578063323a4616146102c1578063334a29cc146102c957600080fd5b80621582f7146101ff57806301ffc9a7146102095780630fbbfb5514610231578063248a9ca314610266575b600080fd5b6102076104f4565b005b61021c6102173660046115bc565b610517565b60405190151581526020015b60405180910390f35b6102587fd32fd1ee5f4f111da6f27444787e5200ec57a8849509c00ef2998467052b32a381565b604051908152602001610228565b6102586102743660046115e6565b60009081526020819052604090206001015490565b61029c610297366004611614565b61054e565b60405160ff9091168152602001610228565b6102076102bc366004611655565b610626565b600354610258565b6102076102d7366004611685565b610651565b6102076102ea366004611655565b61068f565b6103026102fd3660046115e6565b6106d7565b6040516001600160a01b039091168152602001610228565b6102076103283660046116fa565b610707565b61021c61033b366004611726565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0390811691161490565b610258600080516020611a2583398151915281565b7f0000000000000000000000000000000000000000000000000000000000000000610302565b6103bb6103b6366004611752565b610729565b6040516102289190611793565b6102586103d6366004611726565b610960565b61020761096d565b600254610258565b61021c6103f9366004611655565b61098d565b610258600081565b61040e6109b6565b60405161022891906117c6565b61021c610429366004611614565b610a18565b61040e610a6f565b610207610444366004611726565b610acf565b61021c610457366004611614565b610b2a565b61020761046a366004611685565b610b44565b61030261047d3660046115e6565b610b82565b610207610490366004611726565b610b97565b6102076104a33660046116fa565b610bba565b6102586104b6366004611726565b610bdc565b61029c6104c9366004611614565b610be9565b6102076104dc366004611655565b610cde565b61021c6104ef366004611614565b610d03565b600080516020611a2583398151915261050c81610d11565b610514610d22565b50565b60006001600160e01b03198216637965db0b60e01b148061054857506301ffc9a760e01b6001600160e01b03198316145b92915050565b600254600090815b818110156106175760006002828154811061057357610573611813565b60009182526020909120015460405163d4ce141560e01b81526001600160a01b0389811660048301528881166024830152604482018890529091169063d4ce141590606401602060405180830381865afa1580156105d5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105f99190611829565b905060ff81161561060e57925061061f915050565b50600101610556565b5060005b9150505b9392505050565b60008281526020819052604090206001015461064181610d11565b61064b8383610db2565b50505050565b600080516020611a2583398151915261066981610d11565b6002541561067957610679610e45565b6106838383610eca565b61064b60028484611544565b610697611065565b6001600160a01b0316816001600160a01b0316146106c85760405163334bd91960e11b815260040160405180910390fd5b6106d28282611074565b505050565b6000600282815481106106ec576106ec611813565b6000918252602090912001546001600160a01b031692915050565b600080516020611a2583398151915261071f81610d11565b6106d283836110fd565b60025460609060005b81811015610869576002818154811061074d5761074d611813565b600091825260209091200154604051633e822efb60e11b815260ff861660048201526001600160a01b0390911690637d045df690602401602060405180830381865afa1580156107a1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107c59190611846565b1561086157600281815481106107dd576107dd611813565b600091825260209091200154604051637f4ab1dd60e01b815260ff861660048201526001600160a01b0390911690637f4ab1dd90602401600060405180830381865afa158015610831573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610859919081019061187e565b949350505050565b600101610732565b505060035460005b81811015610924576003818154811061088c5761088c611813565b600091825260209091200154604051633e822efb60e11b815260ff861660048201526001600160a01b0390911690637d045df690602401602060405180830381865afa1580156108e0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109049190611846565b1561091c57600381815481106107dd576107dd611813565b600101610871565b505060408051808201909152601881527f556e6b6e6f776e207265737472696374696f6e20636f64650000000000000000602082015292915050565b6000610548600283611141565b600080516020611a2583398151915261098581610d11565b610514610e45565b6000918252602082815260408084206001600160a01b0393909316845291905290205460ff1690565b60606003805480602002602001604051908101604052809291908181526020018280548015610a0e57602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116109f0575b5050505050905090565b60007fd32fd1ee5f4f111da6f27444787e5200ec57a8849509c00ef2998467052b32a3610a4481610d11565b610a4f858585610d03565b610a5c5760009150610a67565b61061b85858561119f565b509392505050565b60606002805480602002602001604051908101604052809291908181526020018280548015610a0e576020028201919060005260206000209081546001600160a01b031681526001909101906020018083116109f0575050505050905090565b600080516020611a25833981519152610ae781610d11565b610af2600383611274565b6040516001600160a01b038316907f60305ce6c9104acd0969d358f926bf391174340660aaf5e6215261fd6847bf4690600090a25050565b600080610b38858585610be9565b60ff1614949350505050565b600080516020611a25833981519152610b5c81610d11565b60035415610b6c57610b6c610d22565b610b768383610eca565b61064b60038484611544565b6000600382815481106106ec576106ec611813565b600080516020611a25833981519152610baf81610d11565b610af2600283611274565b600080516020611a25833981519152610bd281610d11565b6106d28383611320565b6000610548600383611141565b600080610bf785858561054e565b905060ff811615610c0957905061061f565b60035460005b81811015610cd157600060038281548110610c2c57610c2c611813565b60009182526020909120015460405163d4ce141560e01b81526001600160a01b038a811660048301528981166024830152604482018990529091169063d4ce141590606401602060405180830381865afa158015610c8e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cb29190611829565b905060ff811615610cc857935061061f92505050565b50600101610c0f565b5060009695505050505050565b600082815260208190526040902060010154610cf981610d11565b61064b8383611074565b600080610b3885858561054e565b61051481610d1d611065565b61132c565b6003546000905b8015610d7657600181039150610d6660038381548110610d4b57610d4b611813565b6000918252602090912001546001600160a01b031683611320565b610d6f81611941565b9050610d29565b507f93dd3e43e4773b52a627c0ce6a20183638a2d2a264cfc9b6b7da0cccc95ea4b26003604051610da79190611958565b60405180910390a150565b6000610dbe838361098d565b610e3d576000838152602081815260408083206001600160a01b03861684529091529020805460ff19166001179055610df5611065565b6001600160a01b0316826001600160a01b0316847f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a4506001610548565b506000610548565b6002546000905b8015610e9957600181039150610e8960028381548110610e6e57610e6e611813565b6000918252602090912001546001600160a01b0316836110fd565b610e9281611941565b9050610e4c565b507f93dd3e43e4773b52a627c0ce6a20183638a2d2a264cfc9b6b7da0cccc95ea4b26002604051610da79190611958565b6000819003610eec57604051630b9b3e5960e21b815260040160405180910390fd5b60005b818110156106d2576000838383818110610f0b57610f0b611813565b9050602002016020810190610f209190611726565b6001600160a01b031603610f47576040516350092f7560e11b815260040160405180910390fd5b60016000848484818110610f5d57610f5d611813565b9050602002016020810190610f729190611726565b6001600160a01b0316815260208101919091526040016000205460ff1615610fad5760405163860d015160e01b815260040160405180910390fd5b6001806000858585818110610fc457610fc4611813565b9050602002016020810190610fd99190611726565b6001600160a01b031681526020810191909152604001600020805460ff191691151591909117905582828281811061101357611013611813565b90506020020160208101906110289190611726565b6001600160a01b03167f60305ce6c9104acd0969d358f926bf391174340660aaf5e6215261fd6847bf4660405160405180910390a2600101610eef565b600061106f61136d565b905090565b6000611080838361098d565b15610e3d576000838152602081815260408083206001600160a01b03861684529091529020805460ff191690556110b5611065565b6001600160a01b0316826001600160a01b0316847ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a4506001610548565b611109600283836113e2565b6040516001600160a01b038316907f6d83315c9718799346b67584ec64301b1457e989c8e35a8e2982a7776c04bfc490600090a25050565b81546000905b8082101561119657826001600160a01b031684838154811061116b5761116b611813565b6000918252602090912001546001600160a01b03160361118b5750610548565b816001019150611147565b50509054919050565b600354600090815b81811015611268576000600382815481106111c4576111c4611813565b60009182526020909120015460405163601c446160e11b81526001600160a01b0389811660048301528881166024830152604482018890529091169063c03888c2906064016020604051808303816000875af1158015611228573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061124c9190611846565b90508061125f576000935050505061061f565b506001016111a7565b50600195945050505050565b6001600160a01b03811661129b576040516350092f7560e11b815260040160405180910390fd5b6001600160a01b03811660009081526001602052604090205460ff16156112d55760405163860d015160e01b815260040160405180910390fd5b8154600181810184556000938452602080852090920180546001600160a01b039094166001600160a01b0319909416841790559183528190526040909120805460ff19169091179055565b611109600383836113e2565b611336828261098d565b6113695760405163e2517d3f60e01b81526001600160a01b03821660048201526024810183905260440160405180910390fd5b5050565b6000366014336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161480156113aa5750808210155b156113da576000366113bc838561199c565b6113c79282906119af565b6113d0916119d9565b60601c9250505090565b339250505090565b816001600160a01b03168382815481106113fe576113fe611813565b6000918252602090912001546001600160a01b03161461143157604051632f64842d60e11b815260040160405180910390fd5b825461143f9060019061199c565b81146114c457825483906114559060019061199c565b8154811061146557611465611813565b9060005260206000200160009054906101000a90046001600160a01b031683828154811061149557611495611813565b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b031602179055505b828054806114d4576114d4611a0e565b60008281526020808220830160001990810180546001600160a01b03191690559092019092556001600160a01b03841680835260019091526040808320805460ff191690555190917f6d83315c9718799346b67584ec64301b1457e989c8e35a8e2982a7776c04bfc491a2505050565b828054828255906000526020600020908101928215611597579160200282015b828111156115975781546001600160a01b0319166001600160a01b03843516178255602090920191600190910190611564565b506115a39291506115a7565b5090565b5b808211156115a357600081556001016115a8565b6000602082840312156115ce57600080fd5b81356001600160e01b03198116811461061f57600080fd5b6000602082840312156115f857600080fd5b5035919050565b6001600160a01b038116811461051457600080fd5b60008060006060848603121561162957600080fd5b8335611634816115ff565b92506020840135611644816115ff565b929592945050506040919091013590565b6000806040838503121561166857600080fd5b82359150602083013561167a816115ff565b809150509250929050565b6000806020838503121561169857600080fd5b823567ffffffffffffffff808211156116b057600080fd5b818501915085601f8301126116c457600080fd5b8135818111156116d357600080fd5b8660208260051b85010111156116e857600080fd5b60209290920196919550909350505050565b6000806040838503121561170d57600080fd5b8235611718816115ff565b946020939093013593505050565b60006020828403121561173857600080fd5b813561061f816115ff565b60ff8116811461051457600080fd5b60006020828403121561176457600080fd5b813561061f81611743565b60005b8381101561178a578181015183820152602001611772565b50506000910152565b60208152600082518060208401526117b281604085016020870161176f565b601f01601f19169190910160400192915050565b6020808252825182820181905260009190848201906040850190845b818110156118075783516001600160a01b0316835292840192918401916001016117e2565b50909695505050505050565b634e487b7160e01b600052603260045260246000fd5b60006020828403121561183b57600080fd5b815161061f81611743565b60006020828403121561185857600080fd5b8151801515811461061f57600080fd5b634e487b7160e01b600052604160045260246000fd5b60006020828403121561189057600080fd5b815167ffffffffffffffff808211156118a857600080fd5b818401915084601f8301126118bc57600080fd5b8151818111156118ce576118ce611868565b604051601f8201601f19908116603f011681019083821181831017156118f6576118f6611868565b8160405282815287602084870101111561190f57600080fd5b61192083602083016020880161176f565b979650505050505050565b634e487b7160e01b600052601160045260246000fd5b6000816119505761195061192b565b506000190190565b6020808252825482820181905260008481528281209092916040850190845b818110156118075783546001600160a01b031683526001938401939285019201611977565b818103818111156105485761054861192b565b600080858511156119bf57600080fd5b838611156119cc57600080fd5b5050820193919092039150565b6bffffffffffffffffffffffff198135818116916014851015611a065780818660140360031b1b83161692505b505092915050565b634e487b7160e01b600052603160045260246000fdfeb3c151d85eb431da97012a1682e6ab41bddc7db1012e7c40bd326c24bf56f999a264697066735822122001e96293b791a1cb7a365e53c8a2381e86a2d2227bf7299377f4ae8437a930e364736f6c63430008160033",
+  "deployedBytecode": {
+    "object": "0x608060405234801561001057600080fd5b50600436106101fa5760003560e01c80638a1b6c8e1161011a578063c6946a12116100ad578063ce29ed351161007c578063ce29ed3514610495578063d0e835f2146104a8578063d4ce1415146104bb578063d547741f146104ce578063eb2647e3146104e157600080fd5b8063c6946a1214610449578063ca1f6c4d1461045c578063ca3e16e71461046f578063cd1d4dc71461048257600080fd5b8063a39eda14116100e9578063a39eda1414610406578063c03888c21461041b578063c57086a11461042e578063c68a651a1461043657600080fd5b80638a1b6c8e146103db5780638a2021b1146103e357806391d14854146103eb578063a217fddf146103fe57600080fd5b806336568abe116101925780636728f545116101615780636728f5451461036d5780637da0a877146103825780637f4ab1dd146103a857806383304df0146103c857600080fd5b806336568abe146102dc578063397a7d3c146102ef5780634d53374e1461031a578063572b6c051461032d57600080fd5b806328aa67bc116101ce57806328aa67bc146102895780632f2ff15d146102ae578063323a4616146102c1578063334a29cc146102c957600080fd5b80621582f7146101ff57806301ffc9a7146102095780630fbbfb5514610231578063248a9ca314610266575b600080fd5b6102076104f4565b005b61021c6102173660046115bc565b610517565b60405190151581526020015b60405180910390f35b6102587fd32fd1ee5f4f111da6f27444787e5200ec57a8849509c00ef2998467052b32a381565b604051908152602001610228565b6102586102743660046115e6565b60009081526020819052604090206001015490565b61029c610297366004611614565b61054e565b60405160ff9091168152602001610228565b6102076102bc366004611655565b610626565b600354610258565b6102076102d7366004611685565b610651565b6102076102ea366004611655565b61068f565b6103026102fd3660046115e6565b6106d7565b6040516001600160a01b039091168152602001610228565b6102076103283660046116fa565b610707565b61021c61033b366004611726565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0390811691161490565b610258600080516020611a2583398151915281565b7f0000000000000000000000000000000000000000000000000000000000000000610302565b6103bb6103b6366004611752565b610729565b6040516102289190611793565b6102586103d6366004611726565b610960565b61020761096d565b600254610258565b61021c6103f9366004611655565b61098d565b610258600081565b61040e6109b6565b60405161022891906117c6565b61021c610429366004611614565b610a18565b61040e610a6f565b610207610444366004611726565b610acf565b61021c610457366004611614565b610b2a565b61020761046a366004611685565b610b44565b61030261047d3660046115e6565b610b82565b610207610490366004611726565b610b97565b6102076104a33660046116fa565b610bba565b6102586104b6366004611726565b610bdc565b61029c6104c9366004611614565b610be9565b6102076104dc366004611655565b610cde565b61021c6104ef366004611614565b610d03565b600080516020611a2583398151915261050c81610d11565b610514610d22565b50565b60006001600160e01b03198216637965db0b60e01b148061054857506301ffc9a760e01b6001600160e01b03198316145b92915050565b600254600090815b818110156106175760006002828154811061057357610573611813565b60009182526020909120015460405163d4ce141560e01b81526001600160a01b0389811660048301528881166024830152604482018890529091169063d4ce141590606401602060405180830381865afa1580156105d5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105f99190611829565b905060ff81161561060e57925061061f915050565b50600101610556565b5060005b9150505b9392505050565b60008281526020819052604090206001015461064181610d11565b61064b8383610db2565b50505050565b600080516020611a2583398151915261066981610d11565b6002541561067957610679610e45565b6106838383610eca565b61064b60028484611544565b610697611065565b6001600160a01b0316816001600160a01b0316146106c85760405163334bd91960e11b815260040160405180910390fd5b6106d28282611074565b505050565b6000600282815481106106ec576106ec611813565b6000918252602090912001546001600160a01b031692915050565b600080516020611a2583398151915261071f81610d11565b6106d283836110fd565b60025460609060005b81811015610869576002818154811061074d5761074d611813565b600091825260209091200154604051633e822efb60e11b815260ff861660048201526001600160a01b0390911690637d045df690602401602060405180830381865afa1580156107a1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107c59190611846565b1561086157600281815481106107dd576107dd611813565b600091825260209091200154604051637f4ab1dd60e01b815260ff861660048201526001600160a01b0390911690637f4ab1dd90602401600060405180830381865afa158015610831573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610859919081019061187e565b949350505050565b600101610732565b505060035460005b81811015610924576003818154811061088c5761088c611813565b600091825260209091200154604051633e822efb60e11b815260ff861660048201526001600160a01b0390911690637d045df690602401602060405180830381865afa1580156108e0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109049190611846565b1561091c57600381815481106107dd576107dd611813565b600101610871565b505060408051808201909152601881527f556e6b6e6f776e207265737472696374696f6e20636f64650000000000000000602082015292915050565b6000610548600283611141565b600080516020611a2583398151915261098581610d11565b610514610e45565b6000918252602082815260408084206001600160a01b0393909316845291905290205460ff1690565b60606003805480602002602001604051908101604052809291908181526020018280548015610a0e57602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116109f0575b5050505050905090565b60007fd32fd1ee5f4f111da6f27444787e5200ec57a8849509c00ef2998467052b32a3610a4481610d11565b610a4f858585610d03565b610a5c5760009150610a67565b61061b85858561119f565b509392505050565b60606002805480602002602001604051908101604052809291908181526020018280548015610a0e576020028201919060005260206000209081546001600160a01b031681526001909101906020018083116109f0575050505050905090565b600080516020611a25833981519152610ae781610d11565b610af2600383611274565b6040516001600160a01b038316907f60305ce6c9104acd0969d358f926bf391174340660aaf5e6215261fd6847bf4690600090a25050565b600080610b38858585610be9565b60ff1614949350505050565b600080516020611a25833981519152610b5c81610d11565b60035415610b6c57610b6c610d22565b610b768383610eca565b61064b60038484611544565b6000600382815481106106ec576106ec611813565b600080516020611a25833981519152610baf81610d11565b610af2600283611274565b600080516020611a25833981519152610bd281610d11565b6106d28383611320565b6000610548600383611141565b600080610bf785858561054e565b905060ff811615610c0957905061061f565b60035460005b81811015610cd157600060038281548110610c2c57610c2c611813565b60009182526020909120015460405163d4ce141560e01b81526001600160a01b038a811660048301528981166024830152604482018990529091169063d4ce141590606401602060405180830381865afa158015610c8e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cb29190611829565b905060ff811615610cc857935061061f92505050565b50600101610c0f565b5060009695505050505050565b600082815260208190526040902060010154610cf981610d11565b61064b8383611074565b600080610b3885858561054e565b61051481610d1d611065565b61132c565b6003546000905b8015610d7657600181039150610d6660038381548110610d4b57610d4b611813565b6000918252602090912001546001600160a01b031683611320565b610d6f81611941565b9050610d29565b507f93dd3e43e4773b52a627c0ce6a20183638a2d2a264cfc9b6b7da0cccc95ea4b26003604051610da79190611958565b60405180910390a150565b6000610dbe838361098d565b610e3d576000838152602081815260408083206001600160a01b03861684529091529020805460ff19166001179055610df5611065565b6001600160a01b0316826001600160a01b0316847f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a4506001610548565b506000610548565b6002546000905b8015610e9957600181039150610e8960028381548110610e6e57610e6e611813565b6000918252602090912001546001600160a01b0316836110fd565b610e9281611941565b9050610e4c565b507f93dd3e43e4773b52a627c0ce6a20183638a2d2a264cfc9b6b7da0cccc95ea4b26002604051610da79190611958565b6000819003610eec57604051630b9b3e5960e21b815260040160405180910390fd5b60005b818110156106d2576000838383818110610f0b57610f0b611813565b9050602002016020810190610f209190611726565b6001600160a01b031603610f47576040516350092f7560e11b815260040160405180910390fd5b60016000848484818110610f5d57610f5d611813565b9050602002016020810190610f729190611726565b6001600160a01b0316815260208101919091526040016000205460ff1615610fad5760405163860d015160e01b815260040160405180910390fd5b6001806000858585818110610fc457610fc4611813565b9050602002016020810190610fd99190611726565b6001600160a01b031681526020810191909152604001600020805460ff191691151591909117905582828281811061101357611013611813565b90506020020160208101906110289190611726565b6001600160a01b03167f60305ce6c9104acd0969d358f926bf391174340660aaf5e6215261fd6847bf4660405160405180910390a2600101610eef565b600061106f61136d565b905090565b6000611080838361098d565b15610e3d576000838152602081815260408083206001600160a01b03861684529091529020805460ff191690556110b5611065565b6001600160a01b0316826001600160a01b0316847ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a4506001610548565b611109600283836113e2565b6040516001600160a01b038316907f6d83315c9718799346b67584ec64301b1457e989c8e35a8e2982a7776c04bfc490600090a25050565b81546000905b8082101561119657826001600160a01b031684838154811061116b5761116b611813565b6000918252602090912001546001600160a01b03160361118b5750610548565b816001019150611147565b50509054919050565b600354600090815b81811015611268576000600382815481106111c4576111c4611813565b60009182526020909120015460405163601c446160e11b81526001600160a01b0389811660048301528881166024830152604482018890529091169063c03888c2906064016020604051808303816000875af1158015611228573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061124c9190611846565b90508061125f576000935050505061061f565b506001016111a7565b50600195945050505050565b6001600160a01b03811661129b576040516350092f7560e11b815260040160405180910390fd5b6001600160a01b03811660009081526001602052604090205460ff16156112d55760405163860d015160e01b815260040160405180910390fd5b8154600181810184556000938452602080852090920180546001600160a01b039094166001600160a01b0319909416841790559183528190526040909120805460ff19169091179055565b611109600383836113e2565b611336828261098d565b6113695760405163e2517d3f60e01b81526001600160a01b03821660048201526024810183905260440160405180910390fd5b5050565b6000366014336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161480156113aa5750808210155b156113da576000366113bc838561199c565b6113c79282906119af565b6113d0916119d9565b60601c9250505090565b339250505090565b816001600160a01b03168382815481106113fe576113fe611813565b6000918252602090912001546001600160a01b03161461143157604051632f64842d60e11b815260040160405180910390fd5b825461143f9060019061199c565b81146114c457825483906114559060019061199c565b8154811061146557611465611813565b9060005260206000200160009054906101000a90046001600160a01b031683828154811061149557611495611813565b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b031602179055505b828054806114d4576114d4611a0e565b60008281526020808220830160001990810180546001600160a01b03191690559092019092556001600160a01b03841680835260019091526040808320805460ff191690555190917f6d83315c9718799346b67584ec64301b1457e989c8e35a8e2982a7776c04bfc491a2505050565b828054828255906000526020600020908101928215611597579160200282015b828111156115975781546001600160a01b0319166001600160a01b03843516178255602090920191600190910190611564565b506115a39291506115a7565b5090565b5b808211156115a357600081556001016115a8565b6000602082840312156115ce57600080fd5b81356001600160e01b03198116811461061f57600080fd5b6000602082840312156115f857600080fd5b5035919050565b6001600160a01b038116811461051457600080fd5b60008060006060848603121561162957600080fd5b8335611634816115ff565b92506020840135611644816115ff565b929592945050506040919091013590565b6000806040838503121561166857600080fd5b82359150602083013561167a816115ff565b809150509250929050565b6000806020838503121561169857600080fd5b823567ffffffffffffffff808211156116b057600080fd5b818501915085601f8301126116c457600080fd5b8135818111156116d357600080fd5b8660208260051b85010111156116e857600080fd5b60209290920196919550909350505050565b6000806040838503121561170d57600080fd5b8235611718816115ff565b946020939093013593505050565b60006020828403121561173857600080fd5b813561061f816115ff565b60ff8116811461051457600080fd5b60006020828403121561176457600080fd5b813561061f81611743565b60005b8381101561178a578181015183820152602001611772565b50506000910152565b60208152600082518060208401526117b281604085016020870161176f565b601f01601f19169190910160400192915050565b6020808252825182820181905260009190848201906040850190845b818110156118075783516001600160a01b0316835292840192918401916001016117e2565b50909695505050505050565b634e487b7160e01b600052603260045260246000fd5b60006020828403121561183b57600080fd5b815161061f81611743565b60006020828403121561185857600080fd5b8151801515811461061f57600080fd5b634e487b7160e01b600052604160045260246000fd5b60006020828403121561189057600080fd5b815167ffffffffffffffff808211156118a857600080fd5b818401915084601f8301126118bc57600080fd5b8151818111156118ce576118ce611868565b604051601f8201601f19908116603f011681019083821181831017156118f6576118f6611868565b8160405282815287602084870101111561190f57600080fd5b61192083602083016020880161176f565b979650505050505050565b634e487b7160e01b600052601160045260246000fd5b6000816119505761195061192b565b506000190190565b6020808252825482820181905260008481528281209092916040850190845b818110156118075783546001600160a01b031683526001938401939285019201611977565b818103818111156105485761054861192b565b600080858511156119bf57600080fd5b838611156119cc57600080fd5b5050820193919092039150565b6bffffffffffffffffffffffff198135818116916014851015611a065780818660140360031b1b83161692505b505092915050565b634e487b7160e01b600052603160045260246000fdfeb3c151d85eb431da97012a1682e6ab41bddc7db1012e7c40bd326c24bf56f999a264697066735822122001e96293b791a1cb7a365e53c8a2381e86a2d2227bf7299377f4ae8437a930e364736f6c63430008160033",
+    "sourceMap": "323:5144:84:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1001:113:91;;;:::i;:::-;;2565:202:62;;;;;;:::i;:::-;;:::i;:::-;;;470:14:139;;463:22;445:41;;433:2;418:18;2565:202:62;;;;;;;;802:86:90;;856:32;802:86;;;;;643:25:139;;;631:2;616:18;802:86:90;497:177:139;3810:120:62;;;;;;:::i;:::-;3875:7;3901:12;;;;;;;;;;:22;;;;3810:120;860:555:92;;;;;;:::i;:::-;;:::i;:::-;;;1633:4:139;1621:17;;;1603:36;;1591:2;1576:18;860:555:92;1461:184:139;4226:136:62;;;;;;:::i;:::-;;:::i;3255:118:91:-;3344:15;:22;3255:118;;797:280:93;;;;;;:::i;:::-;;:::i;5328:245:62:-;;;;;;:::i;:::-;;:::i;4051:143:93:-;;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;3121:32:139;;;3103:51;;3091:2;3076:18;4051:143:93;2957:203:139;2580:194:93;;;;;;:::i;:::-;;:::i;1830:137:66:-;;;;;;:::i;:::-;1705:17;-1:-1:-1;;;;;1929:31:66;;;;;;;1830:137;666:98:90;;-1:-1:-1;;;;;;;;;;;666:98:90;;1622:107:66;1705:17;1622:107;;2978:1092:84;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;3706:190:93:-;;;;;;:::i;:::-;;:::i;1163:115::-;;;:::i;3432:120::-;3522:16;:23;3432:120;;2854:136:62;;;;;;:::i;:::-;;:::i;2187:49::-;;2232:4;2187:49;;4097:151:91;;;:::i;:::-;;;;;;;:::i;4143:464:84:-;;;;;;:::i;:::-;;:::i;4282:153:93:-;;;:::i;1794:214:91:-;;;;;;:::i;:::-;;:::i;2502:272:84:-;;;;;;:::i;:::-;;:::i;648:267:91:-;;;;;;:::i;:::-;;:::i;3868:141::-;;;;;;:::i;:::-;;:::i;1963:217:93:-;;;;;;:::i;:::-;;:::i;2408:191:91:-;;;;;;:::i;:::-;;:::i;3526:187::-;;;;;;:::i;:::-;;:::i;1438:829:84:-;;;;;;:::i;:::-;;:::i;4642:138:62:-;;;;;;:::i;:::-;;:::i;1650:292:92:-;;;;;;:::i;:::-;;:::i;1001:113:91:-;-1:-1:-1;;;;;;;;;;;2464:16:62;2475:4;2464:10;:16::i;:::-;1085:22:91::1;:20;:22::i;:::-;1001:113:::0;:::o;2565:202:62:-;2650:4;-1:-1:-1;;;;;;2673:47:62;;-1:-1:-1;;;2673:47:62;;:87;;-1:-1:-1;;;;;;;;;;861:40:78;;;2724:36:62;2666:94;2565:202;-1:-1:-1;;2565:202:62:o;860:555:92:-;1049:16;:23;1010:5;;;1082:272;1106:11;1102:1;:15;1082:272;;;1138:17;1174:16;1191:1;1174:19;;;;;;;;:::i;:::-;;;;;;;;;;;1158:100;;-1:-1:-1;;;1158:100:92;;-1:-1:-1;;;;;6735:15:139;;;1158:100:92;;;6717:34:139;6787:15;;;6767:18;;;6760:43;6819:18;;;6812:34;;;1174:19:92;;;;1158:79;;6652:18:139;;1158:100:92;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;1138:120;-1:-1:-1;1276:15:92;;;;1272:72;;1318:11;-1:-1:-1;1311:18:92;;-1:-1:-1;;1311:18:92;1272:72;-1:-1:-1;1119:3:92;;1082:272;;;-1:-1:-1;1377:30:92;1371:37;1364:44;;;860:555;;;;;;:::o;4226:136:62:-;3875:7;3901:12;;;;;;;;;;:22;;;2464:16;2475:4;2464:10;:16::i;:::-;4330:25:::1;4341:4;4347:7;4330:10;:25::i;:::-;;4226:136:::0;;;:::o;797:280:93:-;-1:-1:-1;;;;;;;;;;;2464:16:62;2475:4;2464:10;:16::i;:::-;932::93::1;:23:::0;:27;928:81:::1;;975:23;:21;:23::i;:::-;1018:17;1028:6;;1018:9;:17::i;:::-;1045:25;:16;1064:6:::0;;1045:25:::1;:::i;5328:245:62:-:0;5443:12;:10;:12::i;:::-;-1:-1:-1;;;;;5421:34:62;:18;-1:-1:-1;;;;;5421:34:62;;5417:102;;5478:30;;-1:-1:-1;;;5478:30:62;;;;;;;;;;;5417:102;5529:37;5541:4;5547:18;5529:11;:37::i;:::-;;5328:245;;:::o;4051:143:93:-;4137:7;4163:16;4180:6;4163:24;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;4163:24:93;;4051:143;-1:-1:-1;;4051:143:93:o;2580:194::-;-1:-1:-1;;;;;;;;;;;2464:16:62;2475:4;2464:10;:16::i;:::-;2723:44:93::1;2753:5;2761;2723:21;:44::i;2978:1092:84:-:0;3156:16;:23;3087:13;;3134:19;3189:379;3213:11;3209:1;:15;3189:379;;;3282:16;3299:1;3282:19;;;;;;;;:::i;:::-;;;;;;;;;;;3266:108;;-1:-1:-1;;;3266:108:84;;1633:4:139;1621:17;;3266:108:84;;;1603:36:139;-1:-1:-1;;;;;3282:19:84;;;;3266:90;;1576:18:139;;3266:108:84;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;3245:313;;;3450:16;3467:1;3450:19;;;;;;;;:::i;:::-;;;;;;;;;;;3434:109;;-1:-1:-1;;;3434:109:84;;1633:4:139;1621:17;;3434:109:84;;;1603:36:139;-1:-1:-1;;;;;3450:19:84;;;;3434:91;;1576:18:139;;3434:109:84;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;3434:109:84;;;;;;;;;;;;:::i;:::-;3407:136;2978:1092;-1:-1:-1;;;;2978:1092:84:o;3245:313::-;3226:3;;3189:379;;;-1:-1:-1;;3612:15:84;:22;3649:9;3644:377;3668:11;3664:1;:15;3644:377;;;3737:15;3753:1;3737:18;;;;;;;;:::i;:::-;;;;;;;;;;;3721:107;;-1:-1:-1;;;3721:107:84;;1633:4:139;1621:17;;3721:107:84;;;1603:36:139;-1:-1:-1;;;;;3737:18:84;;;;3721:89;;1576:18:139;;3721:107:84;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;3700:311;;;3904:15;3920:1;3904:18;;;;;;;;:::i;3700:311::-;3681:3;;3644:377;;;-1:-1:-1;;4030:33:84;;;;;;;;;;;;;;;;;;2978:1092;-1:-1:-1;;2978:1092:84:o;3706:190:93:-;3798:13;3830:59;3856:16;3882:5;3830:25;:59::i;1163:115::-;-1:-1:-1;;;;;;;;;;;2464:16:62;2475:4;2464:10;:16::i;:::-;1248:23:93::1;:21;:23::i;2854:136:62:-:0;2931:4;2954:12;;;;;;;;;;;-1:-1:-1;;;;;2954:29:62;;;;;;;;;;;;;;;2854:136::o;4097:151:91:-;4187:16;4226:15;4219:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;4219:22:91;;;;;;;;;;;;;;;;;;;;;;;4097:151;:::o;4143:464:84:-;4299:12;856:32:90;2464:16:62;2475:4;2464:10;:16::i;:::-;4374:65:84::1;4422:4;4428:2;4432:6;4374:47;:65::i;:::-;4356:131;;4471:5;4464:12;;;;4356:131;4544:56;4583:4;4589:2;4593:6;4544:38;:56::i;2490:1:62:-;4143:464:84::0;;;;;;:::o;4282:153:93:-;4373:16;4412;4405:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;4405:23:93;;;;;;;;;;;;;;;;;;;;;;4282:153;:::o;1794:214:91:-;-1:-1:-1;;;;;;;;;;;2464:16:62;2475:4;2464:10;:16::i;:::-;1909:54:91::1;1931:15;1956:5;1909:21;:54::i;:::-;1978:23;::::0;-1:-1:-1;;;;;1978:23:91;::::1;::::0;::::1;::::0;;;::::1;1794:214:::0;;:::o;2502:272:84:-;2633:4;;2668:46;2694:5;2701:3;2706:7;2668:25;:46::i;:::-;:99;;;;2502:272;-1:-1:-1;;;;2502:272:84:o;648:267:91:-;-1:-1:-1;;;;;;;;;;;2464:16:62;2475:4;2464:10;:16::i;:::-;773:15:91::1;:22:::0;:26;769:79:::1;;815:22;:20;:22::i;:::-;857:17;867:6;;857:9;:17::i;:::-;884:24;:15;902:6:::0;;884:24:::1;:::i;3868:141::-:0;3953:7;3979:15;3995:6;3979:23;;;;;;;;:::i;1963:217:93:-;-1:-1:-1;;;;;;;;;;;2464:16:62;2475:4;2464:10;:16::i;:::-;2080:55:93::1;2102:16;2128:5;2080:21;:55::i;2408:191:91:-:0;-1:-1:-1;;;;;;;;;;;2464:16:62;2475:4;2464:10;:16::i;:::-;2549:43:91::1;2578:5;2586;2549:20;:43::i;3526:187::-:0;3616:13;3648:58;3674:15;3699:5;3648:25;:58::i;1438:829:84:-;1578:5;1617:10;1630:123;1700:5;1719:3;1736:7;1630:56;:123::i;:::-;1617:136;-1:-1:-1;1767:45:84;;;;1763:87;;1835:4;-1:-1:-1;1828:11:84;;1763:87;1903:15;:22;1881:19;1935:271;1959:11;1955:1;:15;1935:271;;;1991:17;2027:15;2043:1;2027:18;;;;;;;;:::i;:::-;;;;;;;;;;;2011:99;;-1:-1:-1;;;2011:99:84;;-1:-1:-1;;;;;6735:15:139;;;2011:99:84;;;6717:34:139;6787:15;;;6767:18;;;6760:43;6819:18;;;6812:34;;;2027:18:84;;;;2011:78;;6652:18:139;;2011:99:84;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;1991:119;-1:-1:-1;2128:15:84;;;;2124:72;;2170:11;-1:-1:-1;2163:18:84;;-1:-1:-1;;;2163:18:84;2124:72;-1:-1:-1;1972:3:84;;1935:271;;;-1:-1:-1;2229:30:84;2216:44;1438:829;-1:-1:-1;;;;;;1438:829:84:o;4642:138:62:-;3875:7;3901:12;;;;;;;;;;:22;;;2464:16;2475:4;2464:10;:16::i;:::-;4747:26:::1;4759:4;4765:7;4747:11;:26::i;1650:292:92:-:0;1791:4;;1826:56;1862:5;1869:3;1874:7;1826:35;:56::i;3199:103:62:-;3265:30;3276:4;3282:12;:10;:12::i;:::-;3265:10;:30::i;1200:439:91:-;1363:15;:22;1251:13;;1346:245;1387:5;;1346:245;;1500:1;1496;:5;1488:13;;1529:51;1550:15;1566:5;1550:22;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;1550:22:91;1574:5;1529:20;:51::i;:::-;1394:3;;;:::i;:::-;;;1346:245;;;;1605:27;1616:15;1605:27;;;;;;:::i;:::-;;;;;;;;1241:398;1200:439::o;6179:316:62:-;6256:4;6277:22;6285:4;6291:7;6277;:22::i;:::-;6272:217;;6315:6;:12;;;;;;;;;;;-1:-1:-1;;;;;6315:29:62;;;;;;;;;:36;;-1:-1:-1;;6315:36:62;6347:4;6315:36;;;6397:12;:10;:12::i;:::-;-1:-1:-1;;;;;6370:40:62;6388:7;-1:-1:-1;;;;;6370:40:62;6382:4;6370:40;;;;;;;;;;-1:-1:-1;6431:4:62;6424:11;;6272:217;-1:-1:-1;6473:5:62;6466:12;;1364:444:93;1528:16;:23;1416:13;;1511:248;1553:5;;1511:248;;1666:1;1662;:5;1654:13;;1695:53;1717:16;1734:5;1717:23;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;1717:23:93;1742:5;1695:21;:53::i;:::-;1560:3;;;:::i;:::-;;;1511:248;;;;1773:28;1784:16;1773:28;;;;;;:::i;596:600:94:-;682:1;665:18;;;661:81;;706:25;;-1:-1:-1;;;706:25:94;;;;;;;;;;;661:81;756:9;751:439;771:17;;;751:439;;;840:3;818:6;;825:1;818:9;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;810:34:94;;806:118;;871:38;;-1:-1:-1;;;871:38:94;;;;;;;;;;;806:118;941:14;:25;956:6;;963:1;956:9;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;941:25:94;;;;;;;;;;;;-1:-1:-1;941:25:94;;;;937:101;;;993:30;;-1:-1:-1;;;993:30:94;;;;;;;;;;;937:101;1079:4;1051:14;:25;1066:6;;1073:1;1066:9;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;1051:25:94;;;;;;;;;;;;-1:-1:-1;1051:25:94;:32;;-1:-1:-1;;1051:32:94;;;;;;;;;;1110:6;;1117:1;1110:9;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;1102:18:94;;;;;;;;;;;1162:3;;751:439;;4708:182:84;4819:14;4856:27;:25;:27::i;:::-;4849:34;;4708:182;:::o;6730:317:62:-;6808:4;6828:22;6836:4;6842:7;6828;:22::i;:::-;6824:217;;;6898:5;6866:12;;;;;;;;;;;-1:-1:-1;;;;;6866:29:62;;;;;;;;;:37;;-1:-1:-1;;6866:37:62;;;6949:12;:10;:12::i;:::-;-1:-1:-1;;;;;6922:40:62;6940:7;-1:-1:-1;;;;;6922:40:62;6934:4;6922:40;;;;;;;;;;-1:-1:-1;6983:4:62;6976:11;;3174:184:93;3254:56;3279:16;3297:5;3304;3254:24;:56::i;:::-;3325:26;;-1:-1:-1;;;;;3325:26:93;;;;;;;;3174:184;;:::o;2668:413:94:-;2823:13;;2776;;2846:199;2870:11;2862:5;:19;2846:199;;;2920:5;-1:-1:-1;;;;;2903:22:94;:6;2910:5;2903:13;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;2903:13:94;:22;2899:73;;2945:12;;;2899:73;3013:7;;;;;2846:199;;;-1:-1:-1;;3061:13:94;;;2668:413;-1:-1:-1;2668:413:94:o;4473:513:91:-;4640:15;:22;4594:12;;;4672:287;4696:11;4692:1;:15;4672:287;;;4728:11;4757:15;4773:1;4757:18;;;;;;;;:::i;:::-;;;;;;;;;;;4742:135;;-1:-1:-1;;;4742:135:91;;-1:-1:-1;;;;;6735:15:139;;;4742:135:91;;;6717:34:139;6787:15;;;6767:18;;;6760:43;6819:18;;;6812:34;;;4757:18:91;;;;4742:52;;6652:18:139;;4742:135:91;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;4728:149;;4896:6;4891:58;;4929:5;4922:12;;;;;;;4891:58;-1:-1:-1;4709:3:91;;4672:287;;;-1:-1:-1;4975:4:91;;4473:513;-1:-1:-1;;;;;4473:513:91:o;1351:354:94:-;-1:-1:-1;;;;;1433:30:94;;1429:106;;1486:38;;-1:-1:-1;;;1486:38:94;;;;;;;;;;;1429:106;-1:-1:-1;;;;;1548:21:94;;;;;;:14;:21;;;;;;;;1544:89;;;1592:30;;-1:-1:-1;;;1592:30:94;;;;;;;;;;;1544:89;1642:18;;;;;;;;-1:-1:-1;1642:18:94;;;;;;;;;;;;-1:-1:-1;;;;;1642:18:94;;;-1:-1:-1;;;;;;1642:18:94;;;;;;;1670:21;;;;;;;;;;:28;;-1:-1:-1;;1670:28:94;;;;;;1351:354::o;2999:182:91:-;3078:55;3103:15;3120:5;3127;3078:24;:55::i;3432:197:62:-;3520:22;3528:4;3534:7;3520;:22::i;:::-;3515:108;;3565:47;;-1:-1:-1;;;3565:47:62;;-1:-1:-1;;;;;9708:32:139;;3565:47:62;;;9690:51:139;9757:18;;;9750:34;;;9663:18;;3565:47:62;;;;;;;3515:108;3432:197;;:::o;2204:429:66:-;2266:7;2310:8;3481:2;2420:10;-1:-1:-1;;;;;1705:17:66;1929:31;;2401:71;;;;;2453:19;2435:14;:37;;2401:71;2397:230;;;2511:8;;2520:36;2537:19;2520:14;:36;:::i;:::-;2511:47;;;;;:::i;:::-;2503:56;;;:::i;:::-;2495:65;;2488:72;;;;2204:429;:::o;2397:230::-;735:10:73;2591:25:66;;;;2204:429;:::o;2105:419:94:-;2252:5;-1:-1:-1;;;;;2235:22:94;:6;2242:5;2235:13;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;2235:13:94;:22;2231:87;;2280:27;;-1:-1:-1;;;2280:27:94;;;;;;;;;;;2231:87;2340:13;;:17;;2356:1;;2340:17;:::i;:::-;2331:5;:26;2327:98;;2396:13;;2389:6;;2396:17;;2412:1;;2396:17;:::i;:::-;2389:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;2389:25:94;2373:6;2380:5;2373:13;;;;;;;;:::i;:::-;;;;;;;;;:41;;;;;-1:-1:-1;;;;;2373:41:94;;;;;-1:-1:-1;;;;;2373:41:94;;;;;;2327:98;2434:6;:12;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;2434:12:94;;;;;-1:-1:-1;;;;;;2434:12:94;;;;;;;;;-1:-1:-1;;;;;2456:21:94;;;;;2434:12;2456:21;;;;;;;:29;;-1:-1:-1;;2456:29:94;;;2500:17;2456:21;;2500:17;;;2105:419;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:286:139;72:6;125:2;113:9;104:7;100:23;96:32;93:52;;;141:1;138;131:12;93:52;167:23;;-1:-1:-1;;;;;;219:32:139;;209:43;;199:71;;266:1;263;256:12;679:180;738:6;791:2;779:9;770:7;766:23;762:32;759:52;;;807:1;804;797:12;759:52;-1:-1:-1;830:23:139;;679:180;-1:-1:-1;679:180:139:o;864:131::-;-1:-1:-1;;;;;939:31:139;;929:42;;919:70;;985:1;982;975:12;1000:456;1077:6;1085;1093;1146:2;1134:9;1125:7;1121:23;1117:32;1114:52;;;1162:1;1159;1152:12;1114:52;1201:9;1188:23;1220:31;1245:5;1220:31;:::i;:::-;1270:5;-1:-1:-1;1327:2:139;1312:18;;1299:32;1340:33;1299:32;1340:33;:::i;:::-;1000:456;;1392:7;;-1:-1:-1;;;1446:2:139;1431:18;;;;1418:32;;1000:456::o;1650:315::-;1718:6;1726;1779:2;1767:9;1758:7;1754:23;1750:32;1747:52;;;1795:1;1792;1785:12;1747:52;1831:9;1818:23;1808:33;;1891:2;1880:9;1876:18;1863:32;1904:31;1929:5;1904:31;:::i;:::-;1954:5;1944:15;;;1650:315;;;;;:::o;2152:615::-;2238:6;2246;2299:2;2287:9;2278:7;2274:23;2270:32;2267:52;;;2315:1;2312;2305:12;2267:52;2355:9;2342:23;2384:18;2425:2;2417:6;2414:14;2411:34;;;2441:1;2438;2431:12;2411:34;2479:6;2468:9;2464:22;2454:32;;2524:7;2517:4;2513:2;2509:13;2505:27;2495:55;;2546:1;2543;2536:12;2495:55;2586:2;2573:16;2612:2;2604:6;2601:14;2598:34;;;2628:1;2625;2618:12;2598:34;2681:7;2676:2;2666:6;2663:1;2659:14;2655:2;2651:23;2647:32;2644:45;2641:65;;;2702:1;2699;2692:12;2641:65;2733:2;2725:11;;;;;2755:6;;-1:-1:-1;2152:615:139;;-1:-1:-1;;;;2152:615:139:o;3165:340::-;3258:6;3266;3319:2;3307:9;3298:7;3294:23;3290:32;3287:52;;;3335:1;3332;3325:12;3287:52;3374:9;3361:23;3393:31;3418:5;3393:31;:::i;:::-;3443:5;3495:2;3480:18;;;;3467:32;;-1:-1:-1;;;3165:340:139:o;3510:247::-;3569:6;3622:2;3610:9;3601:7;3597:23;3593:32;3590:52;;;3638:1;3635;3628:12;3590:52;3677:9;3664:23;3696:31;3721:5;3696:31;:::i;3762:114::-;3846:4;3839:5;3835:16;3828:5;3825:27;3815:55;;3866:1;3863;3856:12;3881:243;3938:6;3991:2;3979:9;3970:7;3966:23;3962:32;3959:52;;;4007:1;4004;3997:12;3959:52;4046:9;4033:23;4065:29;4088:5;4065:29;:::i;4129:250::-;4214:1;4224:113;4238:6;4235:1;4232:13;4224:113;;;4314:11;;;4308:18;4295:11;;;4288:39;4260:2;4253:10;4224:113;;;-1:-1:-1;;4371:1:139;4353:16;;4346:27;4129:250::o;4384:396::-;4533:2;4522:9;4515:21;4496:4;4565:6;4559:13;4608:6;4603:2;4592:9;4588:18;4581:34;4624:79;4696:6;4691:2;4680:9;4676:18;4671:2;4663:6;4659:15;4624:79;:::i;:::-;4764:2;4743:15;-1:-1:-1;;4739:29:139;4724:45;;;;4771:2;4720:54;;4384:396;-1:-1:-1;;4384:396:139:o;5062:658::-;5233:2;5285:21;;;5355:13;;5258:18;;;5377:22;;;5204:4;;5233:2;5456:15;;;;5430:2;5415:18;;;5204:4;5499:195;5513:6;5510:1;5507:13;5499:195;;;5578:13;;-1:-1:-1;;;;;5574:39:139;5562:52;;5669:15;;;;5634:12;;;;5610:1;5528:9;5499:195;;;-1:-1:-1;5711:3:139;;5062:658;-1:-1:-1;;;;;;5062:658:139:o;6345:127::-;6406:10;6401:3;6397:20;6394:1;6387:31;6437:4;6434:1;6427:15;6461:4;6458:1;6451:15;6857:247;6925:6;6978:2;6966:9;6957:7;6953:23;6949:32;6946:52;;;6994:1;6991;6984:12;6946:52;7026:9;7020:16;7045:29;7068:5;7045:29;:::i;7241:277::-;7308:6;7361:2;7349:9;7340:7;7336:23;7332:32;7329:52;;;7377:1;7374;7367:12;7329:52;7409:9;7403:16;7462:5;7455:13;7448:21;7441:5;7438:32;7428:60;;7484:1;7481;7474:12;7523:127;7584:10;7579:3;7575:20;7572:1;7565:31;7615:4;7612:1;7605:15;7639:4;7636:1;7629:15;7655:897;7735:6;7788:2;7776:9;7767:7;7763:23;7759:32;7756:52;;;7804:1;7801;7794:12;7756:52;7837:9;7831:16;7866:18;7907:2;7899:6;7896:14;7893:34;;;7923:1;7920;7913:12;7893:34;7961:6;7950:9;7946:22;7936:32;;8006:7;7999:4;7995:2;7991:13;7987:27;7977:55;;8028:1;8025;8018:12;7977:55;8057:2;8051:9;8079:2;8075;8072:10;8069:36;;;8085:18;;:::i;:::-;8160:2;8154:9;8128:2;8214:13;;-1:-1:-1;;8210:22:139;;;8234:2;8206:31;8202:40;8190:53;;;8258:18;;;8278:22;;;8255:46;8252:72;;;8304:18;;:::i;:::-;8344:10;8340:2;8333:22;8379:2;8371:6;8364:18;8419:7;8414:2;8409;8405;8401:11;8397:20;8394:33;8391:53;;;8440:1;8437;8430:12;8391:53;8453:68;8518:2;8513;8505:6;8501:15;8496:2;8492;8488:11;8453:68;:::i;:::-;8540:6;7655:897;-1:-1:-1;;;;;;;7655:897:139:o;8557:127::-;8618:10;8613:3;8609:20;8606:1;8599:31;8649:4;8646:1;8639:15;8673:4;8670:1;8663:15;8689:136;8728:3;8756:5;8746:39;;8765:18;;:::i;:::-;-1:-1:-1;;;8801:18:139;;8689:136::o;8830:681::-;8998:2;9050:21;;;9120:13;;9023:18;;;9142:22;;;8969:4;9207:17;;;9247:16;;;8969:4;;8998:2;9195;9180:18;;;8969:4;9291:194;9305:6;9302:1;9299:13;9291:194;;;9370:13;;-1:-1:-1;;;;;9366:39:139;9354:52;;9402:1;9461:14;;;;9426:12;;;;9320:9;9291:194;;9795:128;9862:9;;;9883:11;;;9880:37;;;9897:18;;:::i;9928:331::-;10033:9;10044;10086:8;10074:10;10071:24;10068:44;;;10108:1;10105;10098:12;10068:44;10137:6;10127:8;10124:20;10121:40;;;10157:1;10154;10147:12;10121:40;-1:-1:-1;;10183:23:139;;;10228:25;;;;;-1:-1:-1;9928:331:139:o;10264:337::-;-1:-1:-1;;10385:19:139;;10472:11;;;;10503:2;10495:11;;10492:103;;;10582:2;10576;10569:3;10565:2;10561:12;10558:1;10554:20;10550:29;10546:2;10542:38;10538:47;10529:56;;10492:103;;;10264:337;;;;:::o;10606:127::-;10667:10;10662:3;10658:20;10655:1;10648:31;10698:4;10695:1;10688:15;10722:4;10719:1;10712:15",
+    "linkReferences": {},
+    "immutableReferences": {
+      "54247": [
+        { "start": 829, "length": 32 },
+        { "start": 900, "length": 32 },
+        { "start": 4989, "length": 32 }
+      ]
+    }
+  },
+  "methodIdentifiers": {
+    "DEFAULT_ADMIN_ROLE()": "a217fddf",
+    "RULE_ENGINE_OPERATOR_ROLE()": "6728f545",
+    "TOKEN_CONTRACT_ROLE()": "0fbbfb55",
+    "addRuleOperation(address)": "c68a651a",
+    "addRuleValidation(address)": "cd1d4dc7",
+    "clearRulesOperation()": "001582f7",
+    "clearRulesValidation()": "8a1b6c8e",
+    "detectTransferRestriction(address,address,uint256)": "d4ce1415",
+    "detectTransferRestrictionValidation(address,address,uint256)": "28aa67bc",
+    "getRoleAdmin(bytes32)": "248a9ca3",
+    "getRuleIndexOperation(address)": "d0e835f2",
+    "getRuleIndexValidation(address)": "83304df0",
+    "grantRole(bytes32,address)": "2f2ff15d",
+    "hasRole(bytes32,address)": "91d14854",
+    "isTrustedForwarder(address)": "572b6c05",
+    "messageForTransferRestriction(uint8)": "7f4ab1dd",
+    "operateOnTransfer(address,address,uint256)": "c03888c2",
+    "removeRuleOperation(address,uint256)": "ce29ed35",
+    "removeRuleValidation(address,uint256)": "4d53374e",
+    "renounceRole(bytes32,address)": "36568abe",
+    "revokeRole(bytes32,address)": "d547741f",
+    "ruleOperation(uint256)": "ca3e16e7",
+    "ruleValidation(uint256)": "397a7d3c",
+    "rulesCountOperation()": "323a4616",
+    "rulesCountValidation()": "8a2021b1",
+    "rulesOperation()": "a39eda14",
+    "rulesValidation()": "c57086a1",
+    "setRulesOperation(address[])": "ca1f6c4d",
+    "setRulesValidation(address[])": "334a29cc",
+    "supportsInterface(bytes4)": "01ffc9a7",
+    "trustedForwarder()": "7da0a877",
+    "validateTransfer(address,address,uint256)": "c6946a12",
+    "validateTransferValidation(address,address,uint256)": "eb2647e3"
+  },
+  "rawMetadata": "{\"compiler\":{\"version\":\"0.8.22+commit.4fc1097e\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"admin\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"forwarderIrrevocable\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"tokenContract\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"AccessControlBadConfirmation\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"bytes32\",\"name\":\"neededRole\",\"type\":\"bytes32\"}],\"name\":\"AccessControlUnauthorizedAccount\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"RuleEngine_AdminWithAddressZeroNotAllowed\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"RuleEngine_ArrayIsEmpty\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"RuleEngine_RuleAddressZeroNotAllowed\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"RuleEngine_RuleAlreadyExists\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"RuleEngine_RuleDoNotMatch\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"RuleEngine_TransferInvalid\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"rule\",\"type\":\"address\"}],\"name\":\"AddRule\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address[]\",\"name\":\"rulesRemoved\",\"type\":\"address[]\"}],\"name\":\"ClearRules\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"rule\",\"type\":\"address\"}],\"name\":\"RemoveRule\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"previousAdminRole\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"newAdminRole\",\"type\":\"bytes32\"}],\"name\":\"RoleAdminChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"RoleGranted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"RoleRevoked\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"DEFAULT_ADMIN_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"RULE_ENGINE_OPERATOR_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"TOKEN_CONTRACT_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract IRuleOperation\",\"name\":\"rule_\",\"type\":\"address\"}],\"name\":\"addRuleOperation\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract IRuleValidation\",\"name\":\"rule_\",\"type\":\"address\"}],\"name\":\"addRuleValidation\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"clearRulesOperation\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"clearRulesValidation\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_amount\",\"type\":\"uint256\"}],\"name\":\"detectTransferRestriction\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_amount\",\"type\":\"uint256\"}],\"name\":\"detectTransferRestrictionValidation\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"}],\"name\":\"getRoleAdmin\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract IRuleOperation\",\"name\":\"rule_\",\"type\":\"address\"}],\"name\":\"getRuleIndexOperation\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract IRuleValidation\",\"name\":\"rule_\",\"type\":\"address\"}],\"name\":\"getRuleIndexValidation\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"grantRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"hasRole\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"forwarder\",\"type\":\"address\"}],\"name\":\"isTrustedForwarder\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint8\",\"name\":\"_restrictionCode\",\"type\":\"uint8\"}],\"name\":\"messageForTransferRestriction\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"operateOnTransfer\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"isValid\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract IRuleOperation\",\"name\":\"rule_\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"}],\"name\":\"removeRuleOperation\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract IRuleValidation\",\"name\":\"rule_\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"}],\"name\":\"removeRuleValidation\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"callerConfirmation\",\"type\":\"address\"}],\"name\":\"renounceRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"revokeRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"ruleId\",\"type\":\"uint256\"}],\"name\":\"ruleOperation\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"ruleId\",\"type\":\"uint256\"}],\"name\":\"ruleValidation\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"rulesCountOperation\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"rulesCountValidation\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"rulesOperation\",\"outputs\":[{\"internalType\":\"address[]\",\"name\":\"\",\"type\":\"address[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"rulesValidation\",\"outputs\":[{\"internalType\":\"address[]\",\"name\":\"\",\"type\":\"address[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"rules_\",\"type\":\"address[]\"}],\"name\":\"setRulesOperation\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"rules_\",\"type\":\"address[]\"}],\"name\":\"setRulesValidation\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"supportsInterface\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"trustedForwarder\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_amount\",\"type\":\"uint256\"}],\"name\":\"validateTransfer\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_amount\",\"type\":\"uint256\"}],\"name\":\"validateTransferValidation\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"errors\":{\"AccessControlBadConfirmation()\":[{\"details\":\"The caller of a function is not the expected one. NOTE: Don't confuse with {AccessControlUnauthorizedAccount}.\"}],\"AccessControlUnauthorizedAccount(address,bytes32)\":[{\"details\":\"The `account` is missing a role.\"}]},\"events\":{\"RoleAdminChanged(bytes32,bytes32,bytes32)\":{\"details\":\"Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite {RoleAdminChanged} not being emitted signaling this.\"},\"RoleGranted(bytes32,address,address)\":{\"details\":\"Emitted when `account` is granted `role`. `sender` is the account that originated the contract call, an admin role bearer except when using {AccessControl-_setupRole}.\"},\"RoleRevoked(bytes32,address,address)\":{\"details\":\"Emitted when `account` is revoked `role`. `sender` is the account that originated the contract call:   - if using `revokeRole`, it is the admin role bearer   - if using `renounceRole`, it is the role bearer (i.e. `account`)\"}},\"kind\":\"dev\",\"methods\":{\"constructor\":{\"params\":{\"admin\":\"Address of the contract (Access Control)\",\"forwarderIrrevocable\":\"Address of the forwarder, required for the gasless support\"}},\"detectTransferRestriction(address,address,uint256)\":{\"params\":{\"_amount\":\"to transfer\",\"_from\":\"the origin address\",\"_to\":\"the destination address\"},\"returns\":{\"_0\":\"The restricion code or REJECTED_CODE_BASE.TRANSFER_OK*\"}},\"detectTransferRestrictionValidation(address,address,uint256)\":{\"params\":{\"_amount\":\"to transfer\",\"_from\":\"the origin address\",\"_to\":\"the destination address\"},\"returns\":{\"_0\":\"The restricion code or REJECTED_CODE_BASE.TRANSFER_OK*\"}},\"getRoleAdmin(bytes32)\":{\"details\":\"Returns the admin role that controls `role`. See {grantRole} and {revokeRole}. To change a role's admin, use {_setRoleAdmin}.\"},\"getRuleIndexOperation(address)\":{\"returns\":{\"index\":\"if the rule is found, _rulesOperation.length otherwise\"}},\"getRuleIndexValidation(address)\":{\"returns\":{\"index\":\"if the rule is found, _rulesValidation.length otherwise\"}},\"grantRole(bytes32,address)\":{\"details\":\"Grants `role` to `account`. If `account` had not been already granted `role`, emits a {RoleGranted} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleGranted} event.\"},\"hasRole(bytes32,address)\":{\"details\":\"Returns `true` if `account` has been granted `role`.\"},\"isTrustedForwarder(address)\":{\"details\":\"Indicates whether any particular address is the trusted forwarder.\"},\"messageForTransferRestriction(uint8)\":{\"params\":{\"_restrictionCode\":\"The target restriction code\"},\"returns\":{\"_0\":\"True if the transfer is valid, false otherwise*\"}},\"removeRuleOperation(address,uint256)\":{\"details\":\"To reduce the array size, the last rule is moved to the location occupied by the rule to remove\",\"params\":{\"index\":\"the position inside the array of rule\",\"rule_\":\"address of the target rule\"}},\"removeRuleValidation(address,uint256)\":{\"details\":\"To reduce the array size, the last rule is moved to the location occupied by the rule to remove\",\"params\":{\"index\":\"the position inside the array of rule\",\"rule_\":\"address of the target rule\"}},\"renounceRole(bytes32,address)\":{\"details\":\"Revokes `role` from the calling account. Roles are often managed via {grantRole} and {revokeRole}: this function's purpose is to provide a mechanism for accounts to lose their privileges if they are compromised (such as when a trusted device is misplaced). If the calling account had been revoked `role`, emits a {RoleRevoked} event. Requirements: - the caller must be `callerConfirmation`. May emit a {RoleRevoked} event.\"},\"revokeRole(bytes32,address)\":{\"details\":\"Revokes `role` from `account`. If `account` had been granted `role`, emits a {RoleRevoked} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleRevoked} event.\"},\"ruleOperation(uint256)\":{\"params\":{\"ruleId\":\"index of the rule\"},\"returns\":{\"_0\":\"a rule address\"}},\"ruleValidation(uint256)\":{\"params\":{\"ruleId\":\"index of the rule\"},\"returns\":{\"_0\":\"a rule address\"}},\"rulesCountOperation()\":{\"returns\":{\"_0\":\"The number of rules inside the array\"}},\"rulesCountValidation()\":{\"returns\":{\"_0\":\"The number of rules inside the array\"}},\"rulesOperation()\":{\"returns\":{\"_0\":\"An array of rules\"}},\"rulesValidation()\":{\"returns\":{\"_0\":\"An array of rules\"}},\"setRulesValidation(address[])\":{\"details\":\"take address[] instead of IRuleEngineValidation[] since it is not possible to cast IRuleEngineValidation[] -> address[]\"},\"supportsInterface(bytes4)\":{\"details\":\"See {IERC165-supportsInterface}.\"},\"trustedForwarder()\":{\"details\":\"Returns the address of the trusted forwarder.\"},\"validateTransfer(address,address,uint256)\":{\"params\":{\"_amount\":\"to transfer\",\"_from\":\"the origin address\",\"_to\":\"the destination address\"},\"returns\":{\"_0\":\"True if the transfer is valid, false otherwise*\"}},\"validateTransferValidation(address,address,uint256)\":{\"params\":{\"_amount\":\"to transfer\",\"_from\":\"the origin address\",\"_to\":\"the destination address\"},\"returns\":{\"_0\":\"True if the transfer is valid, false otherwise*\"}}},\"title\":\"Implementation of a ruleEngine as defined by the CMTAT\",\"version\":1},\"userdoc\":{\"events\":{\"AddRule(address)\":{\"notice\":\"Generate when a rule is added\"},\"ClearRules(address[])\":{\"notice\":\"Generate when all the rules are cleared\"},\"RemoveRule(address)\":{\"notice\":\"Generate when a rule is removed\"}},\"kind\":\"user\",\"methods\":{\"RULE_ENGINE_OPERATOR_ROLE()\":{\"notice\":\"Role to manage the ruleEngine\"},\"TOKEN_CONTRACT_ROLE()\":{\"notice\":\"token contract\"},\"addRuleOperation(address)\":{\"notice\":\"Add a rule to the array of rules Revert if one rule is a zero address or if the rule is already present\"},\"addRuleValidation(address)\":{\"notice\":\"Add a rule to the array of rules Revert if one rule is a zero address or if the rule is already present\"},\"clearRulesOperation()\":{\"notice\":\"Clear all the rules of the array of rules\"},\"clearRulesValidation()\":{\"notice\":\"Clear all the rules of the array of rules\"},\"detectTransferRestriction(address,address,uint256)\":{\"notice\":\"Go through all the rule to know if a restriction exists on the transfer\"},\"detectTransferRestrictionValidation(address,address,uint256)\":{\"notice\":\"Go through all the rule to know if a restriction exists on the transfer\"},\"getRuleIndexOperation(address)\":{\"notice\":\"Get the index of a rule inside the list\"},\"getRuleIndexValidation(address)\":{\"notice\":\"Get the index of a rule inside the list\"},\"messageForTransferRestriction(uint8)\":{\"notice\":\"Return the message corresponding to the code\"},\"removeRuleOperation(address,uint256)\":{\"notice\":\"Remove a rule from the array of rules Revert if the rule found at the specified index does not match the rule in argument\"},\"removeRuleValidation(address,uint256)\":{\"notice\":\"Remove a rule from the array of rules Revert if the rule found at the specified index does not match the rule in argument\"},\"ruleOperation(uint256)\":{\"notice\":\"Get the rule at the position specified by ruleId\"},\"ruleValidation(uint256)\":{\"notice\":\"Get the rule at the position specified by ruleId\"},\"rulesOperation()\":{\"notice\":\"Get all the rules\"},\"rulesValidation()\":{\"notice\":\"Get all the rules\"},\"setRulesOperation(address[])\":{\"notice\":\"Set all the rules, will overwrite all the previous rules. \\\\n Revert if one rule is a zero address or if the rule is already present\"},\"setRulesValidation(address[])\":{\"notice\":\"Set all the rules, will overwrite all the previous rules. \\\\n Revert if one rule is a zero address or if the rule is already present\"},\"validateTransfer(address,address,uint256)\":{\"notice\":\"Validate a transfer\"},\"validateTransferValidation(address,address,uint256)\":{\"notice\":\"Validate a transfer\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"src/RuleEngine.sol\":\"RuleEngine\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[\":@openzeppelin/contracts/=lib/openzeppelin-contracts/contracts/\",\":CMTAT/=lib/CMTAT/contracts/\",\":OZ/=lib/openzeppelin-contracts/contracts/\",\":ds-test/=lib/openzeppelin-contracts/lib/forge-std/lib/ds-test/src/\",\":erc4626-tests/=lib/openzeppelin-contracts/lib/erc4626-tests/\",\":forge-std/=lib/forge-std/src/\",\":openzeppelin-contracts/=lib/openzeppelin-contracts/\"]},\"sources\":{\"lib/CMTAT/contracts/interfaces/draft-IERC1404/draft-IERC1404.sol\":{\"keccak256\":\"0xfba123f04b693467a10bffcc3d30c8ee0a55a159d1a50a9e6ad7efa6a08ad9ad\",\"license\":\"MPL-2.0\",\"urls\":[\"bzz-raw://f0af9bead272c5af8153932efe6e464485aa27c82a2a5c79ed94e780ec373da0\",\"dweb:/ipfs/QmZJj9B5sBDGY8b5qbFkadmQ377xugKwGoxkHPWW3BpnWg\"]},\"lib/CMTAT/contracts/interfaces/draft-IERC1404/draft-IERC1404EnumCode.sol\":{\"keccak256\":\"0x5162820d851ed01a9ce5e0b28b58b4dfa6262d010e0f112ca1dd1867b37600ed\",\"license\":\"MPL-2.0\",\"urls\":[\"bzz-raw://599cbb744369ec114f918eec3f462d0f2f0a33bab292683be34098bf98b31423\",\"dweb:/ipfs/QmTSYGzsUDicQ5jCu88r2XnRqFyS5nJqfPGiz4q3aL35mx\"]},\"lib/CMTAT/contracts/interfaces/draft-IERC1404/draft-IERC1404Wrapper.sol\":{\"keccak256\":\"0xefa53aa4e697f2fd338b56888c9492392100a146ccd7a2c107cbd189f5c99ea3\",\"license\":\"MPL-2.0\",\"urls\":[\"bzz-raw://a7a5933297a01300d5eb8baa49cce9c98c5f3779e329f4ac41dae6e128bdf68e\",\"dweb:/ipfs/QmcDMxLHuuc7n8dVw6PWtQaRrkqMrtQUoBt4XKeNHF69mF\"]},\"lib/CMTAT/contracts/interfaces/engine/IRuleEngine.sol\":{\"keccak256\":\"0x5db0b6db44e76f6b52541fdd68f5d534c035777c00df4f65e66a500e46d1049f\",\"license\":\"MPL-2.0\",\"urls\":[\"bzz-raw://a03b82a1cfcda98db1a52a0e6fb1a22cf4545604e59167a7c23439ef463b9607\",\"dweb:/ipfs/QmPwqKgMSBmURhgmvXi2hMxM7FTLTtEsZMn6mXRjpbqxSc\"]},\"lib/openzeppelin-contracts/contracts/access/AccessControl.sol\":{\"keccak256\":\"0xa0e92d42942f4f57c5be50568dac11e9d00c93efcb458026e18d2d9b9b2e7308\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://46326c0bb1e296b67185e81c918e0b40501b8b6386165855df0a3f3c634b6a80\",\"dweb:/ipfs/QmTwyrDYtsxsk6pymJTK94PnEpzsmkpUxFuzEiakDopy4Z\"]},\"lib/openzeppelin-contracts/contracts/access/IAccessControl.sol\":{\"keccak256\":\"0xb6b36edd6a2999fd243ff226d6cbf84bd71af2432bbd0dfe19392996a1d9cb41\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://1fd2f35495652e57e3f99bc6c510bc5f7dd398a176ea2e72d8ed730aebc6ca26\",\"dweb:/ipfs/QmTQV6X4gkikTib49cho5iDX3JvSQbdsoEChoDwrk3CbbH\"]},\"lib/openzeppelin-contracts/contracts/metatx/ERC2771Context.sol\":{\"keccak256\":\"0x98256cf37b71a69b2f5a8a6fe975ea03590dff703102bd141a830f94e8adebf6\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://6251fe1f6a1e45e6d619d150c123afc88b8646b38ee26a136efa9a6988a31d3f\",\"dweb:/ipfs/QmeXDT85wSZdP31wkz3ah3KhponCiksJLP5o2LR5e1JxcK\"]},\"lib/openzeppelin-contracts/contracts/utils/Context.sol\":{\"keccak256\":\"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://6a708e8a5bdb1011c2c381c9a5cfd8a9a956d7d0a9dc1bd8bcdaf52f76ef2f12\",\"dweb:/ipfs/Qmax9WHBnVsZP46ZxEMNRQpLQnrdE4dK8LehML1Py8FowF\"]},\"lib/openzeppelin-contracts/contracts/utils/introspection/ERC165.sol\":{\"keccak256\":\"0x9e8778b14317ba9e256c30a76fd6c32b960af621987f56069e1e819c77c6a133\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://1777404f1dcd0fac188e55a288724ec3c67b45288e49cc64723e95e702b49ab8\",\"dweb:/ipfs/QmZFdC626GButBApwDUvvTnUzdinevC3B24d7yyh57XkiA\"]},\"lib/openzeppelin-contracts/contracts/utils/introspection/IERC165.sol\":{\"keccak256\":\"0x4296879f55019b23e135000eb36896057e7101fb7fb859c5ef690cf14643757b\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://87b3541437c8c443ccd36795e56a338ed12855eec17f8da624511b8d1a7e14df\",\"dweb:/ipfs/QmeJQCtZrQjtJLr6u7ZHWeH3pBnjtLWzvRrKViAi7UZqxL\"]},\"src/RuleEngine.sol\":{\"keccak256\":\"0x108df8613195e2df8429038ed65bdc4cf930bda8fa86ca2b13311ad5383727f5\",\"license\":\"MPL-2.0\",\"urls\":[\"bzz-raw://f81ea56c32b2c8e92d80cd3ed0cad80b5f2a3fac35f54532ce1dcd2b436a5f9b\",\"dweb:/ipfs/QmW6GdVvEfyn47o9GkcpybmP8PYDfT6fvTFHAU1syMkdya\"]},\"src/interfaces/IRuleEngineOperation.sol\":{\"keccak256\":\"0x21f2fe8b4408853f65d5b9540426d93286c6be1a6e7424a243034453bb961809\",\"license\":\"MPL-2.0\",\"urls\":[\"bzz-raw://3c0fc26eb256d6e6a1e85a07ed83b50a16cf0a519abf8d405388505e21dd6b91\",\"dweb:/ipfs/Qmamkpa5fBptqAa2kXZLAqKXJY4NMdFWw8ozwob9o8Ze76\"]},\"src/interfaces/IRuleEngineValidation.sol\":{\"keccak256\":\"0x19f9b71580dddb20a29570bff88f711abf0c8aec18bd563643764aa37355eac1\",\"license\":\"MPL-2.0\",\"urls\":[\"bzz-raw://4a48e1abaa9d740c88bb33958b2227b1d98723a357fe35a6cc3a2843b00cdc20\",\"dweb:/ipfs/QmVaEQQhH522tKEJLizmFDuTeAyxb8bZP7byHpfNxwSmyT\"]},\"src/interfaces/IRuleOperation.sol\":{\"keccak256\":\"0x4960e62d6678d66d36d611f2e6819fbdeeed748c2d638965bf631b88c3beefb6\",\"license\":\"MPL-2.0\",\"urls\":[\"bzz-raw://b5509fccac80d4ab115d73281b22cc3877a7295ed39d901aba8fd73ce9275fce\",\"dweb:/ipfs/QmZQHqPtv2K7Bv4no5gnqmpWX92Gq7ENTD7vvZNvj5bUZE\"]},\"src/interfaces/IRuleValidation.sol\":{\"keccak256\":\"0x6b23f8d7355937f0d304ceb498f661b004d1969f87782af7588a960273af38a1\",\"license\":\"MPL-2.0\",\"urls\":[\"bzz-raw://b9c92ca4ce23304474c8236dd37c60f2c98627ca2a6156eb2ce0767436f40fa9\",\"dweb:/ipfs/QmZMkCu57MjUXjN5TtkhDGgM9RzGQpTX3uD79P1M9Vn2G8\"]},\"src/modules/MetaTxModuleStandalone.sol\":{\"keccak256\":\"0x32423330fbd140fb87b7f3c9f004db3eb7256f0f8c15b76be26ff14ba81edba0\",\"license\":\"MPL-2.0\",\"urls\":[\"bzz-raw://af6e6cfd9ccb587283b8379965a76143a27aaa38115191db1bbb1a5632eb4a25\",\"dweb:/ipfs/QmTdaEc78NfG9wJRYErsCZajvNF8ozLaqEfNyzi7Fu1fMj\"]},\"src/modules/RuleEngineInvariantStorage.sol\":{\"keccak256\":\"0x09093b1b80c8fd27ef80aaec46522ec5525aebcdb0fe77231821197d6fe7a1a0\",\"license\":\"MPL-2.0\",\"urls\":[\"bzz-raw://4939364678439e43818b1efb114b662219629b5945ecd98b1e39eca64d46dc44\",\"dweb:/ipfs/QmSikHEsDZy8hzyQ33N3AhiM25S7pCFEmqADZxK53FpCDq\"]},\"src/modules/RuleEngineOperation.sol\":{\"keccak256\":\"0xb8c4fa96bc94d612ee39003f13092611b2ecaaf668d566636026a20fab957e7a\",\"license\":\"MPL-2.0\",\"urls\":[\"bzz-raw://4249be172c68926880eb32292b9f4c917eb1b9e6ca14845b71757dd5c219b5bd\",\"dweb:/ipfs/QmQYNUiQGSANNtUTmMg2H7PiN68mEvKJzgWin9QdZzgNrs\"]},\"src/modules/RuleEngineValidation.sol\":{\"keccak256\":\"0x9922d5d720fb23684e32a17ea6a99d40b7f516b6c2078eb94ebe7efdc5ead367\",\"license\":\"MPL-2.0\",\"urls\":[\"bzz-raw://0982786aeb0ce4e2a04a99cf306f67ce0d20f1a11c81070f070429d76117d26a\",\"dweb:/ipfs/QmPfmFe5D5eWiMFj1VKWfDhomMmqiUgmpGC4LaqLfTKR9w\"]},\"src/modules/RuleEngineValidationCommon.sol\":{\"keccak256\":\"0xf1d0fdd62ba10b81918a6749e1fcf9f020b298a8179a1cf6c849fe0aaa5edddb\",\"license\":\"MPL-2.0\",\"urls\":[\"bzz-raw://57ae96630675750b371656a3e9ce3a5b1e2ce16327d3e292b934def1b85c8a1d\",\"dweb:/ipfs/QmZm9obyXiMCJzLPNCvvtN9QogngmRnkZJmBke2bc79Jgk\"]},\"src/modules/RuleInternal.sol\":{\"keccak256\":\"0xa6d2f8844062b318c31cb97570b840ac2faa50111564c97b7190bcadcab4419c\",\"license\":\"MPL-2.0\",\"urls\":[\"bzz-raw://878b4ba012b1c46973bb50018973a90ea6b700706a2ae52b0bae7d240df510b3\",\"dweb:/ipfs/QmdRjwxgoo4xc3JmyAirRbbLupKVZ51r67e1D93bTFSF6A\"]}},\"version\":1}",
+  "metadata": {
+    "compiler": { "version": "0.8.22+commit.4fc1097e" },
+    "language": "Solidity",
+    "output": {
+      "abi": [
+        {
+          "inputs": [
+            { "internalType": "address", "name": "admin", "type": "address" },
+            {
+              "internalType": "address",
+              "name": "forwarderIrrevocable",
+              "type": "address"
+            },
+            {
+              "internalType": "address",
+              "name": "tokenContract",
+              "type": "address"
+            }
+          ],
+          "stateMutability": "nonpayable",
+          "type": "constructor"
+        },
+        {
+          "inputs": [],
+          "type": "error",
+          "name": "AccessControlBadConfirmation"
+        },
+        {
+          "inputs": [
+            { "internalType": "address", "name": "account", "type": "address" },
+            {
+              "internalType": "bytes32",
+              "name": "neededRole",
+              "type": "bytes32"
+            }
+          ],
+          "type": "error",
+          "name": "AccessControlUnauthorizedAccount"
+        },
+        {
+          "inputs": [],
+          "type": "error",
+          "name": "RuleEngine_AdminWithAddressZeroNotAllowed"
+        },
+        { "inputs": [], "type": "error", "name": "RuleEngine_ArrayIsEmpty" },
+        {
+          "inputs": [],
+          "type": "error",
+          "name": "RuleEngine_RuleAddressZeroNotAllowed"
+        },
+        {
+          "inputs": [],
+          "type": "error",
+          "name": "RuleEngine_RuleAlreadyExists"
+        },
+        { "inputs": [], "type": "error", "name": "RuleEngine_RuleDoNotMatch" },
+        { "inputs": [], "type": "error", "name": "RuleEngine_TransferInvalid" },
+        {
+          "inputs": [
+            {
+              "internalType": "address",
+              "name": "rule",
+              "type": "address",
+              "indexed": true
+            }
+          ],
+          "type": "event",
+          "name": "AddRule",
+          "anonymous": false
+        },
+        {
+          "inputs": [
+            {
+              "internalType": "address[]",
+              "name": "rulesRemoved",
+              "type": "address[]",
+              "indexed": false
+            }
+          ],
+          "type": "event",
+          "name": "ClearRules",
+          "anonymous": false
+        },
+        {
+          "inputs": [
+            {
+              "internalType": "address",
+              "name": "rule",
+              "type": "address",
+              "indexed": true
+            }
+          ],
+          "type": "event",
+          "name": "RemoveRule",
+          "anonymous": false
+        },
+        {
+          "inputs": [
+            {
+              "internalType": "bytes32",
+              "name": "role",
+              "type": "bytes32",
+              "indexed": true
+            },
+            {
+              "internalType": "bytes32",
+              "name": "previousAdminRole",
+              "type": "bytes32",
+              "indexed": true
+            },
+            {
+              "internalType": "bytes32",
+              "name": "newAdminRole",
+              "type": "bytes32",
+              "indexed": true
+            }
+          ],
+          "type": "event",
+          "name": "RoleAdminChanged",
+          "anonymous": false
+        },
+        {
+          "inputs": [
+            {
+              "internalType": "bytes32",
+              "name": "role",
+              "type": "bytes32",
+              "indexed": true
+            },
+            {
+              "internalType": "address",
+              "name": "account",
+              "type": "address",
+              "indexed": true
+            },
+            {
+              "internalType": "address",
+              "name": "sender",
+              "type": "address",
+              "indexed": true
+            }
+          ],
+          "type": "event",
+          "name": "RoleGranted",
+          "anonymous": false
+        },
+        {
+          "inputs": [
+            {
+              "internalType": "bytes32",
+              "name": "role",
+              "type": "bytes32",
+              "indexed": true
+            },
+            {
+              "internalType": "address",
+              "name": "account",
+              "type": "address",
+              "indexed": true
+            },
+            {
+              "internalType": "address",
+              "name": "sender",
+              "type": "address",
+              "indexed": true
+            }
+          ],
+          "type": "event",
+          "name": "RoleRevoked",
+          "anonymous": false
+        },
+        {
+          "inputs": [],
+          "stateMutability": "view",
+          "type": "function",
+          "name": "DEFAULT_ADMIN_ROLE",
+          "outputs": [
+            { "internalType": "bytes32", "name": "", "type": "bytes32" }
+          ]
+        },
+        {
+          "inputs": [],
+          "stateMutability": "view",
+          "type": "function",
+          "name": "RULE_ENGINE_OPERATOR_ROLE",
+          "outputs": [
+            { "internalType": "bytes32", "name": "", "type": "bytes32" }
+          ]
+        },
+        {
+          "inputs": [],
+          "stateMutability": "view",
+          "type": "function",
+          "name": "TOKEN_CONTRACT_ROLE",
+          "outputs": [
+            { "internalType": "bytes32", "name": "", "type": "bytes32" }
+          ]
+        },
+        {
+          "inputs": [
+            {
+              "internalType": "contract IRuleOperation",
+              "name": "rule_",
+              "type": "address"
+            }
+          ],
+          "stateMutability": "nonpayable",
+          "type": "function",
+          "name": "addRuleOperation"
+        },
+        {
+          "inputs": [
+            {
+              "internalType": "contract IRuleValidation",
+              "name": "rule_",
+              "type": "address"
+            }
+          ],
+          "stateMutability": "nonpayable",
+          "type": "function",
+          "name": "addRuleValidation"
+        },
+        {
+          "inputs": [],
+          "stateMutability": "nonpayable",
+          "type": "function",
+          "name": "clearRulesOperation"
+        },
+        {
+          "inputs": [],
+          "stateMutability": "nonpayable",
+          "type": "function",
+          "name": "clearRulesValidation"
+        },
+        {
+          "inputs": [
+            { "internalType": "address", "name": "_from", "type": "address" },
+            { "internalType": "address", "name": "_to", "type": "address" },
+            { "internalType": "uint256", "name": "_amount", "type": "uint256" }
+          ],
+          "stateMutability": "view",
+          "type": "function",
+          "name": "detectTransferRestriction",
+          "outputs": [{ "internalType": "uint8", "name": "", "type": "uint8" }]
+        },
+        {
+          "inputs": [
+            { "internalType": "address", "name": "_from", "type": "address" },
+            { "internalType": "address", "name": "_to", "type": "address" },
+            { "internalType": "uint256", "name": "_amount", "type": "uint256" }
+          ],
+          "stateMutability": "view",
+          "type": "function",
+          "name": "detectTransferRestrictionValidation",
+          "outputs": [{ "internalType": "uint8", "name": "", "type": "uint8" }]
+        },
+        {
+          "inputs": [
+            { "internalType": "bytes32", "name": "role", "type": "bytes32" }
+          ],
+          "stateMutability": "view",
+          "type": "function",
+          "name": "getRoleAdmin",
+          "outputs": [
+            { "internalType": "bytes32", "name": "", "type": "bytes32" }
+          ]
+        },
+        {
+          "inputs": [
+            {
+              "internalType": "contract IRuleOperation",
+              "name": "rule_",
+              "type": "address"
+            }
+          ],
+          "stateMutability": "view",
+          "type": "function",
+          "name": "getRuleIndexOperation",
+          "outputs": [
+            { "internalType": "uint256", "name": "index", "type": "uint256" }
+          ]
+        },
+        {
+          "inputs": [
+            {
+              "internalType": "contract IRuleValidation",
+              "name": "rule_",
+              "type": "address"
+            }
+          ],
+          "stateMutability": "view",
+          "type": "function",
+          "name": "getRuleIndexValidation",
+          "outputs": [
+            { "internalType": "uint256", "name": "index", "type": "uint256" }
+          ]
+        },
+        {
+          "inputs": [
+            { "internalType": "bytes32", "name": "role", "type": "bytes32" },
+            { "internalType": "address", "name": "account", "type": "address" }
+          ],
+          "stateMutability": "nonpayable",
+          "type": "function",
+          "name": "grantRole"
+        },
+        {
+          "inputs": [
+            { "internalType": "bytes32", "name": "role", "type": "bytes32" },
+            { "internalType": "address", "name": "account", "type": "address" }
+          ],
+          "stateMutability": "view",
+          "type": "function",
+          "name": "hasRole",
+          "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }]
+        },
+        {
+          "inputs": [
+            {
+              "internalType": "address",
+              "name": "forwarder",
+              "type": "address"
+            }
+          ],
+          "stateMutability": "view",
+          "type": "function",
+          "name": "isTrustedForwarder",
+          "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }]
+        },
+        {
+          "inputs": [
+            {
+              "internalType": "uint8",
+              "name": "_restrictionCode",
+              "type": "uint8"
+            }
+          ],
+          "stateMutability": "view",
+          "type": "function",
+          "name": "messageForTransferRestriction",
+          "outputs": [
+            { "internalType": "string", "name": "", "type": "string" }
+          ]
+        },
+        {
+          "inputs": [
+            { "internalType": "address", "name": "from", "type": "address" },
+            { "internalType": "address", "name": "to", "type": "address" },
+            { "internalType": "uint256", "name": "amount", "type": "uint256" }
+          ],
+          "stateMutability": "nonpayable",
+          "type": "function",
+          "name": "operateOnTransfer",
+          "outputs": [
+            { "internalType": "bool", "name": "isValid", "type": "bool" }
+          ]
+        },
+        {
+          "inputs": [
+            {
+              "internalType": "contract IRuleOperation",
+              "name": "rule_",
+              "type": "address"
+            },
+            { "internalType": "uint256", "name": "index", "type": "uint256" }
+          ],
+          "stateMutability": "nonpayable",
+          "type": "function",
+          "name": "removeRuleOperation"
+        },
+        {
+          "inputs": [
+            {
+              "internalType": "contract IRuleValidation",
+              "name": "rule_",
+              "type": "address"
+            },
+            { "internalType": "uint256", "name": "index", "type": "uint256" }
+          ],
+          "stateMutability": "nonpayable",
+          "type": "function",
+          "name": "removeRuleValidation"
+        },
+        {
+          "inputs": [
+            { "internalType": "bytes32", "name": "role", "type": "bytes32" },
+            {
+              "internalType": "address",
+              "name": "callerConfirmation",
+              "type": "address"
+            }
+          ],
+          "stateMutability": "nonpayable",
+          "type": "function",
+          "name": "renounceRole"
+        },
+        {
+          "inputs": [
+            { "internalType": "bytes32", "name": "role", "type": "bytes32" },
+            { "internalType": "address", "name": "account", "type": "address" }
+          ],
+          "stateMutability": "nonpayable",
+          "type": "function",
+          "name": "revokeRole"
+        },
+        {
+          "inputs": [
+            { "internalType": "uint256", "name": "ruleId", "type": "uint256" }
+          ],
+          "stateMutability": "view",
+          "type": "function",
+          "name": "ruleOperation",
+          "outputs": [
+            { "internalType": "address", "name": "", "type": "address" }
+          ]
+        },
+        {
+          "inputs": [
+            { "internalType": "uint256", "name": "ruleId", "type": "uint256" }
+          ],
+          "stateMutability": "view",
+          "type": "function",
+          "name": "ruleValidation",
+          "outputs": [
+            { "internalType": "address", "name": "", "type": "address" }
+          ]
+        },
+        {
+          "inputs": [],
+          "stateMutability": "view",
+          "type": "function",
+          "name": "rulesCountOperation",
+          "outputs": [
+            { "internalType": "uint256", "name": "", "type": "uint256" }
+          ]
+        },
+        {
+          "inputs": [],
+          "stateMutability": "view",
+          "type": "function",
+          "name": "rulesCountValidation",
+          "outputs": [
+            { "internalType": "uint256", "name": "", "type": "uint256" }
+          ]
+        },
+        {
+          "inputs": [],
+          "stateMutability": "view",
+          "type": "function",
+          "name": "rulesOperation",
+          "outputs": [
+            { "internalType": "address[]", "name": "", "type": "address[]" }
+          ]
+        },
+        {
+          "inputs": [],
+          "stateMutability": "view",
+          "type": "function",
+          "name": "rulesValidation",
+          "outputs": [
+            { "internalType": "address[]", "name": "", "type": "address[]" }
+          ]
+        },
+        {
+          "inputs": [
+            {
+              "internalType": "address[]",
+              "name": "rules_",
+              "type": "address[]"
+            }
+          ],
+          "stateMutability": "nonpayable",
+          "type": "function",
+          "name": "setRulesOperation"
+        },
+        {
+          "inputs": [
+            {
+              "internalType": "address[]",
+              "name": "rules_",
+              "type": "address[]"
+            }
+          ],
+          "stateMutability": "nonpayable",
+          "type": "function",
+          "name": "setRulesValidation"
+        },
+        {
+          "inputs": [
+            {
+              "internalType": "bytes4",
+              "name": "interfaceId",
+              "type": "bytes4"
+            }
+          ],
+          "stateMutability": "view",
+          "type": "function",
+          "name": "supportsInterface",
+          "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }]
+        },
+        {
+          "inputs": [],
+          "stateMutability": "view",
+          "type": "function",
+          "name": "trustedForwarder",
+          "outputs": [
+            { "internalType": "address", "name": "", "type": "address" }
+          ]
+        },
+        {
+          "inputs": [
+            { "internalType": "address", "name": "_from", "type": "address" },
+            { "internalType": "address", "name": "_to", "type": "address" },
+            { "internalType": "uint256", "name": "_amount", "type": "uint256" }
+          ],
+          "stateMutability": "view",
+          "type": "function",
+          "name": "validateTransfer",
+          "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }]
+        },
+        {
+          "inputs": [
+            { "internalType": "address", "name": "_from", "type": "address" },
+            { "internalType": "address", "name": "_to", "type": "address" },
+            { "internalType": "uint256", "name": "_amount", "type": "uint256" }
+          ],
+          "stateMutability": "view",
+          "type": "function",
+          "name": "validateTransferValidation",
+          "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }]
+        }
+      ],
+      "devdoc": {
+        "kind": "dev",
+        "methods": {
+          "constructor": {
+            "params": {
+              "admin": "Address of the contract (Access Control)",
+              "forwarderIrrevocable": "Address of the forwarder, required for the gasless support"
+            }
+          },
+          "detectTransferRestriction(address,address,uint256)": {
+            "params": {
+              "_amount": "to transfer",
+              "_from": "the origin address",
+              "_to": "the destination address"
+            },
+            "returns": {
+              "_0": "The restricion code or REJECTED_CODE_BASE.TRANSFER_OK*"
+            }
+          },
+          "detectTransferRestrictionValidation(address,address,uint256)": {
+            "params": {
+              "_amount": "to transfer",
+              "_from": "the origin address",
+              "_to": "the destination address"
+            },
+            "returns": {
+              "_0": "The restricion code or REJECTED_CODE_BASE.TRANSFER_OK*"
+            }
+          },
+          "getRoleAdmin(bytes32)": {
+            "details": "Returns the admin role that controls `role`. See {grantRole} and {revokeRole}. To change a role's admin, use {_setRoleAdmin}."
+          },
+          "getRuleIndexOperation(address)": {
+            "returns": {
+              "index": "if the rule is found, _rulesOperation.length otherwise"
+            }
+          },
+          "getRuleIndexValidation(address)": {
+            "returns": {
+              "index": "if the rule is found, _rulesValidation.length otherwise"
+            }
+          },
+          "grantRole(bytes32,address)": {
+            "details": "Grants `role` to `account`. If `account` had not been already granted `role`, emits a {RoleGranted} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleGranted} event."
+          },
+          "hasRole(bytes32,address)": {
+            "details": "Returns `true` if `account` has been granted `role`."
+          },
+          "isTrustedForwarder(address)": {
+            "details": "Indicates whether any particular address is the trusted forwarder."
+          },
+          "messageForTransferRestriction(uint8)": {
+            "params": { "_restrictionCode": "The target restriction code" },
+            "returns": {
+              "_0": "True if the transfer is valid, false otherwise*"
+            }
+          },
+          "removeRuleOperation(address,uint256)": {
+            "details": "To reduce the array size, the last rule is moved to the location occupied by the rule to remove",
+            "params": {
+              "index": "the position inside the array of rule",
+              "rule_": "address of the target rule"
+            }
+          },
+          "removeRuleValidation(address,uint256)": {
+            "details": "To reduce the array size, the last rule is moved to the location occupied by the rule to remove",
+            "params": {
+              "index": "the position inside the array of rule",
+              "rule_": "address of the target rule"
+            }
+          },
+          "renounceRole(bytes32,address)": {
+            "details": "Revokes `role` from the calling account. Roles are often managed via {grantRole} and {revokeRole}: this function's purpose is to provide a mechanism for accounts to lose their privileges if they are compromised (such as when a trusted device is misplaced). If the calling account had been revoked `role`, emits a {RoleRevoked} event. Requirements: - the caller must be `callerConfirmation`. May emit a {RoleRevoked} event."
+          },
+          "revokeRole(bytes32,address)": {
+            "details": "Revokes `role` from `account`. If `account` had been granted `role`, emits a {RoleRevoked} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleRevoked} event."
+          },
+          "ruleOperation(uint256)": {
+            "params": { "ruleId": "index of the rule" },
+            "returns": { "_0": "a rule address" }
+          },
+          "ruleValidation(uint256)": {
+            "params": { "ruleId": "index of the rule" },
+            "returns": { "_0": "a rule address" }
+          },
+          "rulesCountOperation()": {
+            "returns": { "_0": "The number of rules inside the array" }
+          },
+          "rulesCountValidation()": {
+            "returns": { "_0": "The number of rules inside the array" }
+          },
+          "rulesOperation()": { "returns": { "_0": "An array of rules" } },
+          "rulesValidation()": { "returns": { "_0": "An array of rules" } },
+          "setRulesValidation(address[])": {
+            "details": "take address[] instead of IRuleEngineValidation[] since it is not possible to cast IRuleEngineValidation[] -> address[]"
+          },
+          "supportsInterface(bytes4)": {
+            "details": "See {IERC165-supportsInterface}."
+          },
+          "trustedForwarder()": {
+            "details": "Returns the address of the trusted forwarder."
+          },
+          "validateTransfer(address,address,uint256)": {
+            "params": {
+              "_amount": "to transfer",
+              "_from": "the origin address",
+              "_to": "the destination address"
+            },
+            "returns": {
+              "_0": "True if the transfer is valid, false otherwise*"
+            }
+          },
+          "validateTransferValidation(address,address,uint256)": {
+            "params": {
+              "_amount": "to transfer",
+              "_from": "the origin address",
+              "_to": "the destination address"
+            },
+            "returns": {
+              "_0": "True if the transfer is valid, false otherwise*"
+            }
+          }
+        },
+        "version": 1
+      },
+      "userdoc": {
+        "kind": "user",
+        "methods": {
+          "RULE_ENGINE_OPERATOR_ROLE()": {
+            "notice": "Role to manage the ruleEngine"
+          },
+          "TOKEN_CONTRACT_ROLE()": { "notice": "token contract" },
+          "addRuleOperation(address)": {
+            "notice": "Add a rule to the array of rules Revert if one rule is a zero address or if the rule is already present"
+          },
+          "addRuleValidation(address)": {
+            "notice": "Add a rule to the array of rules Revert if one rule is a zero address or if the rule is already present"
+          },
+          "clearRulesOperation()": {
+            "notice": "Clear all the rules of the array of rules"
+          },
+          "clearRulesValidation()": {
+            "notice": "Clear all the rules of the array of rules"
+          },
+          "detectTransferRestriction(address,address,uint256)": {
+            "notice": "Go through all the rule to know if a restriction exists on the transfer"
+          },
+          "detectTransferRestrictionValidation(address,address,uint256)": {
+            "notice": "Go through all the rule to know if a restriction exists on the transfer"
+          },
+          "getRuleIndexOperation(address)": {
+            "notice": "Get the index of a rule inside the list"
+          },
+          "getRuleIndexValidation(address)": {
+            "notice": "Get the index of a rule inside the list"
+          },
+          "messageForTransferRestriction(uint8)": {
+            "notice": "Return the message corresponding to the code"
+          },
+          "removeRuleOperation(address,uint256)": {
+            "notice": "Remove a rule from the array of rules Revert if the rule found at the specified index does not match the rule in argument"
+          },
+          "removeRuleValidation(address,uint256)": {
+            "notice": "Remove a rule from the array of rules Revert if the rule found at the specified index does not match the rule in argument"
+          },
+          "ruleOperation(uint256)": {
+            "notice": "Get the rule at the position specified by ruleId"
+          },
+          "ruleValidation(uint256)": {
+            "notice": "Get the rule at the position specified by ruleId"
+          },
+          "rulesOperation()": { "notice": "Get all the rules" },
+          "rulesValidation()": { "notice": "Get all the rules" },
+          "setRulesOperation(address[])": {
+            "notice": "Set all the rules, will overwrite all the previous rules. \\n Revert if one rule is a zero address or if the rule is already present"
+          },
+          "setRulesValidation(address[])": {
+            "notice": "Set all the rules, will overwrite all the previous rules. \\n Revert if one rule is a zero address or if the rule is already present"
+          },
+          "validateTransfer(address,address,uint256)": {
+            "notice": "Validate a transfer"
+          },
+          "validateTransferValidation(address,address,uint256)": {
+            "notice": "Validate a transfer"
+          }
+        },
+        "version": 1
+      }
+    },
+    "settings": {
+      "remappings": [
+        "@openzeppelin/contracts/=lib/openzeppelin-contracts/contracts/",
+        "CMTAT/=lib/CMTAT/contracts/",
+        "OZ/=lib/openzeppelin-contracts/contracts/",
+        "ds-test/=lib/openzeppelin-contracts/lib/forge-std/lib/ds-test/src/",
+        "erc4626-tests/=lib/openzeppelin-contracts/lib/erc4626-tests/",
+        "forge-std/=lib/forge-std/src/",
+        "openzeppelin-contracts/=lib/openzeppelin-contracts/"
+      ],
+      "optimizer": { "enabled": true, "runs": 200 },
+      "metadata": { "bytecodeHash": "ipfs" },
+      "compilationTarget": { "src/RuleEngine.sol": "RuleEngine" },
+      "evmVersion": "london",
+      "libraries": {}
+    },
+    "sources": {
+      "lib/CMTAT/contracts/interfaces/draft-IERC1404/draft-IERC1404.sol": {
+        "keccak256": "0xfba123f04b693467a10bffcc3d30c8ee0a55a159d1a50a9e6ad7efa6a08ad9ad",
+        "urls": [
+          "bzz-raw://f0af9bead272c5af8153932efe6e464485aa27c82a2a5c79ed94e780ec373da0",
+          "dweb:/ipfs/QmZJj9B5sBDGY8b5qbFkadmQ377xugKwGoxkHPWW3BpnWg"
+        ],
+        "license": "MPL-2.0"
+      },
+      "lib/CMTAT/contracts/interfaces/draft-IERC1404/draft-IERC1404EnumCode.sol": {
+        "keccak256": "0x5162820d851ed01a9ce5e0b28b58b4dfa6262d010e0f112ca1dd1867b37600ed",
+        "urls": [
+          "bzz-raw://599cbb744369ec114f918eec3f462d0f2f0a33bab292683be34098bf98b31423",
+          "dweb:/ipfs/QmTSYGzsUDicQ5jCu88r2XnRqFyS5nJqfPGiz4q3aL35mx"
+        ],
+        "license": "MPL-2.0"
+      },
+      "lib/CMTAT/contracts/interfaces/draft-IERC1404/draft-IERC1404Wrapper.sol": {
+        "keccak256": "0xefa53aa4e697f2fd338b56888c9492392100a146ccd7a2c107cbd189f5c99ea3",
+        "urls": [
+          "bzz-raw://a7a5933297a01300d5eb8baa49cce9c98c5f3779e329f4ac41dae6e128bdf68e",
+          "dweb:/ipfs/QmcDMxLHuuc7n8dVw6PWtQaRrkqMrtQUoBt4XKeNHF69mF"
+        ],
+        "license": "MPL-2.0"
+      },
+      "lib/CMTAT/contracts/interfaces/engine/IRuleEngine.sol": {
+        "keccak256": "0x5db0b6db44e76f6b52541fdd68f5d534c035777c00df4f65e66a500e46d1049f",
+        "urls": [
+          "bzz-raw://a03b82a1cfcda98db1a52a0e6fb1a22cf4545604e59167a7c23439ef463b9607",
+          "dweb:/ipfs/QmPwqKgMSBmURhgmvXi2hMxM7FTLTtEsZMn6mXRjpbqxSc"
+        ],
+        "license": "MPL-2.0"
+      },
+      "lib/openzeppelin-contracts/contracts/access/AccessControl.sol": {
+        "keccak256": "0xa0e92d42942f4f57c5be50568dac11e9d00c93efcb458026e18d2d9b9b2e7308",
+        "urls": [
+          "bzz-raw://46326c0bb1e296b67185e81c918e0b40501b8b6386165855df0a3f3c634b6a80",
+          "dweb:/ipfs/QmTwyrDYtsxsk6pymJTK94PnEpzsmkpUxFuzEiakDopy4Z"
+        ],
+        "license": "MIT"
+      },
+      "lib/openzeppelin-contracts/contracts/access/IAccessControl.sol": {
+        "keccak256": "0xb6b36edd6a2999fd243ff226d6cbf84bd71af2432bbd0dfe19392996a1d9cb41",
+        "urls": [
+          "bzz-raw://1fd2f35495652e57e3f99bc6c510bc5f7dd398a176ea2e72d8ed730aebc6ca26",
+          "dweb:/ipfs/QmTQV6X4gkikTib49cho5iDX3JvSQbdsoEChoDwrk3CbbH"
+        ],
+        "license": "MIT"
+      },
+      "lib/openzeppelin-contracts/contracts/metatx/ERC2771Context.sol": {
+        "keccak256": "0x98256cf37b71a69b2f5a8a6fe975ea03590dff703102bd141a830f94e8adebf6",
+        "urls": [
+          "bzz-raw://6251fe1f6a1e45e6d619d150c123afc88b8646b38ee26a136efa9a6988a31d3f",
+          "dweb:/ipfs/QmeXDT85wSZdP31wkz3ah3KhponCiksJLP5o2LR5e1JxcK"
+        ],
+        "license": "MIT"
+      },
+      "lib/openzeppelin-contracts/contracts/utils/Context.sol": {
+        "keccak256": "0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2",
+        "urls": [
+          "bzz-raw://6a708e8a5bdb1011c2c381c9a5cfd8a9a956d7d0a9dc1bd8bcdaf52f76ef2f12",
+          "dweb:/ipfs/Qmax9WHBnVsZP46ZxEMNRQpLQnrdE4dK8LehML1Py8FowF"
+        ],
+        "license": "MIT"
+      },
+      "lib/openzeppelin-contracts/contracts/utils/introspection/ERC165.sol": {
+        "keccak256": "0x9e8778b14317ba9e256c30a76fd6c32b960af621987f56069e1e819c77c6a133",
+        "urls": [
+          "bzz-raw://1777404f1dcd0fac188e55a288724ec3c67b45288e49cc64723e95e702b49ab8",
+          "dweb:/ipfs/QmZFdC626GButBApwDUvvTnUzdinevC3B24d7yyh57XkiA"
+        ],
+        "license": "MIT"
+      },
+      "lib/openzeppelin-contracts/contracts/utils/introspection/IERC165.sol": {
+        "keccak256": "0x4296879f55019b23e135000eb36896057e7101fb7fb859c5ef690cf14643757b",
+        "urls": [
+          "bzz-raw://87b3541437c8c443ccd36795e56a338ed12855eec17f8da624511b8d1a7e14df",
+          "dweb:/ipfs/QmeJQCtZrQjtJLr6u7ZHWeH3pBnjtLWzvRrKViAi7UZqxL"
+        ],
+        "license": "MIT"
+      },
+      "src/RuleEngine.sol": {
+        "keccak256": "0x108df8613195e2df8429038ed65bdc4cf930bda8fa86ca2b13311ad5383727f5",
+        "urls": [
+          "bzz-raw://f81ea56c32b2c8e92d80cd3ed0cad80b5f2a3fac35f54532ce1dcd2b436a5f9b",
+          "dweb:/ipfs/QmW6GdVvEfyn47o9GkcpybmP8PYDfT6fvTFHAU1syMkdya"
+        ],
+        "license": "MPL-2.0"
+      },
+      "src/interfaces/IRuleEngineOperation.sol": {
+        "keccak256": "0x21f2fe8b4408853f65d5b9540426d93286c6be1a6e7424a243034453bb961809",
+        "urls": [
+          "bzz-raw://3c0fc26eb256d6e6a1e85a07ed83b50a16cf0a519abf8d405388505e21dd6b91",
+          "dweb:/ipfs/Qmamkpa5fBptqAa2kXZLAqKXJY4NMdFWw8ozwob9o8Ze76"
+        ],
+        "license": "MPL-2.0"
+      },
+      "src/interfaces/IRuleEngineValidation.sol": {
+        "keccak256": "0x19f9b71580dddb20a29570bff88f711abf0c8aec18bd563643764aa37355eac1",
+        "urls": [
+          "bzz-raw://4a48e1abaa9d740c88bb33958b2227b1d98723a357fe35a6cc3a2843b00cdc20",
+          "dweb:/ipfs/QmVaEQQhH522tKEJLizmFDuTeAyxb8bZP7byHpfNxwSmyT"
+        ],
+        "license": "MPL-2.0"
+      },
+      "src/interfaces/IRuleOperation.sol": {
+        "keccak256": "0x4960e62d6678d66d36d611f2e6819fbdeeed748c2d638965bf631b88c3beefb6",
+        "urls": [
+          "bzz-raw://b5509fccac80d4ab115d73281b22cc3877a7295ed39d901aba8fd73ce9275fce",
+          "dweb:/ipfs/QmZQHqPtv2K7Bv4no5gnqmpWX92Gq7ENTD7vvZNvj5bUZE"
+        ],
+        "license": "MPL-2.0"
+      },
+      "src/interfaces/IRuleValidation.sol": {
+        "keccak256": "0x6b23f8d7355937f0d304ceb498f661b004d1969f87782af7588a960273af38a1",
+        "urls": [
+          "bzz-raw://b9c92ca4ce23304474c8236dd37c60f2c98627ca2a6156eb2ce0767436f40fa9",
+          "dweb:/ipfs/QmZMkCu57MjUXjN5TtkhDGgM9RzGQpTX3uD79P1M9Vn2G8"
+        ],
+        "license": "MPL-2.0"
+      },
+      "src/modules/MetaTxModuleStandalone.sol": {
+        "keccak256": "0x32423330fbd140fb87b7f3c9f004db3eb7256f0f8c15b76be26ff14ba81edba0",
+        "urls": [
+          "bzz-raw://af6e6cfd9ccb587283b8379965a76143a27aaa38115191db1bbb1a5632eb4a25",
+          "dweb:/ipfs/QmTdaEc78NfG9wJRYErsCZajvNF8ozLaqEfNyzi7Fu1fMj"
+        ],
+        "license": "MPL-2.0"
+      },
+      "src/modules/RuleEngineInvariantStorage.sol": {
+        "keccak256": "0x09093b1b80c8fd27ef80aaec46522ec5525aebcdb0fe77231821197d6fe7a1a0",
+        "urls": [
+          "bzz-raw://4939364678439e43818b1efb114b662219629b5945ecd98b1e39eca64d46dc44",
+          "dweb:/ipfs/QmSikHEsDZy8hzyQ33N3AhiM25S7pCFEmqADZxK53FpCDq"
+        ],
+        "license": "MPL-2.0"
+      },
+      "src/modules/RuleEngineOperation.sol": {
+        "keccak256": "0xb8c4fa96bc94d612ee39003f13092611b2ecaaf668d566636026a20fab957e7a",
+        "urls": [
+          "bzz-raw://4249be172c68926880eb32292b9f4c917eb1b9e6ca14845b71757dd5c219b5bd",
+          "dweb:/ipfs/QmQYNUiQGSANNtUTmMg2H7PiN68mEvKJzgWin9QdZzgNrs"
+        ],
+        "license": "MPL-2.0"
+      },
+      "src/modules/RuleEngineValidation.sol": {
+        "keccak256": "0x9922d5d720fb23684e32a17ea6a99d40b7f516b6c2078eb94ebe7efdc5ead367",
+        "urls": [
+          "bzz-raw://0982786aeb0ce4e2a04a99cf306f67ce0d20f1a11c81070f070429d76117d26a",
+          "dweb:/ipfs/QmPfmFe5D5eWiMFj1VKWfDhomMmqiUgmpGC4LaqLfTKR9w"
+        ],
+        "license": "MPL-2.0"
+      },
+      "src/modules/RuleEngineValidationCommon.sol": {
+        "keccak256": "0xf1d0fdd62ba10b81918a6749e1fcf9f020b298a8179a1cf6c849fe0aaa5edddb",
+        "urls": [
+          "bzz-raw://57ae96630675750b371656a3e9ce3a5b1e2ce16327d3e292b934def1b85c8a1d",
+          "dweb:/ipfs/QmZm9obyXiMCJzLPNCvvtN9QogngmRnkZJmBke2bc79Jgk"
+        ],
+        "license": "MPL-2.0"
+      },
+      "src/modules/RuleInternal.sol": {
+        "keccak256": "0xa6d2f8844062b318c31cb97570b840ac2faa50111564c97b7190bcadcab4419c",
+        "urls": [
+          "bzz-raw://878b4ba012b1c46973bb50018973a90ea6b700706a2ae52b0bae7d240df510b3",
+          "dweb:/ipfs/QmdRjwxgoo4xc3JmyAirRbbLupKVZ51r67e1D93bTFSF6A"
+        ],
+        "license": "MPL-2.0"
+      }
+    },
+    "version": 1
+  },
+  "id": 84
+}
diff --git a/RuleWhitelistWrapper.json b/RuleWhitelistWrapper.json
new file mode 100644
index 0000000..73281c9
--- /dev/null
+++ b/RuleWhitelistWrapper.json
@@ -0,0 +1 @@
+{"abi":[{"type":"constructor","inputs":[{"name":"admin","type":"address","internalType":"address"},{"name":"forwarderIrrevocable","type":"address","internalType":"address"}],"stateMutability":"nonpayable"},{"type":"function","name":"CODE_ADDRESS_FROM_NOT_WHITELISTED","inputs":[],"outputs":[{"name":"","type":"uint8","internalType":"uint8"}],"stateMutability":"view"},{"type":"function","name":"CODE_ADDRESS_TO_NOT_WHITELISTED","inputs":[],"outputs":[{"name":"","type":"uint8","internalType":"uint8"}],"stateMutability":"view"},{"type":"function","name":"DEFAULT_ADMIN_ROLE","inputs":[],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"RULE_ENGINE_OPERATOR_ROLE","inputs":[],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"TOKEN_CONTRACT_ROLE","inputs":[],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"addRuleValidation","inputs":[{"name":"rule_","type":"address","internalType":"contract IRuleValidation"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"canReturnTransferRestrictionCode","inputs":[{"name":"_restrictionCode","type":"uint8","internalType":"uint8"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"pure"},{"type":"function","name":"clearRulesValidation","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"detectTransferRestriction","inputs":[{"name":"_from","type":"address","internalType":"address"},{"name":"_to","type":"address","internalType":"address"},{"name":"","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"uint8","internalType":"uint8"}],"stateMutability":"view"},{"type":"function","name":"getRoleAdmin","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"}],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"getRuleIndexValidation","inputs":[{"name":"rule_","type":"address","internalType":"contract IRuleValidation"}],"outputs":[{"name":"index","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"grantRole","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"},{"name":"account","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"hasRole","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"},{"name":"account","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"isTrustedForwarder","inputs":[{"name":"forwarder","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"messageForTransferRestriction","inputs":[{"name":"_restrictionCode","type":"uint8","internalType":"uint8"}],"outputs":[{"name":"","type":"string","internalType":"string"}],"stateMutability":"pure"},{"type":"function","name":"removeRuleValidation","inputs":[{"name":"rule_","type":"address","internalType":"contract IRuleValidation"},{"name":"index","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"renounceRole","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"},{"name":"callerConfirmation","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"revokeRole","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"},{"name":"account","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"ruleValidation","inputs":[{"name":"ruleId","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"rulesCountValidation","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"rulesValidation","inputs":[],"outputs":[{"name":"","type":"address[]","internalType":"address[]"}],"stateMutability":"view"},{"type":"function","name":"setRulesValidation","inputs":[{"name":"rules_","type":"address[]","internalType":"address[]"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"supportsInterface","inputs":[{"name":"interfaceId","type":"bytes4","internalType":"bytes4"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"trustedForwarder","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"validateTransfer","inputs":[{"name":"_from","type":"address","internalType":"address"},{"name":"_to","type":"address","internalType":"address"},{"name":"_amount","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"isValid","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"event","name":"AddRule","inputs":[{"name":"rule","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"event","name":"ClearRules","inputs":[{"name":"rulesRemoved","type":"address[]","indexed":false,"internalType":"address[]"}],"anonymous":false},{"type":"event","name":"RemoveRule","inputs":[{"name":"rule","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"event","name":"RoleAdminChanged","inputs":[{"name":"role","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"previousAdminRole","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"newAdminRole","type":"bytes32","indexed":true,"internalType":"bytes32"}],"anonymous":false},{"type":"event","name":"RoleGranted","inputs":[{"name":"role","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"account","type":"address","indexed":true,"internalType":"address"},{"name":"sender","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"event","name":"RoleRevoked","inputs":[{"name":"role","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"account","type":"address","indexed":true,"internalType":"address"},{"name":"sender","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"error","name":"AccessControlBadConfirmation","inputs":[]},{"type":"error","name":"AccessControlUnauthorizedAccount","inputs":[{"name":"account","type":"address","internalType":"address"},{"name":"neededRole","type":"bytes32","internalType":"bytes32"}]},{"type":"error","name":"RuleEngine_AdminWithAddressZeroNotAllowed","inputs":[]},{"type":"error","name":"RuleEngine_ArrayIsEmpty","inputs":[]},{"type":"error","name":"RuleEngine_RuleAddressZeroNotAllowed","inputs":[]},{"type":"error","name":"RuleEngine_RuleAlreadyExists","inputs":[]},{"type":"error","name":"RuleEngine_RuleDoNotMatch","inputs":[]}],"bytecode":{"object":"0x60a06040523480156200001157600080fd5b506040516200197138038062001971833981016040819052620000349162000207565b6001600160a01b0380821660805282166200006257604051630872273360e21b815260040160405180910390fd5b6200006f600083620000a5565b506200009c7fb3c151d85eb431da97012a1682e6ab41bddc7db1012e7c40bd326c24bf56f99983620000a5565b505050620002be565b6000828152602081815260408083206001600160a01b038516845290915281205460ff166200014c576000838152602081815260408083206001600160a01b03861684529091529020805460ff191660011790556200010362000156565b6001600160a01b0316826001600160a01b0316847f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a450600162000150565b5060005b92915050565b60006200016262000167565b905090565b60003660146200017733620001c3565b8015620001845750808210155b15620001bb576000366200019983856200023f565b620001a692829062000261565b620001b1916200028d565b60601c9250505090565b339250505090565b6000620001cf60805190565b6001600160a01b0316826001600160a01b0316149050919050565b80516001600160a01b03811681146200020257600080fd5b919050565b600080604083850312156200021b57600080fd5b6200022683620001ea565b91506200023660208401620001ea565b90509250929050565b818103818111156200015057634e487b7160e01b600052601160045260246000fd5b600080858511156200027257600080fd5b838611156200028057600080fd5b5050820193919092039150565b6001600160601b03198135818116916014851015620002b65780818660140360031b1b83161692505b505092915050565b608051611689620002e860003960008181610281015281816102f50152610f4701526116896000f3fe608060405234801561001057600080fd5b50600436106101735760003560e01c80637da0a877116100de578063a217fddf11610097578063cd1d4dc711610071578063cd1d4dc71461039f578063d4ce1415146103b2578063d547741f146103c5578063db136dad146103d857600080fd5b8063a217fddf1461036f578063c57086a114610377578063c6946a121461038c57600080fd5b80637da0a877146102f35780637f4ab1dd1461031957806383304df0146103395780638a1b6c8e1461034c5780638a2021b11461035457806391d148541461035c57600080fd5b8063397a7d3c11610130578063397a7d3c146102335780634d53374e1461025e578063572b6c05146102715780635b119c0a146102b15780636728f545146102cb5780637d045df6146102e057600080fd5b806301ffc9a7146101785780630fbbfb55146101a0578063248a9ca3146101d55780632f2ff15d146101f8578063334a29cc1461020d57806336568abe14610220575b600080fd5b61018b610186366004611186565b6103e0565b60405190151581526020015b60405180910390f35b6101c77fd32fd1ee5f4f111da6f27444787e5200ec57a8849509c00ef2998467052b32a381565b604051908152602001610197565b6101c76101e33660046111b0565b60009081526020819052604090206001015490565b61020b6102063660046111de565b610417565b005b61020b61021b36600461120e565b610442565b61020b61022e3660046111de565b610480565b6102466102413660046111b0565b6104c8565b6040516001600160a01b039091168152602001610197565b61020b61026c366004611283565b6104f8565b61018b61027f3660046112af565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0390811691161490565b6102b9601581565b60405160ff9091168152602001610197565b6101c76000805160206115ed83398151915281565b61018b6102ee3660046112db565b61051a565b7f0000000000000000000000000000000000000000000000000000000000000000610246565b61032c6103273660046112db565b610536565b60405161019791906112f8565b6101c76103473660046112af565b6105cc565b61020b6105d9565b6002546101c7565b61018b61036a3660046111de565b6105fc565b6101c7600081565b61037f610625565b6040516101979190611347565b61018b61039a366004611394565b610687565b61020b6103ad3660046112af565b610711565b6102b96103c0366004611394565b61076c565b61020b6103d33660046111de565b610a1c565b6102b9601681565b60006001600160e01b03198216637965db0b60e01b148061041157506301ffc9a760e01b6001600160e01b03198316145b92915050565b60008281526020819052604090206001015461043281610a41565b61043c8383610a52565b50505050565b6000805160206115ed83398151915261045a81610a41565b6002541561046a5761046a610ae5565b6104748383610b75565b61043c6002848461110e565b610488610d10565b6001600160a01b0316816001600160a01b0316146104b95760405163334bd91960e11b815260040160405180910390fd5b6104c38282610d1f565b505050565b6000600282815481106104dd576104dd6113d5565b6000918252602090912001546001600160a01b031692915050565b6000805160206115ed83398151915261051081610a41565b6104c38383610da8565b600060ff821660151480610411575060ff821660161492915050565b606060141960ff831601610563576040518060600160405280602281526020016116326022913992915050565b60151960ff83160161058e5760405180606001604052806025815260200161160d6025913992915050565b505060408051808201909152601881527f556e6b6e6f776e207265737472696374696f6e20636f64650000000000000000602082015290565b919050565b6000610411600283610dec565b6000805160206115ed8339815191526105f181610a41565b6105f9610ae5565b50565b6000918252602082815260408084206001600160a01b0393909316845291905290205460ff1690565b6060600280548060200260200160405190810160405280929190818152602001828054801561067d57602002820191906000526020600020905b81546001600160a01b0316815260019091019060200180831161065f575b5050505050905090565b60405163d4ce141560e01b81526001600160a01b03848116600483015283166024820152604481018290526000908190309063d4ce141590606401602060405180830381865afa1580156106df573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061070391906113eb565b60ff161490505b9392505050565b6000805160206115ed83398151915261072981610a41565b610734600283610e4a565b6040516001600160a01b038316907f60305ce6c9104acd0969d358f926bf391174340660aaf5e6215261fd6847bf4690600090a25050565b6040805160028082526060820183526000928392919060208301908036833750506040805160028082526060820183529394506000939092509060208301908036833750506040805160028082526060820183529394506000939092509060208301908036833701905050905086836000815181106107ed576107ed6113d5565b60200260200101906001600160a01b031690816001600160a01b0316815250508583600181518110610821576108216113d5565b6001600160a01b039092166020928302919091019091015260025460005b818110156109b6576002818154811061085a5761085a6113d5565b60009182526020909120015460405163051b206960e11b81526001600160a01b0390911690630a3640d290610893908890600401611347565b600060405180830381865afa1580156108b0573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526108d8919081019061142e565b9350836000815181106108ed576108ed6113d5565b6020026020010151801561091957508260008151811061090f5761090f6113d5565b6020026020010151155b1561094457600183600081518110610933576109336113d5565b911515602092830291909101909101525b83600181518110610957576109576113d5565b60200260200101518015610983575082600181518110610979576109796113d5565b6020026020010151155b156109ae5760018360018151811061099d5761099d6113d5565b911515602092830291909101909101525b60010161083f565b50816000815181106109ca576109ca6113d5565b60200260200101516109e357601594505050505061070a565b816001815181106109f6576109f66113d5565b6020026020010151610a0f57601694505050505061070a565b600094505050505061070a565b600082815260208190526040902060010154610a3781610a41565b61043c8383610d1f565b6105f981610a4d610d10565b610ef6565b6000610a5e83836105fc565b610add576000838152602081815260408083206001600160a01b03861684529091529020805460ff19166001179055610a95610d10565b6001600160a01b0316826001600160a01b0316847f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a4506001610411565b506000610411565b6002546000905b8015610b3957600181039150610b2960028381548110610b0e57610b0e6113d5565b6000918252602090912001546001600160a01b031683610da8565b610b3281611509565b9050610aec565b507f93dd3e43e4773b52a627c0ce6a20183638a2d2a264cfc9b6b7da0cccc95ea4b26002604051610b6a9190611520565b60405180910390a150565b6000819003610b9757604051630b9b3e5960e21b815260040160405180910390fd5b60005b818110156104c3576000838383818110610bb657610bb66113d5565b9050602002016020810190610bcb91906112af565b6001600160a01b031603610bf2576040516350092f7560e11b815260040160405180910390fd5b60016000848484818110610c0857610c086113d5565b9050602002016020810190610c1d91906112af565b6001600160a01b0316815260208101919091526040016000205460ff1615610c585760405163860d015160e01b815260040160405180910390fd5b6001806000858585818110610c6f57610c6f6113d5565b9050602002016020810190610c8491906112af565b6001600160a01b031681526020810191909152604001600020805460ff1916911515919091179055828282818110610cbe57610cbe6113d5565b9050602002016020810190610cd391906112af565b6001600160a01b03167f60305ce6c9104acd0969d358f926bf391174340660aaf5e6215261fd6847bf4660405160405180910390a2600101610b9a565b6000610d1a610f37565b905090565b6000610d2b83836105fc565b15610add576000838152602081815260408083206001600160a01b03861684529091529020805460ff19169055610d60610d10565b6001600160a01b0316826001600160a01b0316847ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a4506001610411565b610db460028383610fac565b6040516001600160a01b038316907f6d83315c9718799346b67584ec64301b1457e989c8e35a8e2982a7776c04bfc490600090a25050565b81546000905b80821015610e4157826001600160a01b0316848381548110610e1657610e166113d5565b6000918252602090912001546001600160a01b031603610e365750610411565b816001019150610df2565b50509054919050565b6001600160a01b038116610e71576040516350092f7560e11b815260040160405180910390fd5b6001600160a01b03811660009081526001602052604090205460ff1615610eab5760405163860d015160e01b815260040160405180910390fd5b8154600181810184556000938452602080852090920180546001600160a01b039094166001600160a01b0319909416841790559183528190526040909120805460ff19169091179055565b610f0082826105fc565b610f335760405163e2517d3f60e01b81526001600160a01b03821660048201526024810183905260440160405180910390fd5b5050565b6000366014336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148015610f745750808210155b15610fa457600036610f868385611564565b610f91928290611577565b610f9a916115a1565b60601c9250505090565b339250505090565b816001600160a01b0316838281548110610fc857610fc86113d5565b6000918252602090912001546001600160a01b031614610ffb57604051632f64842d60e11b815260040160405180910390fd5b825461100990600190611564565b811461108e578254839061101f90600190611564565b8154811061102f5761102f6113d5565b9060005260206000200160009054906101000a90046001600160a01b031683828154811061105f5761105f6113d5565b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b031602179055505b8280548061109e5761109e6115d6565b60008281526020808220830160001990810180546001600160a01b03191690559092019092556001600160a01b03841680835260019091526040808320805460ff191690555190917f6d83315c9718799346b67584ec64301b1457e989c8e35a8e2982a7776c04bfc491a2505050565b828054828255906000526020600020908101928215611161579160200282015b828111156111615781546001600160a01b0319166001600160a01b0384351617825560209092019160019091019061112e565b5061116d929150611171565b5090565b5b8082111561116d5760008155600101611172565b60006020828403121561119857600080fd5b81356001600160e01b03198116811461070a57600080fd5b6000602082840312156111c257600080fd5b5035919050565b6001600160a01b03811681146105f957600080fd5b600080604083850312156111f157600080fd5b823591506020830135611203816111c9565b809150509250929050565b6000806020838503121561122157600080fd5b823567ffffffffffffffff8082111561123957600080fd5b818501915085601f83011261124d57600080fd5b81358181111561125c57600080fd5b8660208260051b850101111561127157600080fd5b60209290920196919550909350505050565b6000806040838503121561129657600080fd5b82356112a1816111c9565b946020939093013593505050565b6000602082840312156112c157600080fd5b813561070a816111c9565b60ff811681146105f957600080fd5b6000602082840312156112ed57600080fd5b813561070a816112cc565b60006020808352835180602085015260005b818110156113265785810183015185820160400152820161130a565b506000604082860101526040601f19601f8301168501019250505092915050565b6020808252825182820181905260009190848201906040850190845b818110156113885783516001600160a01b031683529284019291840191600101611363565b50909695505050505050565b6000806000606084860312156113a957600080fd5b83356113b4816111c9565b925060208401356113c4816111c9565b929592945050506040919091013590565b634e487b7160e01b600052603260045260246000fd5b6000602082840312156113fd57600080fd5b815161070a816112cc565b634e487b7160e01b600052604160045260246000fd5b805180151581146105c757600080fd5b6000602080838503121561144157600080fd5b825167ffffffffffffffff8082111561145957600080fd5b818501915085601f83011261146d57600080fd5b81518181111561147f5761147f611408565b8060051b604051601f19603f830116810181811085821117156114a4576114a4611408565b6040529182528482019250838101850191888311156114c257600080fd5b938501935b828510156114e7576114d88561141e565b845293850193928501926114c7565b98975050505050505050565b634e487b7160e01b600052601160045260246000fd5b600081611518576115186114f3565b506000190190565b6020808252825482820181905260008481528281209092916040850190845b818110156113885783546001600160a01b03168352600193840193928501920161153f565b81810381811115610411576104116114f3565b6000808585111561158757600080fd5b8386111561159457600080fd5b5050820193919092039150565b6bffffffffffffffffffffffff1981358181169160148510156115ce5780818660140360031b1b83161692505b505092915050565b634e487b7160e01b600052603160045260246000fdfeb3c151d85eb431da97012a1682e6ab41bddc7db1012e7c40bd326c24bf56f99954686520726563697069656e74206973206e6f7420696e207468652077686974656c6973745468652073656e646572206973206e6f7420696e207468652077686974656c697374a2646970667358221220c9bcc22ff72080e0282cf07f741b675b81145f982e8e2d2edd186a14334e038e64736f6c63430008160033","sourceMap":"378:3013:101:-:0;;;672:341;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;1498:37:66;;;;;810:19:101;::::1;806:100;;852:43;;-1:-1:-1::0;;;852:43:101::1;;;;;;;;;;;806:100;915:37;2232:4:62;946:5:101::0;915:10:::1;:37::i;:::-;-1:-1:-1::0;962:44:101::1;726:38:90;1000:5:101::0;962:10:::1;:44::i;:::-;;672:341:::0;;378:3013;;6179:316:62;6256:4;2954:12;;;;;;;;;;;-1:-1:-1;;;;;2954:29:62;;;;;;;;;;;;6272:217;;6315:6;:12;;;;;;;;;;;-1:-1:-1;;;;;6315:29:62;;;;;;;;;:36;;-1:-1:-1;;6315:36:62;6347:4;6315:36;;;6397:12;:10;:12::i;:::-;-1:-1:-1;;;;;6370:40:62;6388:7;-1:-1:-1;;;;;6370:40:62;6382:4;6370:40;;;;;;;;;;-1:-1:-1;6431:4:62;6424:11;;6272:217;-1:-1:-1;6473:5:62;6272:217;6179:316;;;;:::o;2632:182:101:-;2743:14;2780:27;:25;:27::i;:::-;2773:34;;2632:182;:::o;2204:429:66:-;2266:7;2310:8;3481:2;2401:30;2420:10;2401:18;:30::i;:::-;:71;;;;;2453:19;2435:14;:37;;2401:71;2397:230;;;2511:8;;2520:36;2537:19;2520:14;:36;:::i;:::-;2511:47;;;;;:::i;:::-;2503:56;;;:::i;:::-;2495:65;;2488:72;;;;2204:429;:::o;2397:230::-;735:10:73;2591:25:66;;;;2204:429;:::o;1830:137::-;1906:4;1942:18;1705:17;;;1622:107;1942:18;-1:-1:-1;;;;;1929:31:66;:9;-1:-1:-1;;;;;1929:31:66;;1922:38;;1830:137;;;:::o;14:177:139:-;93:13;;-1:-1:-1;;;;;135:31:139;;125:42;;115:70;;181:1;178;171:12;115:70;14:177;;;:::o;196:293::-;275:6;283;336:2;324:9;315:7;311:23;307:32;304:52;;;352:1;349;342:12;304:52;375:40;405:9;375:40;:::i;:::-;365:50;;434:49;479:2;468:9;464:18;434:49;:::i;:::-;424:59;;196:293;;;;;:::o;494:225::-;561:9;;;582:11;;;579:134;;;635:10;630:3;626:20;623:1;616:31;670:4;667:1;660:15;698:4;695:1;688:15;724:331;829:9;840;882:8;870:10;867:24;864:44;;;904:1;901;894:12;864:44;933:6;923:8;920:20;917:40;;;953:1;950;943:12;917:40;-1:-1:-1;;979:23:139;;;1024:25;;;;;-1:-1:-1;724:331:139:o;1060:329::-;-1:-1:-1;;;;;;1181:19:139;;1260:11;;;;1291:2;1283:11;;1280:103;;;1370:2;1364;1357:3;1353:2;1349:12;1346:1;1342:20;1338:29;1334:2;1330:38;1326:47;1317:56;;1280:103;;;1060:329;;;;:::o;:::-;378:3013:101;;;;;;;;;;;;;;;;;;;;;;","linkReferences":{}},"deployedBytecode":{"object":"0x608060405234801561001057600080fd5b50600436106101735760003560e01c80637da0a877116100de578063a217fddf11610097578063cd1d4dc711610071578063cd1d4dc71461039f578063d4ce1415146103b2578063d547741f146103c5578063db136dad146103d857600080fd5b8063a217fddf1461036f578063c57086a114610377578063c6946a121461038c57600080fd5b80637da0a877146102f35780637f4ab1dd1461031957806383304df0146103395780638a1b6c8e1461034c5780638a2021b11461035457806391d148541461035c57600080fd5b8063397a7d3c11610130578063397a7d3c146102335780634d53374e1461025e578063572b6c05146102715780635b119c0a146102b15780636728f545146102cb5780637d045df6146102e057600080fd5b806301ffc9a7146101785780630fbbfb55146101a0578063248a9ca3146101d55780632f2ff15d146101f8578063334a29cc1461020d57806336568abe14610220575b600080fd5b61018b610186366004611186565b6103e0565b60405190151581526020015b60405180910390f35b6101c77fd32fd1ee5f4f111da6f27444787e5200ec57a8849509c00ef2998467052b32a381565b604051908152602001610197565b6101c76101e33660046111b0565b60009081526020819052604090206001015490565b61020b6102063660046111de565b610417565b005b61020b61021b36600461120e565b610442565b61020b61022e3660046111de565b610480565b6102466102413660046111b0565b6104c8565b6040516001600160a01b039091168152602001610197565b61020b61026c366004611283565b6104f8565b61018b61027f3660046112af565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0390811691161490565b6102b9601581565b60405160ff9091168152602001610197565b6101c76000805160206115ed83398151915281565b61018b6102ee3660046112db565b61051a565b7f0000000000000000000000000000000000000000000000000000000000000000610246565b61032c6103273660046112db565b610536565b60405161019791906112f8565b6101c76103473660046112af565b6105cc565b61020b6105d9565b6002546101c7565b61018b61036a3660046111de565b6105fc565b6101c7600081565b61037f610625565b6040516101979190611347565b61018b61039a366004611394565b610687565b61020b6103ad3660046112af565b610711565b6102b96103c0366004611394565b61076c565b61020b6103d33660046111de565b610a1c565b6102b9601681565b60006001600160e01b03198216637965db0b60e01b148061041157506301ffc9a760e01b6001600160e01b03198316145b92915050565b60008281526020819052604090206001015461043281610a41565b61043c8383610a52565b50505050565b6000805160206115ed83398151915261045a81610a41565b6002541561046a5761046a610ae5565b6104748383610b75565b61043c6002848461110e565b610488610d10565b6001600160a01b0316816001600160a01b0316146104b95760405163334bd91960e11b815260040160405180910390fd5b6104c38282610d1f565b505050565b6000600282815481106104dd576104dd6113d5565b6000918252602090912001546001600160a01b031692915050565b6000805160206115ed83398151915261051081610a41565b6104c38383610da8565b600060ff821660151480610411575060ff821660161492915050565b606060141960ff831601610563576040518060600160405280602281526020016116326022913992915050565b60151960ff83160161058e5760405180606001604052806025815260200161160d6025913992915050565b505060408051808201909152601881527f556e6b6e6f776e207265737472696374696f6e20636f64650000000000000000602082015290565b919050565b6000610411600283610dec565b6000805160206115ed8339815191526105f181610a41565b6105f9610ae5565b50565b6000918252602082815260408084206001600160a01b0393909316845291905290205460ff1690565b6060600280548060200260200160405190810160405280929190818152602001828054801561067d57602002820191906000526020600020905b81546001600160a01b0316815260019091019060200180831161065f575b5050505050905090565b60405163d4ce141560e01b81526001600160a01b03848116600483015283166024820152604481018290526000908190309063d4ce141590606401602060405180830381865afa1580156106df573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061070391906113eb565b60ff161490505b9392505050565b6000805160206115ed83398151915261072981610a41565b610734600283610e4a565b6040516001600160a01b038316907f60305ce6c9104acd0969d358f926bf391174340660aaf5e6215261fd6847bf4690600090a25050565b6040805160028082526060820183526000928392919060208301908036833750506040805160028082526060820183529394506000939092509060208301908036833750506040805160028082526060820183529394506000939092509060208301908036833701905050905086836000815181106107ed576107ed6113d5565b60200260200101906001600160a01b031690816001600160a01b0316815250508583600181518110610821576108216113d5565b6001600160a01b039092166020928302919091019091015260025460005b818110156109b6576002818154811061085a5761085a6113d5565b60009182526020909120015460405163051b206960e11b81526001600160a01b0390911690630a3640d290610893908890600401611347565b600060405180830381865afa1580156108b0573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526108d8919081019061142e565b9350836000815181106108ed576108ed6113d5565b6020026020010151801561091957508260008151811061090f5761090f6113d5565b6020026020010151155b1561094457600183600081518110610933576109336113d5565b911515602092830291909101909101525b83600181518110610957576109576113d5565b60200260200101518015610983575082600181518110610979576109796113d5565b6020026020010151155b156109ae5760018360018151811061099d5761099d6113d5565b911515602092830291909101909101525b60010161083f565b50816000815181106109ca576109ca6113d5565b60200260200101516109e357601594505050505061070a565b816001815181106109f6576109f66113d5565b6020026020010151610a0f57601694505050505061070a565b600094505050505061070a565b600082815260208190526040902060010154610a3781610a41565b61043c8383610d1f565b6105f981610a4d610d10565b610ef6565b6000610a5e83836105fc565b610add576000838152602081815260408083206001600160a01b03861684529091529020805460ff19166001179055610a95610d10565b6001600160a01b0316826001600160a01b0316847f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a4506001610411565b506000610411565b6002546000905b8015610b3957600181039150610b2960028381548110610b0e57610b0e6113d5565b6000918252602090912001546001600160a01b031683610da8565b610b3281611509565b9050610aec565b507f93dd3e43e4773b52a627c0ce6a20183638a2d2a264cfc9b6b7da0cccc95ea4b26002604051610b6a9190611520565b60405180910390a150565b6000819003610b9757604051630b9b3e5960e21b815260040160405180910390fd5b60005b818110156104c3576000838383818110610bb657610bb66113d5565b9050602002016020810190610bcb91906112af565b6001600160a01b031603610bf2576040516350092f7560e11b815260040160405180910390fd5b60016000848484818110610c0857610c086113d5565b9050602002016020810190610c1d91906112af565b6001600160a01b0316815260208101919091526040016000205460ff1615610c585760405163860d015160e01b815260040160405180910390fd5b6001806000858585818110610c6f57610c6f6113d5565b9050602002016020810190610c8491906112af565b6001600160a01b031681526020810191909152604001600020805460ff1916911515919091179055828282818110610cbe57610cbe6113d5565b9050602002016020810190610cd391906112af565b6001600160a01b03167f60305ce6c9104acd0969d358f926bf391174340660aaf5e6215261fd6847bf4660405160405180910390a2600101610b9a565b6000610d1a610f37565b905090565b6000610d2b83836105fc565b15610add576000838152602081815260408083206001600160a01b03861684529091529020805460ff19169055610d60610d10565b6001600160a01b0316826001600160a01b0316847ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a4506001610411565b610db460028383610fac565b6040516001600160a01b038316907f6d83315c9718799346b67584ec64301b1457e989c8e35a8e2982a7776c04bfc490600090a25050565b81546000905b80821015610e4157826001600160a01b0316848381548110610e1657610e166113d5565b6000918252602090912001546001600160a01b031603610e365750610411565b816001019150610df2565b50509054919050565b6001600160a01b038116610e71576040516350092f7560e11b815260040160405180910390fd5b6001600160a01b03811660009081526001602052604090205460ff1615610eab5760405163860d015160e01b815260040160405180910390fd5b8154600181810184556000938452602080852090920180546001600160a01b039094166001600160a01b0319909416841790559183528190526040909120805460ff19169091179055565b610f0082826105fc565b610f335760405163e2517d3f60e01b81526001600160a01b03821660048201526024810183905260440160405180910390fd5b5050565b6000366014336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148015610f745750808210155b15610fa457600036610f868385611564565b610f91928290611577565b610f9a916115a1565b60601c9250505090565b339250505090565b816001600160a01b0316838281548110610fc857610fc86113d5565b6000918252602090912001546001600160a01b031614610ffb57604051632f64842d60e11b815260040160405180910390fd5b825461100990600190611564565b811461108e578254839061101f90600190611564565b8154811061102f5761102f6113d5565b9060005260206000200160009054906101000a90046001600160a01b031683828154811061105f5761105f6113d5565b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b031602179055505b8280548061109e5761109e6115d6565b60008281526020808220830160001990810180546001600160a01b03191690559092019092556001600160a01b03841680835260019091526040808320805460ff191690555190917f6d83315c9718799346b67584ec64301b1457e989c8e35a8e2982a7776c04bfc491a2505050565b828054828255906000526020600020908101928215611161579160200282015b828111156111615781546001600160a01b0319166001600160a01b0384351617825560209092019160019091019061112e565b5061116d929150611171565b5090565b5b8082111561116d5760008155600101611172565b60006020828403121561119857600080fd5b81356001600160e01b03198116811461070a57600080fd5b6000602082840312156111c257600080fd5b5035919050565b6001600160a01b03811681146105f957600080fd5b600080604083850312156111f157600080fd5b823591506020830135611203816111c9565b809150509250929050565b6000806020838503121561122157600080fd5b823567ffffffffffffffff8082111561123957600080fd5b818501915085601f83011261124d57600080fd5b81358181111561125c57600080fd5b8660208260051b850101111561127157600080fd5b60209290920196919550909350505050565b6000806040838503121561129657600080fd5b82356112a1816111c9565b946020939093013593505050565b6000602082840312156112c157600080fd5b813561070a816111c9565b60ff811681146105f957600080fd5b6000602082840312156112ed57600080fd5b813561070a816112cc565b60006020808352835180602085015260005b818110156113265785810183015185820160400152820161130a565b506000604082860101526040601f19601f8301168501019250505092915050565b6020808252825182820181905260009190848201906040850190845b818110156113885783516001600160a01b031683529284019291840191600101611363565b50909695505050505050565b6000806000606084860312156113a957600080fd5b83356113b4816111c9565b925060208401356113c4816111c9565b929592945050506040919091013590565b634e487b7160e01b600052603260045260246000fd5b6000602082840312156113fd57600080fd5b815161070a816112cc565b634e487b7160e01b600052604160045260246000fd5b805180151581146105c757600080fd5b6000602080838503121561144157600080fd5b825167ffffffffffffffff8082111561145957600080fd5b818501915085601f83011261146d57600080fd5b81518181111561147f5761147f611408565b8060051b604051601f19603f830116810181811085821117156114a4576114a4611408565b6040529182528482019250838101850191888311156114c257600080fd5b938501935b828510156114e7576114d88561141e565b845293850193928501926114c7565b98975050505050505050565b634e487b7160e01b600052601160045260246000fd5b600081611518576115186114f3565b506000190190565b6020808252825482820181905260008481528281209092916040850190845b818110156113885783546001600160a01b03168352600193840193928501920161153f565b81810381811115610411576104116114f3565b6000808585111561158757600080fd5b8386111561159457600080fd5b5050820193919092039150565b6bffffffffffffffffffffffff1981358181169160148510156115ce5780818660140360031b1b83161692505b505092915050565b634e487b7160e01b600052603160045260246000fdfeb3c151d85eb431da97012a1682e6ab41bddc7db1012e7c40bd326c24bf56f99954686520726563697069656e74206973206e6f7420696e207468652077686974656c6973745468652073656e646572206973206e6f7420696e207468652077686974656c697374a2646970667358221220c9bcc22ff72080e0282cf07f741b675b81145f982e8e2d2edd186a14334e038e64736f6c63430008160033","sourceMap":"378:3013:101:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2565:202:62;;;;;;:::i;:::-;;:::i;:::-;;;470:14:139;;463:22;445:41;;433:2;418:18;2565:202:62;;;;;;;;802:86:90;;856:32;802:86;;;;;643:25:139;;;631:2;616:18;802:86:90;497:177:139;3810:120:62;;;;;;:::i;:::-;3875:7;3901:12;;;;;;;;;;:22;;;;3810:120;4226:136;;;;;;:::i;:::-;;:::i;:::-;;797:280:93;;;;;;:::i;:::-;;:::i;5328:245:62:-;;;;;;:::i;:::-;;:::i;4051:143:93:-;;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;2289:32:139;;;2271:51;;2259:2;2244:18;4051:143:93;2125:203:139;2580:194:93;;;;;;:::i;:::-;;:::i;1830:137:66:-;;;;;;:::i;:::-;1705:17;-1:-1:-1;;;;;1929:31:66;;;;;;;1830:137;490:60:106;;548:2;490:60;;;;;3102:4:139;3090:17;;;3072:36;;3060:2;3045:18;490:60:106;2930:184:139;666:98:90;;-1:-1:-1;;;;;;;;;;;666:98:90;;511:274:110;;;;;;:::i;:::-;;:::i;1622:107:66:-;1705:17;1622:107;;977:447:110;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;3706:190:93:-;;;;;;:::i;:::-;;:::i;1163:115::-;;;:::i;3432:120::-;3522:16;:23;3432:120;;2854:136:62;;;;;;:::i;:::-;;:::i;2187:49::-;;2232:4;2187:49;;4282:153:93;;;:::i;:::-;;;;;;;:::i;418:355:109:-;;;;;;:::i;:::-;;:::i;1963:217:93:-;;;;;;:::i;:::-;;:::i;1284:1247:101:-;;;;;;:::i;:::-;;:::i;4642:138:62:-;;;;;;:::i;:::-;;:::i;556:58:106:-;;612:2;556:58;;2565:202:62;2650:4;-1:-1:-1;;;;;;2673:47:62;;-1:-1:-1;;;2673:47:62;;:87;;-1:-1:-1;;;;;;;;;;861:40:78;;;2724:36:62;2666:94;2565:202;-1:-1:-1;;2565:202:62:o;4226:136::-;3875:7;3901:12;;;;;;;;;;:22;;;2464:16;2475:4;2464:10;:16::i;:::-;4330:25:::1;4341:4;4347:7;4330:10;:25::i;:::-;;4226:136:::0;;;:::o;797:280:93:-;-1:-1:-1;;;;;;;;;;;2464:16:62;2475:4;2464:10;:16::i;:::-;932::93::1;:23:::0;:27;928:81:::1;;975:23;:21;:23::i;:::-;1018:17;1028:6;;1018:9;:17::i;:::-;1045:25;:16;1064:6:::0;;1045:25:::1;:::i;5328:245:62:-:0;5443:12;:10;:12::i;:::-;-1:-1:-1;;;;;5421:34:62;:18;-1:-1:-1;;;;;5421:34:62;;5417:102;;5478:30;;-1:-1:-1;;;5478:30:62;;;;;;;;;;;5417:102;5529:37;5541:4;5547:18;5529:11;:37::i;:::-;;5328:245;;:::o;4051:143:93:-;4137:7;4163:16;4180:6;4163:24;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;4163:24:93;;4051:143;-1:-1:-1;;4051:143:93:o;2580:194::-;-1:-1:-1;;;;;;;;;;;2464:16:62;2475:4;2464:10;:16::i;:::-;2723:44:93::1;2753:5;2761;2723:21;:44::i;511:274:110:-:0;623:4;658:53;;;548:2:106;658:53:110;;:120;;-1:-1:-1;727:51:110;;;612:2:106;727:51:110;639:139;511:274;-1:-1:-1;;511:274:110:o;977:447::-;1086:13;-1:-1:-1;;1115:53:110;;;;1111:307;;1191:33;;;;;;;;;;;;;;;;;1184:40;977:447;-1:-1:-1;;977:447:110:o;1111:307::-;-1:-1:-1;;1245:51:110;;;;1241:177;;1319:31;;;;;;;;;;;;;;;;;1312:38;977:447;-1:-1:-1;;977:447:110:o;1241:177::-;-1:-1:-1;;1388:19:110;;;;;;;;;;;;;;;;;;977:447::o;1241:177::-;977:447;;;:::o;3706:190:93:-;3798:13;3830:59;3856:16;3882:5;3830:25;:59::i;1163:115::-;-1:-1:-1;;;;;;;;;;;2464:16:62;2475:4;2464:10;:16::i;:::-;1248:23:93::1;:21;:23::i;:::-;1163:115:::0;:::o;2854:136:62:-;2931:4;2954:12;;;;;;;;;;;-1:-1:-1;;;;;2954:29:62;;;;;;;;;;;;;;;2854:136::o;4282:153:93:-;4373:16;4412;4405:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;4405:23:93;;;;;;;;;;;;;;;;;;;;;;;4282:153;:::o;418:355:109:-;662:51;;-1:-1:-1;;;662:51:109;;-1:-1:-1;;;;;6144:15:139;;;662:51:109;;;6126:34:139;6196:15;;6176:18;;;6169:43;6228:18;;;6221:34;;;549:12:109;;;;662:4;;:30;;6061:18:139;;662:51:109;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:104;;;643:123;;418:355;;;;;;:::o;1963:217:93:-;-1:-1:-1;;;;;;;;;;;2464:16:62;2475:4;2464:10;:16::i;:::-;2080:55:93::1;2102:16;2128:5;2080:21;:55::i;:::-;2150:23;::::0;-1:-1:-1;;;;;2150:23:93;::::1;::::0;::::1;::::0;;;::::1;1963:217:::0;;:::o;1284:1247:101:-;1478:16;;;1492:1;1478:16;;;;;;;;1428:5;;;;1478:16;1492:1;1478:16;;;;;;;;-1:-1:-1;;1529:13:101;;;1540:1;1529:13;;;;;;;;1445:49;;-1:-1:-1;1504:22:101;;1529:13;;-1:-1:-1;1540:1:101;1529:13;;;;;;;;-1:-1:-1;;1575:13:101;;;1586:1;1575:13;;;;;;;;1504:38;;-1:-1:-1;1552:20:101;;1575:13;;-1:-1:-1;1586:1:101;1575:13;;;;;;;;;;-1:-1:-1;1575:13:101;1552:36;;1617:5;1598:13;1612:1;1598:16;;;;;;;;:::i;:::-;;;;;;:24;-1:-1:-1;;;;;1598:24:101;;;-1:-1:-1;;;;;1598:24:101;;;;;1651:3;1632:13;1646:1;1632:16;;;;;;;;:::i;:::-;-1:-1:-1;;;;;1632:22:101;;;:16;;;;;;;;;;;:22;1686:16;:23;1664:19;1797:478;1821:11;1817:1;:15;1797:478;;;1909:16;1926:1;1909:19;;;;;;;;:::i;:::-;;;;;;;;;;;1893:89;;-1:-1:-1;;;1893:89:101;;-1:-1:-1;;;;;1909:19:101;;;;1893:74;;:89;;1968:13;;1893:89;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;1893:89:101;;;;;;;;;;;;:::i;:::-;1882:100;;2000:8;2009:1;2000:11;;;;;;;;:::i;:::-;;;;;;;:25;;;;;2016:6;2023:1;2016:9;;;;;;;;:::i;:::-;;;;;;;2015:10;2000:25;1996:129;;;2106:4;2094:6;2101:1;2094:9;;;;;;;;:::i;:::-;:16;;;:9;;;;;;;;;;;:16;1996:129;2142:8;2151:1;2142:11;;;;;;;;:::i;:::-;;;;;;;:25;;;;;2158:6;2165:1;2158:9;;;;;;;;:::i;:::-;;;;;;;2157:10;2142:25;2138:127;;;2246:4;2234:6;2241:1;2234:9;;;;;;;;:::i;:::-;:16;;;:9;;;;;;;;;;;:16;2138:127;1834:3;;1797:478;;;;2289:6;2296:1;2289:9;;;;;;;;:::i;:::-;;;;;;;2284:241;;548:2:106;2314:40:101;;;;;;;;2284:241;2376:6;2383:1;2376:9;;;;;;;;:::i;:::-;;;;;;;2371:154;;612:2:106;2401:38:101;;;;;;;;2371:154;2483:30;2470:44;;;;;;;;4642:138:62;3875:7;3901:12;;;;;;;;;;:22;;;2464:16;2475:4;2464:10;:16::i;:::-;4747:26:::1;4759:4;4765:7;4747:11;:26::i;3199:103::-:0;3265:30;3276:4;3282:12;:10;:12::i;:::-;3265:10;:30::i;6179:316::-;6256:4;6277:22;6285:4;6291:7;6277;:22::i;:::-;6272:217;;6315:6;:12;;;;;;;;;;;-1:-1:-1;;;;;6315:29:62;;;;;;;;;:36;;-1:-1:-1;;6315:36:62;6347:4;6315:36;;;6397:12;:10;:12::i;:::-;-1:-1:-1;;;;;6370:40:62;6388:7;-1:-1:-1;;;;;6370:40:62;6382:4;6370:40;;;;;;;;;;-1:-1:-1;6431:4:62;6424:11;;6272:217;-1:-1:-1;6473:5:62;6466:12;;1364:444:93;1528:16;:23;1416:13;;1511:248;1553:5;;1511:248;;1666:1;1662;:5;1654:13;;1695:53;1717:16;1734:5;1717:23;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;1717:23:93;1742:5;1695:21;:53::i;:::-;1560:3;;;:::i;:::-;;;1511:248;;;;1773:28;1784:16;1773:28;;;;;;:::i;:::-;;;;;;;;1406:402;1364:444::o;596:600:94:-;682:1;665:18;;;661:81;;706:25;;-1:-1:-1;;;706:25:94;;;;;;;;;;;661:81;756:9;751:439;771:17;;;751:439;;;840:3;818:6;;825:1;818:9;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;810:34:94;;806:118;;871:38;;-1:-1:-1;;;871:38:94;;;;;;;;;;;806:118;941:14;:25;956:6;;963:1;956:9;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;941:25:94;;;;;;;;;;;;-1:-1:-1;941:25:94;;;;937:101;;;993:30;;-1:-1:-1;;;993:30:94;;;;;;;;;;;937:101;1079:4;1051:14;:25;1066:6;;1073:1;1066:9;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;1051:25:94;;;;;;;;;;;;-1:-1:-1;1051:25:94;:32;;-1:-1:-1;;1051:32:94;;;;;;;;;;1110:6;;1117:1;1110:9;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;1102:18:94;;;;;;;;;;;1162:3;;751:439;;2632:182:101;2743:14;2780:27;:25;:27::i;:::-;2773:34;;2632:182;:::o;6730:317:62:-;6808:4;6828:22;6836:4;6842:7;6828;:22::i;:::-;6824:217;;;6898:5;6866:12;;;;;;;;;;;-1:-1:-1;;;;;6866:29:62;;;;;;;;;:37;;-1:-1:-1;;6866:37:62;;;6949:12;:10;:12::i;:::-;-1:-1:-1;;;;;6922:40:62;6940:7;-1:-1:-1;;;;;6922:40:62;6934:4;6922:40;;;;;;;;;;-1:-1:-1;6983:4:62;6976:11;;3174:184:93;3254:56;3279:16;3297:5;3304;3254:24;:56::i;:::-;3325:26;;-1:-1:-1;;;;;3325:26:93;;;;;;;;3174:184;;:::o;2668:413:94:-;2823:13;;2776;;2846:199;2870:11;2862:5;:19;2846:199;;;2920:5;-1:-1:-1;;;;;2903:22:94;:6;2910:5;2903:13;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;2903:13:94;:22;2899:73;;2945:12;;;2899:73;3013:7;;;;;2846:199;;;-1:-1:-1;;3061:13:94;;;2668:413;-1:-1:-1;2668:413:94:o;1351:354::-;-1:-1:-1;;;;;1433:30:94;;1429:106;;1486:38;;-1:-1:-1;;;1486:38:94;;;;;;;;;;;1429:106;-1:-1:-1;;;;;1548:21:94;;;;;;:14;:21;;;;;;;;1544:89;;;1592:30;;-1:-1:-1;;;1592:30:94;;;;;;;;;;;1544:89;1642:18;;;;;;;;-1:-1:-1;1642:18:94;;;;;;;;;;;;-1:-1:-1;;;;;1642:18:94;;;-1:-1:-1;;;;;;1642:18:94;;;;;;;1670:21;;;;;;;;;;:28;;-1:-1:-1;;1670:28:94;;;;;;1351:354::o;3432:197:62:-;3520:22;3528:4;3534:7;3520;:22::i;:::-;3515:108;;3565:47;;-1:-1:-1;;;3565:47:62;;-1:-1:-1;;;;;9098:32:139;;3565:47:62;;;9080:51:139;9147:18;;;9140:34;;;9053:18;;3565:47:62;;;;;;;3515:108;3432:197;;:::o;2204:429:66:-;2266:7;2310:8;3481:2;2420:10;-1:-1:-1;;;;;1705:17:66;1929:31;;2401:71;;;;;2453:19;2435:14;:37;;2401:71;2397:230;;;2511:8;;2520:36;2537:19;2520:14;:36;:::i;:::-;2511:47;;;;;:::i;:::-;2503:56;;;:::i;:::-;2495:65;;2488:72;;;;2204:429;:::o;2397:230::-;735:10:73;2591:25:66;;;;2204:429;:::o;2105:419:94:-;2252:5;-1:-1:-1;;;;;2235:22:94;:6;2242:5;2235:13;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;2235:13:94;:22;2231:87;;2280:27;;-1:-1:-1;;;2280:27:94;;;;;;;;;;;2231:87;2340:13;;:17;;2356:1;;2340:17;:::i;:::-;2331:5;:26;2327:98;;2396:13;;2389:6;;2396:17;;2412:1;;2396:17;:::i;:::-;2389:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;2389:25:94;2373:6;2380:5;2373:13;;;;;;;;:::i;:::-;;;;;;;;;:41;;;;;-1:-1:-1;;;;;2373:41:94;;;;;-1:-1:-1;;;;;2373:41:94;;;;;;2327:98;2434:6;:12;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;2434:12:94;;;;;-1:-1:-1;;;;;;2434:12:94;;;;;;;;;-1:-1:-1;;;;;2456:21:94;;;;;2434:12;2456:21;;;;;;;:29;;-1:-1:-1;;2456:29:94;;;2500:17;2456:21;;2500:17;;;2105:419;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:286:139;72:6;125:2;113:9;104:7;100:23;96:32;93:52;;;141:1;138;131:12;93:52;167:23;;-1:-1:-1;;;;;;219:32:139;;209:43;;199:71;;266:1;263;256:12;679:180;738:6;791:2;779:9;770:7;766:23;762:32;759:52;;;807:1;804;797:12;759:52;-1:-1:-1;830:23:139;;679:180;-1:-1:-1;679:180:139:o;864:131::-;-1:-1:-1;;;;;939:31:139;;929:42;;919:70;;985:1;982;975:12;1000:315;1068:6;1076;1129:2;1117:9;1108:7;1104:23;1100:32;1097:52;;;1145:1;1142;1135:12;1097:52;1181:9;1168:23;1158:33;;1241:2;1230:9;1226:18;1213:32;1254:31;1279:5;1254:31;:::i;:::-;1304:5;1294:15;;;1000:315;;;;;:::o;1320:615::-;1406:6;1414;1467:2;1455:9;1446:7;1442:23;1438:32;1435:52;;;1483:1;1480;1473:12;1435:52;1523:9;1510:23;1552:18;1593:2;1585:6;1582:14;1579:34;;;1609:1;1606;1599:12;1579:34;1647:6;1636:9;1632:22;1622:32;;1692:7;1685:4;1681:2;1677:13;1673:27;1663:55;;1714:1;1711;1704:12;1663:55;1754:2;1741:16;1780:2;1772:6;1769:14;1766:34;;;1796:1;1793;1786:12;1766:34;1849:7;1844:2;1834:6;1831:1;1827:14;1823:2;1819:23;1815:32;1812:45;1809:65;;;1870:1;1867;1860:12;1809:65;1901:2;1893:11;;;;;1923:6;;-1:-1:-1;1320:615:139;;-1:-1:-1;;;;1320:615:139:o;2333:340::-;2426:6;2434;2487:2;2475:9;2466:7;2462:23;2458:32;2455:52;;;2503:1;2500;2493:12;2455:52;2542:9;2529:23;2561:31;2586:5;2561:31;:::i;:::-;2611:5;2663:2;2648:18;;;;2635:32;;-1:-1:-1;;;2333:340:139:o;2678:247::-;2737:6;2790:2;2778:9;2769:7;2765:23;2761:32;2758:52;;;2806:1;2803;2796:12;2758:52;2845:9;2832:23;2864:31;2889:5;2864:31;:::i;3119:114::-;3203:4;3196:5;3192:16;3185:5;3182:27;3172:55;;3223:1;3220;3213:12;3238:243;3295:6;3348:2;3336:9;3327:7;3323:23;3319:32;3316:52;;;3364:1;3361;3354:12;3316:52;3403:9;3390:23;3422:29;3445:5;3422:29;:::i;3486:548::-;3598:4;3627:2;3656;3645:9;3638:21;3688:6;3682:13;3731:6;3726:2;3715:9;3711:18;3704:34;3756:1;3766:140;3780:6;3777:1;3774:13;3766:140;;;3875:14;;;3871:23;;3865:30;3841:17;;;3860:2;3837:26;3830:66;3795:10;;3766:140;;;3770:3;3955:1;3950:2;3941:6;3930:9;3926:22;3922:31;3915:42;4025:2;4018;4014:7;4009:2;4001:6;3997:15;3993:29;3982:9;3978:45;3974:54;3966:62;;;;3486:548;;;;:::o;4498:658::-;4669:2;4721:21;;;4791:13;;4694:18;;;4813:22;;;4640:4;;4669:2;4892:15;;;;4866:2;4851:18;;;4640:4;4935:195;4949:6;4946:1;4943:13;4935:195;;;5014:13;;-1:-1:-1;;;;;5010:39:139;4998:52;;5105:15;;;;5070:12;;;;5046:1;4964:9;4935:195;;;-1:-1:-1;5147:3:139;;4498:658;-1:-1:-1;;;;;;4498:658:139:o;5161:456::-;5238:6;5246;5254;5307:2;5295:9;5286:7;5282:23;5278:32;5275:52;;;5323:1;5320;5313:12;5275:52;5362:9;5349:23;5381:31;5406:5;5381:31;:::i;:::-;5431:5;-1:-1:-1;5488:2:139;5473:18;;5460:32;5501:33;5460:32;5501:33;:::i;:::-;5161:456;;5553:7;;-1:-1:-1;;;5607:2:139;5592:18;;;;5579:32;;5161:456::o;5622:127::-;5683:10;5678:3;5674:20;5671:1;5664:31;5714:4;5711:1;5704:15;5738:4;5735:1;5728:15;6266:247;6334:6;6387:2;6375:9;6366:7;6362:23;6358:32;6355:52;;;6403:1;6400;6393:12;6355:52;6435:9;6429:16;6454:29;6477:5;6454:29;:::i;6518:127::-;6579:10;6574:3;6570:20;6567:1;6560:31;6610:4;6607:1;6600:15;6634:4;6631:1;6624:15;6650:164;6726:13;;6775;;6768:21;6758:32;;6748:60;;6804:1;6801;6794:12;6819:1123;6911:6;6942:2;6985;6973:9;6964:7;6960:23;6956:32;6953:52;;;7001:1;6998;6991:12;6953:52;7034:9;7028:16;7063:18;7104:2;7096:6;7093:14;7090:34;;;7120:1;7117;7110:12;7090:34;7158:6;7147:9;7143:22;7133:32;;7203:7;7196:4;7192:2;7188:13;7184:27;7174:55;;7225:1;7222;7215:12;7174:55;7254:2;7248:9;7276:2;7272;7269:10;7266:36;;;7282:18;;:::i;:::-;7328:2;7325:1;7321:10;7360:2;7354:9;7423:2;7419:7;7414:2;7410;7406:11;7402:25;7394:6;7390:38;7478:6;7466:10;7463:22;7458:2;7446:10;7443:18;7440:46;7437:72;;;7489:18;;:::i;:::-;7525:2;7518:22;7575:18;;;7609:15;;;;-1:-1:-1;7651:11:139;;;7647:20;;;7679:19;;;7676:39;;;7711:1;7708;7701:12;7676:39;7735:11;;;;7755:156;7771:6;7766:3;7763:15;7755:156;;;7837:31;7864:3;7837:31;:::i;:::-;7825:44;;7788:12;;;;7889;;;;7755:156;;;7930:6;6819:1123;-1:-1:-1;;;;;;;;6819:1123:139:o;7947:127::-;8008:10;8003:3;7999:20;7996:1;7989:31;8039:4;8036:1;8029:15;8063:4;8060:1;8053:15;8079:136;8118:3;8146:5;8136:39;;8155:18;;:::i;:::-;-1:-1:-1;;;8191:18:139;;8079:136::o;8220:681::-;8388:2;8440:21;;;8510:13;;8413:18;;;8532:22;;;8359:4;8597:17;;;8637:16;;;8359:4;;8388:2;8585;8570:18;;;8359:4;8681:194;8695:6;8692:1;8689:13;8681:194;;;8760:13;;-1:-1:-1;;;;;8756:39:139;8744:52;;8792:1;8851:14;;;;8816:12;;;;8710:9;8681:194;;9185:128;9252:9;;;9273:11;;;9270:37;;;9287:18;;:::i;9318:331::-;9423:9;9434;9476:8;9464:10;9461:24;9458:44;;;9498:1;9495;9488:12;9458:44;9527:6;9517:8;9514:20;9511:40;;;9547:1;9544;9537:12;9511:40;-1:-1:-1;;9573:23:139;;;9618:25;;;;;-1:-1:-1;9318:331:139:o;9654:337::-;-1:-1:-1;;9775:19:139;;9862:11;;;;9893:2;9885:11;;9882:103;;;9972:2;9966;9959:3;9955:2;9951:12;9948:1;9944:20;9940:29;9936:2;9932:38;9928:47;9919:56;;9882:103;;;9654:337;;;;:::o;9996:127::-;10057:10;10052:3;10048:20;10045:1;10038:31;10088:4;10085:1;10078:15;10112:4;10109:1;10102:15","linkReferences":{},"immutableReferences":{"54247":[{"start":641,"length":32},{"start":757,"length":32},{"start":3911,"length":32}]}},"methodIdentifiers":{"CODE_ADDRESS_FROM_NOT_WHITELISTED()":"5b119c0a","CODE_ADDRESS_TO_NOT_WHITELISTED()":"db136dad","DEFAULT_ADMIN_ROLE()":"a217fddf","RULE_ENGINE_OPERATOR_ROLE()":"6728f545","TOKEN_CONTRACT_ROLE()":"0fbbfb55","addRuleValidation(address)":"cd1d4dc7","canReturnTransferRestrictionCode(uint8)":"7d045df6","clearRulesValidation()":"8a1b6c8e","detectTransferRestriction(address,address,uint256)":"d4ce1415","getRoleAdmin(bytes32)":"248a9ca3","getRuleIndexValidation(address)":"83304df0","grantRole(bytes32,address)":"2f2ff15d","hasRole(bytes32,address)":"91d14854","isTrustedForwarder(address)":"572b6c05","messageForTransferRestriction(uint8)":"7f4ab1dd","removeRuleValidation(address,uint256)":"4d53374e","renounceRole(bytes32,address)":"36568abe","revokeRole(bytes32,address)":"d547741f","ruleValidation(uint256)":"397a7d3c","rulesCountValidation()":"8a2021b1","rulesValidation()":"c57086a1","setRulesValidation(address[])":"334a29cc","supportsInterface(bytes4)":"01ffc9a7","trustedForwarder()":"7da0a877","validateTransfer(address,address,uint256)":"c6946a12"},"rawMetadata":"{\"compiler\":{\"version\":\"0.8.22+commit.4fc1097e\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"admin\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"forwarderIrrevocable\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"AccessControlBadConfirmation\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"bytes32\",\"name\":\"neededRole\",\"type\":\"bytes32\"}],\"name\":\"AccessControlUnauthorizedAccount\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"RuleEngine_AdminWithAddressZeroNotAllowed\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"RuleEngine_ArrayIsEmpty\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"RuleEngine_RuleAddressZeroNotAllowed\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"RuleEngine_RuleAlreadyExists\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"RuleEngine_RuleDoNotMatch\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"rule\",\"type\":\"address\"}],\"name\":\"AddRule\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address[]\",\"name\":\"rulesRemoved\",\"type\":\"address[]\"}],\"name\":\"ClearRules\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"rule\",\"type\":\"address\"}],\"name\":\"RemoveRule\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"previousAdminRole\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"newAdminRole\",\"type\":\"bytes32\"}],\"name\":\"RoleAdminChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"RoleGranted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"RoleRevoked\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"CODE_ADDRESS_FROM_NOT_WHITELISTED\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"CODE_ADDRESS_TO_NOT_WHITELISTED\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"DEFAULT_ADMIN_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"RULE_ENGINE_OPERATOR_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"TOKEN_CONTRACT_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract IRuleValidation\",\"name\":\"rule_\",\"type\":\"address\"}],\"name\":\"addRuleValidation\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint8\",\"name\":\"_restrictionCode\",\"type\":\"uint8\"}],\"name\":\"canReturnTransferRestrictionCode\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"clearRulesValidation\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"detectTransferRestriction\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"}],\"name\":\"getRoleAdmin\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract IRuleValidation\",\"name\":\"rule_\",\"type\":\"address\"}],\"name\":\"getRuleIndexValidation\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"grantRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"hasRole\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"forwarder\",\"type\":\"address\"}],\"name\":\"isTrustedForwarder\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint8\",\"name\":\"_restrictionCode\",\"type\":\"uint8\"}],\"name\":\"messageForTransferRestriction\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract IRuleValidation\",\"name\":\"rule_\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"}],\"name\":\"removeRuleValidation\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"callerConfirmation\",\"type\":\"address\"}],\"name\":\"renounceRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"revokeRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"ruleId\",\"type\":\"uint256\"}],\"name\":\"ruleValidation\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"rulesCountValidation\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"rulesValidation\",\"outputs\":[{\"internalType\":\"address[]\",\"name\":\"\",\"type\":\"address[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"rules_\",\"type\":\"address[]\"}],\"name\":\"setRulesValidation\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"supportsInterface\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"trustedForwarder\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_amount\",\"type\":\"uint256\"}],\"name\":\"validateTransfer\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"isValid\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"errors\":{\"AccessControlBadConfirmation()\":[{\"details\":\"The caller of a function is not the expected one. NOTE: Don't confuse with {AccessControlUnauthorizedAccount}.\"}],\"AccessControlUnauthorizedAccount(address,bytes32)\":[{\"details\":\"The `account` is missing a role.\"}]},\"events\":{\"RoleAdminChanged(bytes32,bytes32,bytes32)\":{\"details\":\"Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite {RoleAdminChanged} not being emitted signaling this.\"},\"RoleGranted(bytes32,address,address)\":{\"details\":\"Emitted when `account` is granted `role`. `sender` is the account that originated the contract call, an admin role bearer except when using {AccessControl-_setupRole}.\"},\"RoleRevoked(bytes32,address,address)\":{\"details\":\"Emitted when `account` is revoked `role`. `sender` is the account that originated the contract call:   - if using `revokeRole`, it is the admin role bearer   - if using `renounceRole`, it is the role bearer (i.e. `account`)\"}},\"kind\":\"dev\",\"methods\":{\"canReturnTransferRestrictionCode(uint8)\":{\"params\":{\"_restrictionCode\":\"The target restriction code\"},\"returns\":{\"_0\":\"true if the restriction code is known, false otherwise*\"}},\"constructor\":{\"params\":{\"admin\":\"Address of the contract (Access Control)\",\"forwarderIrrevocable\":\"Address of the forwarder, required for the gasless support\"}},\"detectTransferRestriction(address,address,uint256)\":{\"params\":{\"_from\":\"the origin address\",\"_to\":\"the destination address\"},\"returns\":{\"_0\":\"The restricion code or REJECTED_CODE_BASE.TRANSFER_OK*\"}},\"getRoleAdmin(bytes32)\":{\"details\":\"Returns the admin role that controls `role`. See {grantRole} and {revokeRole}. To change a role's admin, use {_setRoleAdmin}.\"},\"getRuleIndexValidation(address)\":{\"returns\":{\"index\":\"if the rule is found, _rulesValidation.length otherwise\"}},\"grantRole(bytes32,address)\":{\"details\":\"Grants `role` to `account`. If `account` had not been already granted `role`, emits a {RoleGranted} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleGranted} event.\"},\"hasRole(bytes32,address)\":{\"details\":\"Returns `true` if `account` has been granted `role`.\"},\"isTrustedForwarder(address)\":{\"details\":\"Indicates whether any particular address is the trusted forwarder.\"},\"messageForTransferRestriction(uint8)\":{\"params\":{\"_restrictionCode\":\"The target restriction code\"},\"returns\":{\"_0\":\"true if the transfer is valid, false otherwise*\"}},\"removeRuleValidation(address,uint256)\":{\"details\":\"To reduce the array size, the last rule is moved to the location occupied by the rule to remove\",\"params\":{\"index\":\"the position inside the array of rule\",\"rule_\":\"address of the target rule\"}},\"renounceRole(bytes32,address)\":{\"details\":\"Revokes `role` from the calling account. Roles are often managed via {grantRole} and {revokeRole}: this function's purpose is to provide a mechanism for accounts to lose their privileges if they are compromised (such as when a trusted device is misplaced). If the calling account had been revoked `role`, emits a {RoleRevoked} event. Requirements: - the caller must be `callerConfirmation`. May emit a {RoleRevoked} event.\"},\"revokeRole(bytes32,address)\":{\"details\":\"Revokes `role` from `account`. If `account` had been granted `role`, emits a {RoleRevoked} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleRevoked} event.\"},\"ruleValidation(uint256)\":{\"params\":{\"ruleId\":\"index of the rule\"},\"returns\":{\"_0\":\"a rule address\"}},\"rulesCountValidation()\":{\"returns\":{\"_0\":\"The number of rules inside the array\"}},\"rulesValidation()\":{\"returns\":{\"_0\":\"An array of rules\"}},\"setRulesValidation(address[])\":{\"details\":\"take address[] instead of IRuleEngineValidation[] since it is not possible to cast IRuleEngineValidation[] -> address[]\"},\"supportsInterface(bytes4)\":{\"details\":\"See {IERC165-supportsInterface}.\"},\"trustedForwarder()\":{\"details\":\"Returns the address of the trusted forwarder.\"},\"validateTransfer(address,address,uint256)\":{\"params\":{\"_amount\":\"to transfer\",\"_from\":\"the origin address\",\"_to\":\"the destination address\"},\"returns\":{\"isValid\":\"=> true if the transfer is valid, false otherwise*\"}}},\"title\":\"Wrapper to call several different whitelist rules\",\"version\":1},\"userdoc\":{\"events\":{\"AddRule(address)\":{\"notice\":\"Generate when a rule is added\"},\"ClearRules(address[])\":{\"notice\":\"Generate when all the rules are cleared\"},\"RemoveRule(address)\":{\"notice\":\"Generate when a rule is removed\"}},\"kind\":\"user\",\"methods\":{\"RULE_ENGINE_OPERATOR_ROLE()\":{\"notice\":\"Role to manage the ruleEngine\"},\"TOKEN_CONTRACT_ROLE()\":{\"notice\":\"token contract\"},\"addRuleValidation(address)\":{\"notice\":\"Add a rule to the array of rules Revert if one rule is a zero address or if the rule is already present\"},\"canReturnTransferRestrictionCode(uint8)\":{\"notice\":\"To know if the restriction code is valid for this rule or not\"},\"clearRulesValidation()\":{\"notice\":\"Clear all the rules of the array of rules\"},\"detectTransferRestriction(address,address,uint256)\":{\"notice\":\"Go through all the whitelist rules to know if a restriction exists on the transfer\"},\"getRuleIndexValidation(address)\":{\"notice\":\"Get the index of a rule inside the list\"},\"messageForTransferRestriction(uint8)\":{\"notice\":\"Return the corresponding message\"},\"removeRuleValidation(address,uint256)\":{\"notice\":\"Remove a rule from the array of rules Revert if the rule found at the specified index does not match the rule in argument\"},\"ruleValidation(uint256)\":{\"notice\":\"Get the rule at the position specified by ruleId\"},\"rulesValidation()\":{\"notice\":\"Get all the rules\"},\"setRulesValidation(address[])\":{\"notice\":\"Set all the rules, will overwrite all the previous rules. \\\\n Revert if one rule is a zero address or if the rule is already present\"},\"validateTransfer(address,address,uint256)\":{\"notice\":\"Validate a transfer\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"src/rules/validation/RuleWhitelistWrapper.sol\":\"RuleWhitelistWrapper\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[\":@openzeppelin/contracts/=lib/openzeppelin-contracts/contracts/\",\":CMTAT/=lib/CMTAT/contracts/\",\":OZ/=lib/openzeppelin-contracts/contracts/\",\":ds-test/=lib/openzeppelin-contracts/lib/forge-std/lib/ds-test/src/\",\":erc4626-tests/=lib/openzeppelin-contracts/lib/erc4626-tests/\",\":forge-std/=lib/forge-std/src/\",\":openzeppelin-contracts/=lib/openzeppelin-contracts/\"]},\"sources\":{\"lib/CMTAT/contracts/interfaces/draft-IERC1404/draft-IERC1404.sol\":{\"keccak256\":\"0xfba123f04b693467a10bffcc3d30c8ee0a55a159d1a50a9e6ad7efa6a08ad9ad\",\"license\":\"MPL-2.0\",\"urls\":[\"bzz-raw://f0af9bead272c5af8153932efe6e464485aa27c82a2a5c79ed94e780ec373da0\",\"dweb:/ipfs/QmZJj9B5sBDGY8b5qbFkadmQ377xugKwGoxkHPWW3BpnWg\"]},\"lib/CMTAT/contracts/interfaces/draft-IERC1404/draft-IERC1404EnumCode.sol\":{\"keccak256\":\"0x5162820d851ed01a9ce5e0b28b58b4dfa6262d010e0f112ca1dd1867b37600ed\",\"license\":\"MPL-2.0\",\"urls\":[\"bzz-raw://599cbb744369ec114f918eec3f462d0f2f0a33bab292683be34098bf98b31423\",\"dweb:/ipfs/QmTSYGzsUDicQ5jCu88r2XnRqFyS5nJqfPGiz4q3aL35mx\"]},\"lib/CMTAT/contracts/interfaces/draft-IERC1404/draft-IERC1404Wrapper.sol\":{\"keccak256\":\"0xefa53aa4e697f2fd338b56888c9492392100a146ccd7a2c107cbd189f5c99ea3\",\"license\":\"MPL-2.0\",\"urls\":[\"bzz-raw://a7a5933297a01300d5eb8baa49cce9c98c5f3779e329f4ac41dae6e128bdf68e\",\"dweb:/ipfs/QmcDMxLHuuc7n8dVw6PWtQaRrkqMrtQUoBt4XKeNHF69mF\"]},\"lib/openzeppelin-contracts/contracts/access/AccessControl.sol\":{\"keccak256\":\"0xa0e92d42942f4f57c5be50568dac11e9d00c93efcb458026e18d2d9b9b2e7308\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://46326c0bb1e296b67185e81c918e0b40501b8b6386165855df0a3f3c634b6a80\",\"dweb:/ipfs/QmTwyrDYtsxsk6pymJTK94PnEpzsmkpUxFuzEiakDopy4Z\"]},\"lib/openzeppelin-contracts/contracts/access/IAccessControl.sol\":{\"keccak256\":\"0xb6b36edd6a2999fd243ff226d6cbf84bd71af2432bbd0dfe19392996a1d9cb41\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://1fd2f35495652e57e3f99bc6c510bc5f7dd398a176ea2e72d8ed730aebc6ca26\",\"dweb:/ipfs/QmTQV6X4gkikTib49cho5iDX3JvSQbdsoEChoDwrk3CbbH\"]},\"lib/openzeppelin-contracts/contracts/metatx/ERC2771Context.sol\":{\"keccak256\":\"0x98256cf37b71a69b2f5a8a6fe975ea03590dff703102bd141a830f94e8adebf6\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://6251fe1f6a1e45e6d619d150c123afc88b8646b38ee26a136efa9a6988a31d3f\",\"dweb:/ipfs/QmeXDT85wSZdP31wkz3ah3KhponCiksJLP5o2LR5e1JxcK\"]},\"lib/openzeppelin-contracts/contracts/utils/Context.sol\":{\"keccak256\":\"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://6a708e8a5bdb1011c2c381c9a5cfd8a9a956d7d0a9dc1bd8bcdaf52f76ef2f12\",\"dweb:/ipfs/Qmax9WHBnVsZP46ZxEMNRQpLQnrdE4dK8LehML1Py8FowF\"]},\"lib/openzeppelin-contracts/contracts/utils/introspection/ERC165.sol\":{\"keccak256\":\"0x9e8778b14317ba9e256c30a76fd6c32b960af621987f56069e1e819c77c6a133\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://1777404f1dcd0fac188e55a288724ec3c67b45288e49cc64723e95e702b49ab8\",\"dweb:/ipfs/QmZFdC626GButBApwDUvvTnUzdinevC3B24d7yyh57XkiA\"]},\"lib/openzeppelin-contracts/contracts/utils/introspection/IERC165.sol\":{\"keccak256\":\"0x4296879f55019b23e135000eb36896057e7101fb7fb859c5ef690cf14643757b\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://87b3541437c8c443ccd36795e56a338ed12855eec17f8da624511b8d1a7e14df\",\"dweb:/ipfs/QmeJQCtZrQjtJLr6u7ZHWeH3pBnjtLWzvRrKViAi7UZqxL\"]},\"src/interfaces/IRuleEngineValidation.sol\":{\"keccak256\":\"0x19f9b71580dddb20a29570bff88f711abf0c8aec18bd563643764aa37355eac1\",\"license\":\"MPL-2.0\",\"urls\":[\"bzz-raw://4a48e1abaa9d740c88bb33958b2227b1d98723a357fe35a6cc3a2843b00cdc20\",\"dweb:/ipfs/QmVaEQQhH522tKEJLizmFDuTeAyxb8bZP7byHpfNxwSmyT\"]},\"src/interfaces/IRuleValidation.sol\":{\"keccak256\":\"0x6b23f8d7355937f0d304ceb498f661b004d1969f87782af7588a960273af38a1\",\"license\":\"MPL-2.0\",\"urls\":[\"bzz-raw://b9c92ca4ce23304474c8236dd37c60f2c98627ca2a6156eb2ce0767436f40fa9\",\"dweb:/ipfs/QmZMkCu57MjUXjN5TtkhDGgM9RzGQpTX3uD79P1M9Vn2G8\"]},\"src/modules/MetaTxModuleStandalone.sol\":{\"keccak256\":\"0x32423330fbd140fb87b7f3c9f004db3eb7256f0f8c15b76be26ff14ba81edba0\",\"license\":\"MPL-2.0\",\"urls\":[\"bzz-raw://af6e6cfd9ccb587283b8379965a76143a27aaa38115191db1bbb1a5632eb4a25\",\"dweb:/ipfs/QmTdaEc78NfG9wJRYErsCZajvNF8ozLaqEfNyzi7Fu1fMj\"]},\"src/modules/RuleEngineInvariantStorage.sol\":{\"keccak256\":\"0x09093b1b80c8fd27ef80aaec46522ec5525aebcdb0fe77231821197d6fe7a1a0\",\"license\":\"MPL-2.0\",\"urls\":[\"bzz-raw://4939364678439e43818b1efb114b662219629b5945ecd98b1e39eca64d46dc44\",\"dweb:/ipfs/QmSikHEsDZy8hzyQ33N3AhiM25S7pCFEmqADZxK53FpCDq\"]},\"src/modules/RuleEngineValidationCommon.sol\":{\"keccak256\":\"0xf1d0fdd62ba10b81918a6749e1fcf9f020b298a8179a1cf6c849fe0aaa5edddb\",\"license\":\"MPL-2.0\",\"urls\":[\"bzz-raw://57ae96630675750b371656a3e9ce3a5b1e2ce16327d3e292b934def1b85c8a1d\",\"dweb:/ipfs/QmZm9obyXiMCJzLPNCvvtN9QogngmRnkZJmBke2bc79Jgk\"]},\"src/modules/RuleInternal.sol\":{\"keccak256\":\"0xa6d2f8844062b318c31cb97570b840ac2faa50111564c97b7190bcadcab4419c\",\"license\":\"MPL-2.0\",\"urls\":[\"bzz-raw://878b4ba012b1c46973bb50018973a90ea6b700706a2ae52b0bae7d240df510b3\",\"dweb:/ipfs/QmdRjwxgoo4xc3JmyAirRbbLupKVZ51r67e1D93bTFSF6A\"]},\"src/rules/validation/RuleWhitelistWrapper.sol\":{\"keccak256\":\"0x98dea2f3986bd3490f2ba10dc027cdcb8fe7b5f0f4b21ab47f72fb5eb1bad785\",\"license\":\"MPL-2.0\",\"urls\":[\"bzz-raw://e777ea68de9b49e8193d94d0255de3949cfd237507016ced64870431eef36644\",\"dweb:/ipfs/QmawDNARGnscDspWEdN7nLKVGVwFpNwa13vCKVXdrUGxpc\"]},\"src/rules/validation/abstract/RuleAddressList/RuleAddressList.sol\":{\"keccak256\":\"0x062f188bd35d2e2ca224c7a5b576c5720275e5175d3fa3ffd9ab896dcf21c400\",\"license\":\"MPL-2.0\",\"urls\":[\"bzz-raw://fa847c271016bae89e056f66898f4fba411b348bb312face86c94758f8a378ac\",\"dweb:/ipfs/QmPGHHbsmxVgL7tcc77qNVMfxtESgnYqrvdLqxGXdXw2bM\"]},\"src/rules/validation/abstract/RuleAddressList/RuleAddressListInternal.sol\":{\"keccak256\":\"0x4fe41635bb8060e980ed5d9847afd0f2bb89c64501254bea619e65a727ba67b6\",\"license\":\"MPL-2.0\",\"urls\":[\"bzz-raw://e0e417e96caa101c0a8a6a25944c89d9690cd166680dd298918e4819f415c531\",\"dweb:/ipfs/QmPJeFJW8g4dzfHU81Kt5kfLBgVWevChUzArFSjh5iDVR8\"]},\"src/rules/validation/abstract/RuleAddressList/invariantStorage/RuleAddressListInvariantStorage.sol\":{\"keccak256\":\"0x56c9ca1310dccae89d1019b5a9041fcd11f8344656221995fe2fbc4d095b37c3\",\"license\":\"MPL-2.0\",\"urls\":[\"bzz-raw://ce143c19d8c1d192e4fddabb32be213caef4c6bfa19dcf79f3ae6a6cc518a1b7\",\"dweb:/ipfs/Qmbn9wRsiRybULTaKqBkPWe6SEbbfKVRttD1mi2cb8RznB\"]},\"src/rules/validation/abstract/RuleAddressList/invariantStorage/RuleWhitelistInvariantStorage.sol\":{\"keccak256\":\"0x39a4b0b5ef4d03b32e826c67c0244bd0bdc803656e6f7d2301c395b7a3bd5bb2\",\"license\":\"MPL-2.0\",\"urls\":[\"bzz-raw://5c6222cc7a6e87d1bd11c5989c83ee6bf09dca003c3002845dbf41a4b694246e\",\"dweb:/ipfs/QmXQy7odhSupb6BjG1T1KjbmaLs7mcBrag7Sn3cp2JGUyb\"]},\"src/rules/validation/abstract/RuleCommonInvariantStorage.sol\":{\"keccak256\":\"0xea52693dfabf31d5b94201b78ba04cd4e7f9985b616965530317dcb25c59b678\",\"license\":\"MPL-2.0\",\"urls\":[\"bzz-raw://c6a24a2b31405e5511548afd5dca62ea8670a71ebb7fce8604637609ff320749\",\"dweb:/ipfs/QmUDXyeySu8nBRyTWGxdrTs4NC813F5w9PyBTgMs9Y7N7u\"]},\"src/rules/validation/abstract/RuleValidateTransfer.sol\":{\"keccak256\":\"0xd843208b93b04efb86fc20e5f0f8b1a725a6402fcbe5836aadf652c9804b749b\",\"license\":\"MPL-2.0\",\"urls\":[\"bzz-raw://2ce6f485b6d7c43e823fe0add5b894c252dbc36e61143df6e4a00c1bd12dc1cd\",\"dweb:/ipfs/QmQaKkmwo8UacTADjRh9ebj1B8CCjpLRfHoUt3xMcDYhAt\"]},\"src/rules/validation/abstract/RuleWhitelistCommon.sol\":{\"keccak256\":\"0xbab37a174342a2a1d3343bb575b5e85450f662973f8c06cba6103f4071480c7c\",\"license\":\"MPL-2.0\",\"urls\":[\"bzz-raw://a45604ae07b94bec85e15b9d79d24b3ba98d8fed9eebee4e3769da215be1022c\",\"dweb:/ipfs/QmNsESHhPwpHpJiuYiFRADLXGyUuKZmXrGVMcVvt8XyALZ\"]}},\"version\":1}","metadata":{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"address","name":"admin","type":"address"},{"internalType":"address","name":"forwarderIrrevocable","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"type":"error","name":"AccessControlBadConfirmation"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bytes32","name":"neededRole","type":"bytes32"}],"type":"error","name":"AccessControlUnauthorizedAccount"},{"inputs":[],"type":"error","name":"RuleEngine_AdminWithAddressZeroNotAllowed"},{"inputs":[],"type":"error","name":"RuleEngine_ArrayIsEmpty"},{"inputs":[],"type":"error","name":"RuleEngine_RuleAddressZeroNotAllowed"},{"inputs":[],"type":"error","name":"RuleEngine_RuleAlreadyExists"},{"inputs":[],"type":"error","name":"RuleEngine_RuleDoNotMatch"},{"inputs":[{"internalType":"address","name":"rule","type":"address","indexed":true}],"type":"event","name":"AddRule","anonymous":false},{"inputs":[{"internalType":"address[]","name":"rulesRemoved","type":"address[]","indexed":false}],"type":"event","name":"ClearRules","anonymous":false},{"inputs":[{"internalType":"address","name":"rule","type":"address","indexed":true}],"type":"event","name":"RemoveRule","anonymous":false},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32","indexed":true},{"internalType":"bytes32","name":"previousAdminRole","type":"bytes32","indexed":true},{"internalType":"bytes32","name":"newAdminRole","type":"bytes32","indexed":true}],"type":"event","name":"RoleAdminChanged","anonymous":false},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32","indexed":true},{"internalType":"address","name":"account","type":"address","indexed":true},{"internalType":"address","name":"sender","type":"address","indexed":true}],"type":"event","name":"RoleGranted","anonymous":false},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32","indexed":true},{"internalType":"address","name":"account","type":"address","indexed":true},{"internalType":"address","name":"sender","type":"address","indexed":true}],"type":"event","name":"RoleRevoked","anonymous":false},{"inputs":[],"stateMutability":"view","type":"function","name":"CODE_ADDRESS_FROM_NOT_WHITELISTED","outputs":[{"internalType":"uint8","name":"","type":"uint8"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"CODE_ADDRESS_TO_NOT_WHITELISTED","outputs":[{"internalType":"uint8","name":"","type":"uint8"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"RULE_ENGINE_OPERATOR_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"TOKEN_CONTRACT_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}]},{"inputs":[{"internalType":"contract IRuleValidation","name":"rule_","type":"address"}],"stateMutability":"nonpayable","type":"function","name":"addRuleValidation"},{"inputs":[{"internalType":"uint8","name":"_restrictionCode","type":"uint8"}],"stateMutability":"pure","type":"function","name":"canReturnTransferRestrictionCode","outputs":[{"internalType":"bool","name":"","type":"bool"}]},{"inputs":[],"stateMutability":"nonpayable","type":"function","name":"clearRulesValidation"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function","name":"detectTransferRestriction","outputs":[{"internalType":"uint8","name":"","type":"uint8"}]},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"stateMutability":"view","type":"function","name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}]},{"inputs":[{"internalType":"contract IRuleValidation","name":"rule_","type":"address"}],"stateMutability":"view","type":"function","name":"getRuleIndexValidation","outputs":[{"internalType":"uint256","name":"index","type":"uint256"}]},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"stateMutability":"nonpayable","type":"function","name":"grantRole"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"stateMutability":"view","type":"function","name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}]},{"inputs":[{"internalType":"address","name":"forwarder","type":"address"}],"stateMutability":"view","type":"function","name":"isTrustedForwarder","outputs":[{"internalType":"bool","name":"","type":"bool"}]},{"inputs":[{"internalType":"uint8","name":"_restrictionCode","type":"uint8"}],"stateMutability":"pure","type":"function","name":"messageForTransferRestriction","outputs":[{"internalType":"string","name":"","type":"string"}]},{"inputs":[{"internalType":"contract IRuleValidation","name":"rule_","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"stateMutability":"nonpayable","type":"function","name":"removeRuleValidation"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"callerConfirmation","type":"address"}],"stateMutability":"nonpayable","type":"function","name":"renounceRole"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"stateMutability":"nonpayable","type":"function","name":"revokeRole"},{"inputs":[{"internalType":"uint256","name":"ruleId","type":"uint256"}],"stateMutability":"view","type":"function","name":"ruleValidation","outputs":[{"internalType":"address","name":"","type":"address"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"rulesCountValidation","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"rulesValidation","outputs":[{"internalType":"address[]","name":"","type":"address[]"}]},{"inputs":[{"internalType":"address[]","name":"rules_","type":"address[]"}],"stateMutability":"nonpayable","type":"function","name":"setRulesValidation"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"stateMutability":"view","type":"function","name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"trustedForwarder","outputs":[{"internalType":"address","name":"","type":"address"}]},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"stateMutability":"view","type":"function","name":"validateTransfer","outputs":[{"internalType":"bool","name":"isValid","type":"bool"}]}],"devdoc":{"kind":"dev","methods":{"canReturnTransferRestrictionCode(uint8)":{"params":{"_restrictionCode":"The target restriction code"},"returns":{"_0":"true if the restriction code is known, false otherwise*"}},"constructor":{"params":{"admin":"Address of the contract (Access Control)","forwarderIrrevocable":"Address of the forwarder, required for the gasless support"}},"detectTransferRestriction(address,address,uint256)":{"params":{"_from":"the origin address","_to":"the destination address"},"returns":{"_0":"The restricion code or REJECTED_CODE_BASE.TRANSFER_OK*"}},"getRoleAdmin(bytes32)":{"details":"Returns the admin role that controls `role`. See {grantRole} and {revokeRole}. To change a role's admin, use {_setRoleAdmin}."},"getRuleIndexValidation(address)":{"returns":{"index":"if the rule is found, _rulesValidation.length otherwise"}},"grantRole(bytes32,address)":{"details":"Grants `role` to `account`. If `account` had not been already granted `role`, emits a {RoleGranted} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleGranted} event."},"hasRole(bytes32,address)":{"details":"Returns `true` if `account` has been granted `role`."},"isTrustedForwarder(address)":{"details":"Indicates whether any particular address is the trusted forwarder."},"messageForTransferRestriction(uint8)":{"params":{"_restrictionCode":"The target restriction code"},"returns":{"_0":"true if the transfer is valid, false otherwise*"}},"removeRuleValidation(address,uint256)":{"details":"To reduce the array size, the last rule is moved to the location occupied by the rule to remove","params":{"index":"the position inside the array of rule","rule_":"address of the target rule"}},"renounceRole(bytes32,address)":{"details":"Revokes `role` from the calling account. Roles are often managed via {grantRole} and {revokeRole}: this function's purpose is to provide a mechanism for accounts to lose their privileges if they are compromised (such as when a trusted device is misplaced). If the calling account had been revoked `role`, emits a {RoleRevoked} event. Requirements: - the caller must be `callerConfirmation`. May emit a {RoleRevoked} event."},"revokeRole(bytes32,address)":{"details":"Revokes `role` from `account`. If `account` had been granted `role`, emits a {RoleRevoked} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleRevoked} event."},"ruleValidation(uint256)":{"params":{"ruleId":"index of the rule"},"returns":{"_0":"a rule address"}},"rulesCountValidation()":{"returns":{"_0":"The number of rules inside the array"}},"rulesValidation()":{"returns":{"_0":"An array of rules"}},"setRulesValidation(address[])":{"details":"take address[] instead of IRuleEngineValidation[] since it is not possible to cast IRuleEngineValidation[] -> address[]"},"supportsInterface(bytes4)":{"details":"See {IERC165-supportsInterface}."},"trustedForwarder()":{"details":"Returns the address of the trusted forwarder."},"validateTransfer(address,address,uint256)":{"params":{"_amount":"to transfer","_from":"the origin address","_to":"the destination address"},"returns":{"isValid":"=> true if the transfer is valid, false otherwise*"}}},"version":1},"userdoc":{"kind":"user","methods":{"RULE_ENGINE_OPERATOR_ROLE()":{"notice":"Role to manage the ruleEngine"},"TOKEN_CONTRACT_ROLE()":{"notice":"token contract"},"addRuleValidation(address)":{"notice":"Add a rule to the array of rules Revert if one rule is a zero address or if the rule is already present"},"canReturnTransferRestrictionCode(uint8)":{"notice":"To know if the restriction code is valid for this rule or not"},"clearRulesValidation()":{"notice":"Clear all the rules of the array of rules"},"detectTransferRestriction(address,address,uint256)":{"notice":"Go through all the whitelist rules to know if a restriction exists on the transfer"},"getRuleIndexValidation(address)":{"notice":"Get the index of a rule inside the list"},"messageForTransferRestriction(uint8)":{"notice":"Return the corresponding message"},"removeRuleValidation(address,uint256)":{"notice":"Remove a rule from the array of rules Revert if the rule found at the specified index does not match the rule in argument"},"ruleValidation(uint256)":{"notice":"Get the rule at the position specified by ruleId"},"rulesValidation()":{"notice":"Get all the rules"},"setRulesValidation(address[])":{"notice":"Set all the rules, will overwrite all the previous rules. \\n Revert if one rule is a zero address or if the rule is already present"},"validateTransfer(address,address,uint256)":{"notice":"Validate a transfer"}},"version":1}},"settings":{"remappings":["@openzeppelin/contracts/=lib/openzeppelin-contracts/contracts/","CMTAT/=lib/CMTAT/contracts/","OZ/=lib/openzeppelin-contracts/contracts/","ds-test/=lib/openzeppelin-contracts/lib/forge-std/lib/ds-test/src/","erc4626-tests/=lib/openzeppelin-contracts/lib/erc4626-tests/","forge-std/=lib/forge-std/src/","openzeppelin-contracts/=lib/openzeppelin-contracts/"],"optimizer":{"enabled":true,"runs":200},"metadata":{"bytecodeHash":"ipfs"},"compilationTarget":{"src/rules/validation/RuleWhitelistWrapper.sol":"RuleWhitelistWrapper"},"evmVersion":"london","libraries":{}},"sources":{"lib/CMTAT/contracts/interfaces/draft-IERC1404/draft-IERC1404.sol":{"keccak256":"0xfba123f04b693467a10bffcc3d30c8ee0a55a159d1a50a9e6ad7efa6a08ad9ad","urls":["bzz-raw://f0af9bead272c5af8153932efe6e464485aa27c82a2a5c79ed94e780ec373da0","dweb:/ipfs/QmZJj9B5sBDGY8b5qbFkadmQ377xugKwGoxkHPWW3BpnWg"],"license":"MPL-2.0"},"lib/CMTAT/contracts/interfaces/draft-IERC1404/draft-IERC1404EnumCode.sol":{"keccak256":"0x5162820d851ed01a9ce5e0b28b58b4dfa6262d010e0f112ca1dd1867b37600ed","urls":["bzz-raw://599cbb744369ec114f918eec3f462d0f2f0a33bab292683be34098bf98b31423","dweb:/ipfs/QmTSYGzsUDicQ5jCu88r2XnRqFyS5nJqfPGiz4q3aL35mx"],"license":"MPL-2.0"},"lib/CMTAT/contracts/interfaces/draft-IERC1404/draft-IERC1404Wrapper.sol":{"keccak256":"0xefa53aa4e697f2fd338b56888c9492392100a146ccd7a2c107cbd189f5c99ea3","urls":["bzz-raw://a7a5933297a01300d5eb8baa49cce9c98c5f3779e329f4ac41dae6e128bdf68e","dweb:/ipfs/QmcDMxLHuuc7n8dVw6PWtQaRrkqMrtQUoBt4XKeNHF69mF"],"license":"MPL-2.0"},"lib/openzeppelin-contracts/contracts/access/AccessControl.sol":{"keccak256":"0xa0e92d42942f4f57c5be50568dac11e9d00c93efcb458026e18d2d9b9b2e7308","urls":["bzz-raw://46326c0bb1e296b67185e81c918e0b40501b8b6386165855df0a3f3c634b6a80","dweb:/ipfs/QmTwyrDYtsxsk6pymJTK94PnEpzsmkpUxFuzEiakDopy4Z"],"license":"MIT"},"lib/openzeppelin-contracts/contracts/access/IAccessControl.sol":{"keccak256":"0xb6b36edd6a2999fd243ff226d6cbf84bd71af2432bbd0dfe19392996a1d9cb41","urls":["bzz-raw://1fd2f35495652e57e3f99bc6c510bc5f7dd398a176ea2e72d8ed730aebc6ca26","dweb:/ipfs/QmTQV6X4gkikTib49cho5iDX3JvSQbdsoEChoDwrk3CbbH"],"license":"MIT"},"lib/openzeppelin-contracts/contracts/metatx/ERC2771Context.sol":{"keccak256":"0x98256cf37b71a69b2f5a8a6fe975ea03590dff703102bd141a830f94e8adebf6","urls":["bzz-raw://6251fe1f6a1e45e6d619d150c123afc88b8646b38ee26a136efa9a6988a31d3f","dweb:/ipfs/QmeXDT85wSZdP31wkz3ah3KhponCiksJLP5o2LR5e1JxcK"],"license":"MIT"},"lib/openzeppelin-contracts/contracts/utils/Context.sol":{"keccak256":"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2","urls":["bzz-raw://6a708e8a5bdb1011c2c381c9a5cfd8a9a956d7d0a9dc1bd8bcdaf52f76ef2f12","dweb:/ipfs/Qmax9WHBnVsZP46ZxEMNRQpLQnrdE4dK8LehML1Py8FowF"],"license":"MIT"},"lib/openzeppelin-contracts/contracts/utils/introspection/ERC165.sol":{"keccak256":"0x9e8778b14317ba9e256c30a76fd6c32b960af621987f56069e1e819c77c6a133","urls":["bzz-raw://1777404f1dcd0fac188e55a288724ec3c67b45288e49cc64723e95e702b49ab8","dweb:/ipfs/QmZFdC626GButBApwDUvvTnUzdinevC3B24d7yyh57XkiA"],"license":"MIT"},"lib/openzeppelin-contracts/contracts/utils/introspection/IERC165.sol":{"keccak256":"0x4296879f55019b23e135000eb36896057e7101fb7fb859c5ef690cf14643757b","urls":["bzz-raw://87b3541437c8c443ccd36795e56a338ed12855eec17f8da624511b8d1a7e14df","dweb:/ipfs/QmeJQCtZrQjtJLr6u7ZHWeH3pBnjtLWzvRrKViAi7UZqxL"],"license":"MIT"},"src/interfaces/IRuleEngineValidation.sol":{"keccak256":"0x19f9b71580dddb20a29570bff88f711abf0c8aec18bd563643764aa37355eac1","urls":["bzz-raw://4a48e1abaa9d740c88bb33958b2227b1d98723a357fe35a6cc3a2843b00cdc20","dweb:/ipfs/QmVaEQQhH522tKEJLizmFDuTeAyxb8bZP7byHpfNxwSmyT"],"license":"MPL-2.0"},"src/interfaces/IRuleValidation.sol":{"keccak256":"0x6b23f8d7355937f0d304ceb498f661b004d1969f87782af7588a960273af38a1","urls":["bzz-raw://b9c92ca4ce23304474c8236dd37c60f2c98627ca2a6156eb2ce0767436f40fa9","dweb:/ipfs/QmZMkCu57MjUXjN5TtkhDGgM9RzGQpTX3uD79P1M9Vn2G8"],"license":"MPL-2.0"},"src/modules/MetaTxModuleStandalone.sol":{"keccak256":"0x32423330fbd140fb87b7f3c9f004db3eb7256f0f8c15b76be26ff14ba81edba0","urls":["bzz-raw://af6e6cfd9ccb587283b8379965a76143a27aaa38115191db1bbb1a5632eb4a25","dweb:/ipfs/QmTdaEc78NfG9wJRYErsCZajvNF8ozLaqEfNyzi7Fu1fMj"],"license":"MPL-2.0"},"src/modules/RuleEngineInvariantStorage.sol":{"keccak256":"0x09093b1b80c8fd27ef80aaec46522ec5525aebcdb0fe77231821197d6fe7a1a0","urls":["bzz-raw://4939364678439e43818b1efb114b662219629b5945ecd98b1e39eca64d46dc44","dweb:/ipfs/QmSikHEsDZy8hzyQ33N3AhiM25S7pCFEmqADZxK53FpCDq"],"license":"MPL-2.0"},"src/modules/RuleEngineValidationCommon.sol":{"keccak256":"0xf1d0fdd62ba10b81918a6749e1fcf9f020b298a8179a1cf6c849fe0aaa5edddb","urls":["bzz-raw://57ae96630675750b371656a3e9ce3a5b1e2ce16327d3e292b934def1b85c8a1d","dweb:/ipfs/QmZm9obyXiMCJzLPNCvvtN9QogngmRnkZJmBke2bc79Jgk"],"license":"MPL-2.0"},"src/modules/RuleInternal.sol":{"keccak256":"0xa6d2f8844062b318c31cb97570b840ac2faa50111564c97b7190bcadcab4419c","urls":["bzz-raw://878b4ba012b1c46973bb50018973a90ea6b700706a2ae52b0bae7d240df510b3","dweb:/ipfs/QmdRjwxgoo4xc3JmyAirRbbLupKVZ51r67e1D93bTFSF6A"],"license":"MPL-2.0"},"src/rules/validation/RuleWhitelistWrapper.sol":{"keccak256":"0x98dea2f3986bd3490f2ba10dc027cdcb8fe7b5f0f4b21ab47f72fb5eb1bad785","urls":["bzz-raw://e777ea68de9b49e8193d94d0255de3949cfd237507016ced64870431eef36644","dweb:/ipfs/QmawDNARGnscDspWEdN7nLKVGVwFpNwa13vCKVXdrUGxpc"],"license":"MPL-2.0"},"src/rules/validation/abstract/RuleAddressList/RuleAddressList.sol":{"keccak256":"0x062f188bd35d2e2ca224c7a5b576c5720275e5175d3fa3ffd9ab896dcf21c400","urls":["bzz-raw://fa847c271016bae89e056f66898f4fba411b348bb312face86c94758f8a378ac","dweb:/ipfs/QmPGHHbsmxVgL7tcc77qNVMfxtESgnYqrvdLqxGXdXw2bM"],"license":"MPL-2.0"},"src/rules/validation/abstract/RuleAddressList/RuleAddressListInternal.sol":{"keccak256":"0x4fe41635bb8060e980ed5d9847afd0f2bb89c64501254bea619e65a727ba67b6","urls":["bzz-raw://e0e417e96caa101c0a8a6a25944c89d9690cd166680dd298918e4819f415c531","dweb:/ipfs/QmPJeFJW8g4dzfHU81Kt5kfLBgVWevChUzArFSjh5iDVR8"],"license":"MPL-2.0"},"src/rules/validation/abstract/RuleAddressList/invariantStorage/RuleAddressListInvariantStorage.sol":{"keccak256":"0x56c9ca1310dccae89d1019b5a9041fcd11f8344656221995fe2fbc4d095b37c3","urls":["bzz-raw://ce143c19d8c1d192e4fddabb32be213caef4c6bfa19dcf79f3ae6a6cc518a1b7","dweb:/ipfs/Qmbn9wRsiRybULTaKqBkPWe6SEbbfKVRttD1mi2cb8RznB"],"license":"MPL-2.0"},"src/rules/validation/abstract/RuleAddressList/invariantStorage/RuleWhitelistInvariantStorage.sol":{"keccak256":"0x39a4b0b5ef4d03b32e826c67c0244bd0bdc803656e6f7d2301c395b7a3bd5bb2","urls":["bzz-raw://5c6222cc7a6e87d1bd11c5989c83ee6bf09dca003c3002845dbf41a4b694246e","dweb:/ipfs/QmXQy7odhSupb6BjG1T1KjbmaLs7mcBrag7Sn3cp2JGUyb"],"license":"MPL-2.0"},"src/rules/validation/abstract/RuleCommonInvariantStorage.sol":{"keccak256":"0xea52693dfabf31d5b94201b78ba04cd4e7f9985b616965530317dcb25c59b678","urls":["bzz-raw://c6a24a2b31405e5511548afd5dca62ea8670a71ebb7fce8604637609ff320749","dweb:/ipfs/QmUDXyeySu8nBRyTWGxdrTs4NC813F5w9PyBTgMs9Y7N7u"],"license":"MPL-2.0"},"src/rules/validation/abstract/RuleValidateTransfer.sol":{"keccak256":"0xd843208b93b04efb86fc20e5f0f8b1a725a6402fcbe5836aadf652c9804b749b","urls":["bzz-raw://2ce6f485b6d7c43e823fe0add5b894c252dbc36e61143df6e4a00c1bd12dc1cd","dweb:/ipfs/QmQaKkmwo8UacTADjRh9ebj1B8CCjpLRfHoUt3xMcDYhAt"],"license":"MPL-2.0"},"src/rules/validation/abstract/RuleWhitelistCommon.sol":{"keccak256":"0xbab37a174342a2a1d3343bb575b5e85450f662973f8c06cba6103f4071480c7c","urls":["bzz-raw://a45604ae07b94bec85e15b9d79d24b3ba98d8fed9eebee4e3769da215be1022c","dweb:/ipfs/QmNsESHhPwpHpJiuYiFRADLXGyUuKZmXrGVMcVvt8XyALZ"],"license":"MPL-2.0"}},"version":1},"id":101}
\ No newline at end of file
diff --git a/RuleWhitelistv2.0.2.json b/RuleWhitelistv2.0.2.json
new file mode 100644
index 0000000..21cfa2a
--- /dev/null
+++ b/RuleWhitelistv2.0.2.json
@@ -0,0 +1,1081 @@
+{
+  "contractName": "RuleWhitelist",
+  "abi": [
+    {
+      "type": "constructor",
+      "inputs": [
+        { "name": "admin", "type": "address", "internalType": "address" },
+        {
+          "name": "forwarderIrrevocable",
+          "type": "address",
+          "internalType": "address"
+        }
+      ],
+      "stateMutability": "nonpayable"
+    },
+    {
+      "type": "function",
+      "name": "ADDRESS_LIST_ADD_ROLE",
+      "inputs": [],
+      "outputs": [{ "name": "", "type": "bytes32", "internalType": "bytes32" }],
+      "stateMutability": "view"
+    },
+    {
+      "type": "function",
+      "name": "ADDRESS_LIST_REMOVE_ROLE",
+      "inputs": [],
+      "outputs": [{ "name": "", "type": "bytes32", "internalType": "bytes32" }],
+      "stateMutability": "view"
+    },
+    {
+      "type": "function",
+      "name": "CODE_ADDRESS_FROM_NOT_WHITELISTED",
+      "inputs": [],
+      "outputs": [{ "name": "", "type": "uint8", "internalType": "uint8" }],
+      "stateMutability": "view"
+    },
+    {
+      "type": "function",
+      "name": "CODE_ADDRESS_TO_NOT_WHITELISTED",
+      "inputs": [],
+      "outputs": [{ "name": "", "type": "uint8", "internalType": "uint8" }],
+      "stateMutability": "view"
+    },
+    {
+      "type": "function",
+      "name": "DEFAULT_ADMIN_ROLE",
+      "inputs": [],
+      "outputs": [{ "name": "", "type": "bytes32", "internalType": "bytes32" }],
+      "stateMutability": "view"
+    },
+    {
+      "type": "function",
+      "name": "addAddressToTheList",
+      "inputs": [
+        {
+          "name": "_newWhitelistAddress",
+          "type": "address",
+          "internalType": "address"
+        }
+      ],
+      "outputs": [],
+      "stateMutability": "nonpayable"
+    },
+    {
+      "type": "function",
+      "name": "addAddressesToTheList",
+      "inputs": [
+        {
+          "name": "listWhitelistedAddress",
+          "type": "address[]",
+          "internalType": "address[]"
+        }
+      ],
+      "outputs": [],
+      "stateMutability": "nonpayable"
+    },
+    {
+      "type": "function",
+      "name": "addressIsListed",
+      "inputs": [
+        {
+          "name": "_targetAddress",
+          "type": "address",
+          "internalType": "address"
+        }
+      ],
+      "outputs": [{ "name": "", "type": "bool", "internalType": "bool" }],
+      "stateMutability": "view"
+    },
+    {
+      "type": "function",
+      "name": "addressIsListedBatch",
+      "inputs": [
+        {
+          "name": "_targetAddresses",
+          "type": "address[]",
+          "internalType": "address[]"
+        }
+      ],
+      "outputs": [{ "name": "", "type": "bool[]", "internalType": "bool[]" }],
+      "stateMutability": "view"
+    },
+    {
+      "type": "function",
+      "name": "canReturnTransferRestrictionCode",
+      "inputs": [
+        { "name": "_restrictionCode", "type": "uint8", "internalType": "uint8" }
+      ],
+      "outputs": [{ "name": "", "type": "bool", "internalType": "bool" }],
+      "stateMutability": "pure"
+    },
+    {
+      "type": "function",
+      "name": "detectTransferRestriction",
+      "inputs": [
+        { "name": "_from", "type": "address", "internalType": "address" },
+        { "name": "_to", "type": "address", "internalType": "address" },
+        { "name": "", "type": "uint256", "internalType": "uint256" }
+      ],
+      "outputs": [{ "name": "", "type": "uint8", "internalType": "uint8" }],
+      "stateMutability": "view"
+    },
+    {
+      "type": "function",
+      "name": "getRoleAdmin",
+      "inputs": [
+        { "name": "role", "type": "bytes32", "internalType": "bytes32" }
+      ],
+      "outputs": [{ "name": "", "type": "bytes32", "internalType": "bytes32" }],
+      "stateMutability": "view"
+    },
+    {
+      "type": "function",
+      "name": "grantRole",
+      "inputs": [
+        { "name": "role", "type": "bytes32", "internalType": "bytes32" },
+        { "name": "account", "type": "address", "internalType": "address" }
+      ],
+      "outputs": [],
+      "stateMutability": "nonpayable"
+    },
+    {
+      "type": "function",
+      "name": "hasRole",
+      "inputs": [
+        { "name": "role", "type": "bytes32", "internalType": "bytes32" },
+        { "name": "account", "type": "address", "internalType": "address" }
+      ],
+      "outputs": [{ "name": "", "type": "bool", "internalType": "bool" }],
+      "stateMutability": "view"
+    },
+    {
+      "type": "function",
+      "name": "isTrustedForwarder",
+      "inputs": [
+        { "name": "forwarder", "type": "address", "internalType": "address" }
+      ],
+      "outputs": [{ "name": "", "type": "bool", "internalType": "bool" }],
+      "stateMutability": "view"
+    },
+    {
+      "type": "function",
+      "name": "messageForTransferRestriction",
+      "inputs": [
+        { "name": "_restrictionCode", "type": "uint8", "internalType": "uint8" }
+      ],
+      "outputs": [{ "name": "", "type": "string", "internalType": "string" }],
+      "stateMutability": "pure"
+    },
+    {
+      "type": "function",
+      "name": "numberListedAddress",
+      "inputs": [],
+      "outputs": [{ "name": "", "type": "uint256", "internalType": "uint256" }],
+      "stateMutability": "view"
+    },
+    {
+      "type": "function",
+      "name": "removeAddressFromTheList",
+      "inputs": [
+        {
+          "name": "_removeWhitelistAddress",
+          "type": "address",
+          "internalType": "address"
+        }
+      ],
+      "outputs": [],
+      "stateMutability": "nonpayable"
+    },
+    {
+      "type": "function",
+      "name": "removeAddressesFromTheList",
+      "inputs": [
+        {
+          "name": "listWhitelistedAddress",
+          "type": "address[]",
+          "internalType": "address[]"
+        }
+      ],
+      "outputs": [],
+      "stateMutability": "nonpayable"
+    },
+    {
+      "type": "function",
+      "name": "renounceRole",
+      "inputs": [
+        { "name": "role", "type": "bytes32", "internalType": "bytes32" },
+        {
+          "name": "callerConfirmation",
+          "type": "address",
+          "internalType": "address"
+        }
+      ],
+      "outputs": [],
+      "stateMutability": "nonpayable"
+    },
+    {
+      "type": "function",
+      "name": "revokeRole",
+      "inputs": [
+        { "name": "role", "type": "bytes32", "internalType": "bytes32" },
+        { "name": "account", "type": "address", "internalType": "address" }
+      ],
+      "outputs": [],
+      "stateMutability": "nonpayable"
+    },
+    {
+      "type": "function",
+      "name": "supportsInterface",
+      "inputs": [
+        { "name": "interfaceId", "type": "bytes4", "internalType": "bytes4" }
+      ],
+      "outputs": [{ "name": "", "type": "bool", "internalType": "bool" }],
+      "stateMutability": "view"
+    },
+    {
+      "type": "function",
+      "name": "trustedForwarder",
+      "inputs": [],
+      "outputs": [{ "name": "", "type": "address", "internalType": "address" }],
+      "stateMutability": "view"
+    },
+    {
+      "type": "function",
+      "name": "validateTransfer",
+      "inputs": [
+        { "name": "_from", "type": "address", "internalType": "address" },
+        { "name": "_to", "type": "address", "internalType": "address" },
+        { "name": "_amount", "type": "uint256", "internalType": "uint256" }
+      ],
+      "outputs": [
+        { "name": "isValid", "type": "bool", "internalType": "bool" }
+      ],
+      "stateMutability": "view"
+    },
+    {
+      "type": "event",
+      "name": "RoleAdminChanged",
+      "inputs": [
+        {
+          "name": "role",
+          "type": "bytes32",
+          "indexed": true,
+          "internalType": "bytes32"
+        },
+        {
+          "name": "previousAdminRole",
+          "type": "bytes32",
+          "indexed": true,
+          "internalType": "bytes32"
+        },
+        {
+          "name": "newAdminRole",
+          "type": "bytes32",
+          "indexed": true,
+          "internalType": "bytes32"
+        }
+      ],
+      "anonymous": false
+    },
+    {
+      "type": "event",
+      "name": "RoleGranted",
+      "inputs": [
+        {
+          "name": "role",
+          "type": "bytes32",
+          "indexed": true,
+          "internalType": "bytes32"
+        },
+        {
+          "name": "account",
+          "type": "address",
+          "indexed": true,
+          "internalType": "address"
+        },
+        {
+          "name": "sender",
+          "type": "address",
+          "indexed": true,
+          "internalType": "address"
+        }
+      ],
+      "anonymous": false
+    },
+    {
+      "type": "event",
+      "name": "RoleRevoked",
+      "inputs": [
+        {
+          "name": "role",
+          "type": "bytes32",
+          "indexed": true,
+          "internalType": "bytes32"
+        },
+        {
+          "name": "account",
+          "type": "address",
+          "indexed": true,
+          "internalType": "address"
+        },
+        {
+          "name": "sender",
+          "type": "address",
+          "indexed": true,
+          "internalType": "address"
+        }
+      ],
+      "anonymous": false
+    },
+    { "type": "error", "name": "AccessControlBadConfirmation", "inputs": [] },
+    {
+      "type": "error",
+      "name": "AccessControlUnauthorizedAccount",
+      "inputs": [
+        { "name": "account", "type": "address", "internalType": "address" },
+        { "name": "neededRole", "type": "bytes32", "internalType": "bytes32" }
+      ]
+    },
+    {
+      "type": "error",
+      "name": "RuleAddressList_AdminWithAddressZeroNotAllowed",
+      "inputs": []
+    },
+    { "type": "error", "name": "Rulelist_AddressAlreadylisted", "inputs": [] },
+    { "type": "error", "name": "Rulelist_AddressNotPresent", "inputs": [] }
+  ],
+  "bytecode":"0x60a06040523480156200001157600080fd5b50604051620013ca380380620013ca83398101604081905262000034916200023a565b6001600160a01b0380821660805282908290821662000066576040516317c69b0360e21b815260040160405180910390fd5b62000073600083620000d8565b50620000a07f1b03c849816e077359373cf0a8d6d8f741d643bc1e95273ffe11515f83bebf6183620000d8565b50620000cd7f1b94c92b564251ed6b49246d9a82eb7a486b6490f3b3a3bf3b28d2e99801f3ec83620000d8565b5050505050620002f1565b6000828152602081815260408083206001600160a01b038516845290915281205460ff166200017f576000838152602081815260408083206001600160a01b03861684529091529020805460ff191660011790556200013662000189565b6001600160a01b0316826001600160a01b0316847f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a450600162000183565b5060005b92915050565b6000620001956200019a565b905090565b6000366014620001aa33620001f6565b8015620001b75750808210155b15620001ee57600036620001cc838562000272565b620001d992829062000294565b620001e491620002c0565b60601c9250505090565b339250505090565b60006200020260805190565b6001600160a01b0316826001600160a01b0316149050919050565b80516001600160a01b03811681146200023557600080fd5b919050565b600080604083850312156200024e57600080fd5b62000259836200021d565b915062000269602084016200021d565b90509250929050565b818103818111156200018357634e487b7160e01b600052601160045260246000fd5b60008085851115620002a557600080fd5b83861115620002b357600080fd5b5050820193919092039150565b6001600160601b03198135818116916014851015620002e95780818660140360031b1b83161692505b505092915050565b6080516110af6200031b6000396000818161023c015281816102b90152610bf401526110af6000f3fe608060405234801561001057600080fd5b50600436106101585760003560e01c80637da0a877116100c3578063c6946a121161007c578063c6946a1214610358578063d4ce14151461036b578063d547741f1461037e578063daafd1c714610391578063db136dad146103a4578063fa83a2da146103ac57600080fd5b80637da0a877146102ac5780637f4ab1dd146102e3578063893c14401461030357806391d1485414610316578063948b851e14610329578063a217fddf1461035057600080fd5b80633630e2ea116101155780633630e2ea1461020657806336568abe14610219578063572b6c051461022c5780635b119c0a1461026c5780635b577f66146102865780637d045df61461029957600080fd5b806301ffc9a71461015d5780630a3640d21461018557806311d1c5ca146101a557806313be3212146101ba578063248a9ca3146101d05780632f2ff15d146101f3575b600080fd5b61017061016b366004610c59565b6103d3565b60405190151581526020015b60405180910390f35b610198610193366004610cb0565b61040a565b60405161017c9190610d75565b6101b86101b3366004610dbb565b6104cc565b005b6101c2610505565b60405190815260200161017c565b6101c26101de366004610e30565b60009081526020819052604090206001015490565b6101b8610201366004610e49565b610515565b6101b8610214366004610dbb565b610540565b6101b8610227366004610e49565b610574565b61017061023a366004610e75565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0390811691161490565b610274601581565b60405160ff909116815260200161017c565b610170610294366004610e75565b6105b7565b6101706102a7366004610e9f565b6105d8565b6040516001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016815260200161017c565b6102f66102f1366004610e9f565b6105f4565b60405161017c9190610ebc565b6101b8610311366004610e75565b61068a565b610170610324366004610e49565b6106c1565b6101c27f1b03c849816e077359373cf0a8d6d8f741d643bc1e95273ffe11515f83bebf6181565b6101c2600081565b610170610366366004610f0b565b6106ea565b610274610379366004610f0b565b610774565b6101b861038c366004610e49565b6107a8565b6101b861039f366004610e75565b6107cd565b610274601681565b6101c27f1b94c92b564251ed6b49246d9a82eb7a486b6490f3b3a3bf3b28d2e99801f3ec81565b60006001600160e01b03198216637965db0b60e01b148061040457506301ffc9a760e01b6001600160e01b03198316145b92915050565b60606000825167ffffffffffffffff81111561042857610428610c83565b604051908082528060200260200182016040528015610451578160200160208202803683370190505b50905060005b83518110156104c55761049b84828151811061047557610475610f47565b60200260200101516001600160a01b031660009081526001602052604090205460ff1690565b8282815181106104ad576104ad610f47565b91151560209283029190910190910152600101610457565b5092915050565b7f1b03c849816e077359373cf0a8d6d8f741d643bc1e95273ffe11515f83bebf616104f681610800565b6105008383610814565b505050565b600061051060025490565b905090565b60008281526020819052604090206001015461053081610800565b61053a83836108de565b50505050565b7f1b94c92b564251ed6b49246d9a82eb7a486b6490f3b3a3bf3b28d2e99801f3ec61056a81610800565b6105008383610971565b61057c610a35565b6001600160a01b0316816001600160a01b0316146105ad5760405163334bd91960e11b815260040160405180910390fd5b6105008282610a3f565b6001600160a01b03811660009081526001602052604081205460ff16610404565b600060ff821660151480610404575060ff821660161492915050565b606060141960ff831601610621576040518060600160405280602281526020016110586022913992915050565b60151960ff83160161064c576040518060600160405280602581526020016110336025913992915050565b505060408051808201909152601881527f556e6b6e6f776e207265737472696374696f6e20636f64650000000000000000602082015290565b919050565b7f1b94c92b564251ed6b49246d9a82eb7a486b6490f3b3a3bf3b28d2e99801f3ec6106b481610800565b6106bd82610ac8565b5050565b6000918252602082815260408084206001600160a01b0393909316845291905290205460ff1690565b60405163d4ce141560e01b81526001600160a01b03848116600483015283166024820152604481018290526000908190309063d4ce141590606401602060405180830381865afa158015610742573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107669190610f5d565b60ff161490505b9392505050565b600061077f846105b7565b61078b5750601561076d565b610794836105b7565b6107a05750601661076d565b50600061076d565b6000828152602081905260409020600101546107c381610800565b61053a8383610a3f565b7f1b03c849816e077359373cf0a8d6d8f741d643bc1e95273ffe11515f83bebf616107f781610800565b6106bd82610b38565b6108118161080c610a35565b610ba7565b50565b60025460005b828110156108d6576001600085858481811061083857610838610f47565b905060200201602081019061084d9190610e75565b6001600160a01b0316815260208101919091526040016000205460ff166108ce57600180600086868581811061088557610885610f47565b905060200201602081019061089a9190610e75565b6001600160a01b031681526020810191909152604001600020805460ff19169115159190911790556108cb82610f90565b91505b60010161081a565b506002555050565b60006108ea83836106c1565b610969576000838152602081815260408083206001600160a01b03861684529091529020805460ff19166001179055610921610a35565b6001600160a01b0316826001600160a01b0316847f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a4506001610404565b506000610404565b60025460005b828110156108d6576001600085858481811061099557610995610f47565b90506020020160208101906109aa9190610e75565b6001600160a01b0316815260208101919091526040016000205460ff1615610a2d576000600160008686858181106109e4576109e4610f47565b90506020020160208101906109f99190610e75565b6001600160a01b031681526020810191909152604001600020805460ff1916911515919091179055610a2a82610fa9565b91505b600101610977565b6000610510610be4565b6000610a4b83836106c1565b15610969576000838152602081815260408083206001600160a01b03861684529091529020805460ff19169055610a80610a35565b6001600160a01b0316826001600160a01b0316847ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a4506001610404565b6001600160a01b03811660009081526001602052604090205460ff16610b015760405163cfc5cc9560e01b815260040160405180910390fd5b6001600160a01b0381166000908152600160205260408120805460ff1916905560028054909190610b3190610fa9565b9091555050565b6001600160a01b03811660009081526001602052604090205460ff1615610b72576040516357845b8b60e01b815260040160405180910390fd5b6001600160a01b03811660009081526001602081905260408220805460ff1916909117905560028054909190610b3190610f90565b610bb182826106c1565b6106bd5760405163e2517d3f60e01b81526001600160a01b03821660048201526024810183905260440160405180910390fd5b6000366014336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148015610c215750808210155b15610c5157600036610c338385610fc0565b610c3e928290610fd3565b610c4791610ffd565b60601c9250505090565b339250505090565b600060208284031215610c6b57600080fd5b81356001600160e01b03198116811461076d57600080fd5b634e487b7160e01b600052604160045260246000fd5b80356001600160a01b038116811461068557600080fd5b60006020808385031215610cc357600080fd5b823567ffffffffffffffff80821115610cdb57600080fd5b818501915085601f830112610cef57600080fd5b813581811115610d0157610d01610c83565b8060051b604051601f19603f83011681018181108582111715610d2657610d26610c83565b604052918252848201925083810185019188831115610d4457600080fd5b938501935b82851015610d6957610d5a85610c99565b84529385019392850192610d49565b98975050505050505050565b6020808252825182820181905260009190848201906040850190845b81811015610daf578351151583529284019291840191600101610d91565b50909695505050505050565b60008060208385031215610dce57600080fd5b823567ffffffffffffffff80821115610de657600080fd5b818501915085601f830112610dfa57600080fd5b813581811115610e0957600080fd5b8660208260051b8501011115610e1e57600080fd5b60209290920196919550909350505050565b600060208284031215610e4257600080fd5b5035919050565b60008060408385031215610e5c57600080fd5b82359150610e6c60208401610c99565b90509250929050565b600060208284031215610e8757600080fd5b61076d82610c99565b60ff8116811461081157600080fd5b600060208284031215610eb157600080fd5b813561076d81610e90565b60006020808352835180602085015260005b81811015610eea57858101830151858201604001528201610ece565b506000604082860101526040601f19601f8301168501019250505092915050565b600080600060608486031215610f2057600080fd5b610f2984610c99565b9250610f3760208501610c99565b9150604084013590509250925092565b634e487b7160e01b600052603260045260246000fd5b600060208284031215610f6f57600080fd5b815161076d81610e90565b634e487b7160e01b600052601160045260246000fd5b600060018201610fa257610fa2610f7a565b5060010190565b600081610fb857610fb8610f7a565b506000190190565b8181038181111561040457610404610f7a565b60008085851115610fe357600080fd5b83861115610ff057600080fd5b5050820193919092039150565b6bffffffffffffffffffffffff19813581811691601485101561102a5780818660140360031b1b83161692505b50509291505056fe54686520726563697069656e74206973206e6f7420696e207468652077686974656c6973745468652073656e646572206973206e6f7420696e207468652077686974656c697374a26469706673582212202f76450923b188395ecb3c568a17c231c8c077751daf86f1e09a79884d5888dc64736f6c63430008160033",
+  "deployedBytecode": {
+    "object": "0x608060405234801561001057600080fd5b50600436106101585760003560e01c80637da0a877116100c3578063c6946a121161007c578063c6946a1214610358578063d4ce14151461036b578063d547741f1461037e578063daafd1c714610391578063db136dad146103a4578063fa83a2da146103ac57600080fd5b80637da0a877146102ac5780637f4ab1dd146102e3578063893c14401461030357806391d1485414610316578063948b851e14610329578063a217fddf1461035057600080fd5b80633630e2ea116101155780633630e2ea1461020657806336568abe14610219578063572b6c051461022c5780635b119c0a1461026c5780635b577f66146102865780637d045df61461029957600080fd5b806301ffc9a71461015d5780630a3640d21461018557806311d1c5ca146101a557806313be3212146101ba578063248a9ca3146101d05780632f2ff15d146101f3575b600080fd5b61017061016b366004610c59565b6103d3565b60405190151581526020015b60405180910390f35b610198610193366004610cb0565b61040a565b60405161017c9190610d75565b6101b86101b3366004610dbb565b6104cc565b005b6101c2610505565b60405190815260200161017c565b6101c26101de366004610e30565b60009081526020819052604090206001015490565b6101b8610201366004610e49565b610515565b6101b8610214366004610dbb565b610540565b6101b8610227366004610e49565b610574565b61017061023a366004610e75565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0390811691161490565b610274601581565b60405160ff909116815260200161017c565b610170610294366004610e75565b6105b7565b6101706102a7366004610e9f565b6105d8565b6040516001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016815260200161017c565b6102f66102f1366004610e9f565b6105f4565b60405161017c9190610ebc565b6101b8610311366004610e75565b61068a565b610170610324366004610e49565b6106c1565b6101c27f1b03c849816e077359373cf0a8d6d8f741d643bc1e95273ffe11515f83bebf6181565b6101c2600081565b610170610366366004610f0b565b6106ea565b610274610379366004610f0b565b610774565b6101b861038c366004610e49565b6107a8565b6101b861039f366004610e75565b6107cd565b610274601681565b6101c27f1b94c92b564251ed6b49246d9a82eb7a486b6490f3b3a3bf3b28d2e99801f3ec81565b60006001600160e01b03198216637965db0b60e01b148061040457506301ffc9a760e01b6001600160e01b03198316145b92915050565b60606000825167ffffffffffffffff81111561042857610428610c83565b604051908082528060200260200182016040528015610451578160200160208202803683370190505b50905060005b83518110156104c55761049b84828151811061047557610475610f47565b60200260200101516001600160a01b031660009081526001602052604090205460ff1690565b8282815181106104ad576104ad610f47565b91151560209283029190910190910152600101610457565b5092915050565b7f1b03c849816e077359373cf0a8d6d8f741d643bc1e95273ffe11515f83bebf616104f681610800565b6105008383610814565b505050565b600061051060025490565b905090565b60008281526020819052604090206001015461053081610800565b61053a83836108de565b50505050565b7f1b94c92b564251ed6b49246d9a82eb7a486b6490f3b3a3bf3b28d2e99801f3ec61056a81610800565b6105008383610971565b61057c610a35565b6001600160a01b0316816001600160a01b0316146105ad5760405163334bd91960e11b815260040160405180910390fd5b6105008282610a3f565b6001600160a01b03811660009081526001602052604081205460ff16610404565b600060ff821660151480610404575060ff821660161492915050565b606060141960ff831601610621576040518060600160405280602281526020016110586022913992915050565b60151960ff83160161064c576040518060600160405280602581526020016110336025913992915050565b505060408051808201909152601881527f556e6b6e6f776e207265737472696374696f6e20636f64650000000000000000602082015290565b919050565b7f1b94c92b564251ed6b49246d9a82eb7a486b6490f3b3a3bf3b28d2e99801f3ec6106b481610800565b6106bd82610ac8565b5050565b6000918252602082815260408084206001600160a01b0393909316845291905290205460ff1690565b60405163d4ce141560e01b81526001600160a01b03848116600483015283166024820152604481018290526000908190309063d4ce141590606401602060405180830381865afa158015610742573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107669190610f5d565b60ff161490505b9392505050565b600061077f846105b7565b61078b5750601561076d565b610794836105b7565b6107a05750601661076d565b50600061076d565b6000828152602081905260409020600101546107c381610800565b61053a8383610a3f565b7f1b03c849816e077359373cf0a8d6d8f741d643bc1e95273ffe11515f83bebf616107f781610800565b6106bd82610b38565b6108118161080c610a35565b610ba7565b50565b60025460005b828110156108d6576001600085858481811061083857610838610f47565b905060200201602081019061084d9190610e75565b6001600160a01b0316815260208101919091526040016000205460ff166108ce57600180600086868581811061088557610885610f47565b905060200201602081019061089a9190610e75565b6001600160a01b031681526020810191909152604001600020805460ff19169115159190911790556108cb82610f90565b91505b60010161081a565b506002555050565b60006108ea83836106c1565b610969576000838152602081815260408083206001600160a01b03861684529091529020805460ff19166001179055610921610a35565b6001600160a01b0316826001600160a01b0316847f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a4506001610404565b506000610404565b60025460005b828110156108d6576001600085858481811061099557610995610f47565b90506020020160208101906109aa9190610e75565b6001600160a01b0316815260208101919091526040016000205460ff1615610a2d576000600160008686858181106109e4576109e4610f47565b90506020020160208101906109f99190610e75565b6001600160a01b031681526020810191909152604001600020805460ff1916911515919091179055610a2a82610fa9565b91505b600101610977565b6000610510610be4565b6000610a4b83836106c1565b15610969576000838152602081815260408083206001600160a01b03861684529091529020805460ff19169055610a80610a35565b6001600160a01b0316826001600160a01b0316847ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a4506001610404565b6001600160a01b03811660009081526001602052604090205460ff16610b015760405163cfc5cc9560e01b815260040160405180910390fd5b6001600160a01b0381166000908152600160205260408120805460ff1916905560028054909190610b3190610fa9565b9091555050565b6001600160a01b03811660009081526001602052604090205460ff1615610b72576040516357845b8b60e01b815260040160405180910390fd5b6001600160a01b03811660009081526001602081905260408220805460ff1916909117905560028054909190610b3190610f90565b610bb182826106c1565b6106bd5760405163e2517d3f60e01b81526001600160a01b03821660048201526024810183905260440160405180910390fd5b6000366014336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148015610c215750808210155b15610c5157600036610c338385610fc0565b610c3e928290610fd3565b610c4791610ffd565b60601c9250505090565b339250505090565b600060208284031215610c6b57600080fd5b81356001600160e01b03198116811461076d57600080fd5b634e487b7160e01b600052604160045260246000fd5b80356001600160a01b038116811461068557600080fd5b60006020808385031215610cc357600080fd5b823567ffffffffffffffff80821115610cdb57600080fd5b818501915085601f830112610cef57600080fd5b813581811115610d0157610d01610c83565b8060051b604051601f19603f83011681018181108582111715610d2657610d26610c83565b604052918252848201925083810185019188831115610d4457600080fd5b938501935b82851015610d6957610d5a85610c99565b84529385019392850192610d49565b98975050505050505050565b6020808252825182820181905260009190848201906040850190845b81811015610daf578351151583529284019291840191600101610d91565b50909695505050505050565b60008060208385031215610dce57600080fd5b823567ffffffffffffffff80821115610de657600080fd5b818501915085601f830112610dfa57600080fd5b813581811115610e0957600080fd5b8660208260051b8501011115610e1e57600080fd5b60209290920196919550909350505050565b600060208284031215610e4257600080fd5b5035919050565b60008060408385031215610e5c57600080fd5b82359150610e6c60208401610c99565b90509250929050565b600060208284031215610e8757600080fd5b61076d82610c99565b60ff8116811461081157600080fd5b600060208284031215610eb157600080fd5b813561076d81610e90565b60006020808352835180602085015260005b81811015610eea57858101830151858201604001528201610ece565b506000604082860101526040601f19601f8301168501019250505092915050565b600080600060608486031215610f2057600080fd5b610f2984610c99565b9250610f3760208501610c99565b9150604084013590509250925092565b634e487b7160e01b600052603260045260246000fd5b600060208284031215610f6f57600080fd5b815161076d81610e90565b634e487b7160e01b600052601160045260246000fd5b600060018201610fa257610fa2610f7a565b5060010190565b600081610fb857610fb8610f7a565b506000190190565b8181038181111561040457610404610f7a565b60008085851115610fe357600080fd5b83861115610ff057600080fd5b5050820193919092039150565b6bffffffffffffffffffffffff19813581811691601485101561102a5780818660140360031b1b83161692505b50509291505056fe54686520726563697069656e74206973206e6f7420696e207468652077686974656c6973745468652073656e646572206973206e6f7420696e207468652077686974656c697374a26469706673582212202f76450923b188395ecb3c568a17c231c8c077751daf86f1e09a79884d5888dc64736f6c63430008160033",
+    "sourceMap": "204:1035:100:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2565:202:62;;;;;;:::i;:::-;;:::i;:::-;;;470:14:139;;463:22;445:41;;433:2;418:18;2565:202:62;;;;;;;;3537:356:102;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;1400:190::-;;;;;;:::i;:::-;;:::i;:::-;;3012:107;;;:::i;:::-;;;3346:25:139;;;3334:2;3319:18;3012:107:102;3200:177:139;3810:120:62;;;;;;:::i;:::-;3875:7;3901:12;;;;;;;;;;:22;;;;3810:120;4226:136;;;;;;:::i;:::-;;:::i;1880:203:102:-;;;;;;:::i;:::-;;:::i;5328:245:62:-;;;;;;:::i;:::-;;:::i;1830:137:66:-;;;;;;:::i;:::-;1705:17;-1:-1:-1;;;;;1929:31:66;;;;;;;1830:137;490:60:106;;548:2;490:60;;;;;4371:4:139;4359:17;;;4341:36;;4329:2;4314:18;490:60:106;4199:184:139;3312:146:102;;;;;;:::i;:::-;;:::i;511:274:110:-;;;;;;:::i;:::-;;:::i;1622:107:66:-;;;-1:-1:-1;;;;;1705:17:66;4919:32:139;4901:51;;4889:2;4874:18;1622:107:66;4755:203:139;977:447:110;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;2701:190:102:-;;;;;;:::i;:::-;;:::i;2854:136:62:-;;;;;;:::i;:::-;;:::i;313:82:104:-;;361:34;313:82;;2187:49:62;;2232:4;2187:49;;418:355:109;;;;;;:::i;:::-;;:::i;804:433:100:-;;;;;;:::i;:::-;;:::i;4642:138:62:-;;;;;;:::i;:::-;;:::i;2292:171:102:-;;;;;;:::i;:::-;;:::i;556:58:106:-;;612:2;556:58;;219:88:104;;270:37;219:88;;2565:202:62;2650:4;-1:-1:-1;;;;;;2673:47:62;;-1:-1:-1;;;2673:47:62;;:87;;-1:-1:-1;;;;;;;;;;861:40:78;;;2724:36:62;2666:94;2565:202;-1:-1:-1;;2565:202:62:o;3537:356:102:-;3637:13;3662:22;3698:16;:23;3687:35;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;3687:35:102;;3662:60;;3737:9;3732:130;3756:16;:23;3752:1;:27;3732:130;;;3814:37;3831:16;3848:1;3831:19;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;;;;3139:20:103;3116:4;3139:20;;;:4;:20;;;;;;;;;3029:137;3814:37:102;3800:8;3809:1;3800:11;;;;;;;;:::i;:::-;:51;;;:11;;;;;;;;;;;:51;3781:3;;3732:130;;;-1:-1:-1;3878:8:102;3537:356;-1:-1:-1;;3537:356:102:o;1400:190::-;361:34:104;2464:16:62;2475:4;2464:10;:16::i;:::-;1537:46:102::1;1560:22;;1537;:46::i;:::-;1400:190:::0;;;:::o;3012:107::-;3064:7;3090:22;2813:16:103;;;2732:104;3090:22:102;3083:29;;3012:107;:::o;4226:136:62:-;3875:7;3901:12;;;;;;;;;;:22;;;2464:16;2475:4;2464:10;:16::i;:::-;4330:25:::1;4341:4;4347:7;4330:10;:25::i;:::-;;4226:136:::0;;;:::o;1880:203:102:-;270:37:104;2464:16:62;2475:4;2464:10;:16::i;:::-;2025:51:102::1;2053:22;;2025:27;:51::i;5328:245:62:-:0;5443:12;:10;:12::i;:::-;-1:-1:-1;;;;;5421:34:62;:18;-1:-1:-1;;;;;5421:34:62;;5417:102;;5478:30;;-1:-1:-1;;;5478:30:62;;;;;;;;;;;5417:102;5529:37;5541:4;5547:18;5529:11;:37::i;3312:146:102:-;-1:-1:-1;;;;;3139:20:103;;3396:4:102;3139:20:103;;;:4;:20;;;;;;;;3419:32:102;3029:137:103;511:274:110;623:4;658:53;;;548:2:106;658:53:110;;:120;;-1:-1:-1;727:51:110;;;612:2:106;727:51:110;639:139;511:274;-1:-1:-1;;511:274:110:o;977:447::-;1086:13;-1:-1:-1;;1115:53:110;;;;1111:307;;1191:33;;;;;;;;;;;;;;;;;1184:40;977:447;-1:-1:-1;;977:447:110:o;1111:307::-;-1:-1:-1;;1245:51:110;;;;1241:177;;1319:31;;;;;;;;;;;;;;;;;1312:38;977:447;-1:-1:-1;;977:447:110:o;1241:177::-;-1:-1:-1;;1388:19:110;;;;;;;;;;;;;;;;;;977:447::o;1241:177::-;977:447;;;:::o;2701:190:102:-;270:37:104;2464:16:62;2475:4;2464:10;:16::i;:::-;2834:50:102::1;2860:23;2834:25;:50::i;:::-;2701:190:::0;;:::o;2854:136:62:-;2931:4;2954:12;;;;;;;;;;;-1:-1:-1;;;;;2954:29:62;;;;;;;;;;;;;;;2854:136::o;418:355:109:-;662:51;;-1:-1:-1;;;662:51:109;;-1:-1:-1;;;;;6371:15:139;;;662:51:109;;;6353:34:139;6423:15;;6403:18;;;6396:43;6455:18;;;6448:34;;;549:12:109;;;;662:4;;:30;;6288:18:139;;662:51:109;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:104;;;643:123;;418:355;;;;;;:::o;804:433:100:-;949:5;971:22;987:5;971:15;:22::i;:::-;966:265;;-1:-1:-1;548:2:106;1009:40:100;;966:265;1071:20;1087:3;1071:15;:20::i;:::-;1066:165;;-1:-1:-1;612:2:106;1107:38:100;;1066:165;-1:-1:-1;1189:30:100;1176:44;;4642:138:62;3875:7;3901:12;;;;;;;;;;:22;;;2464:16;2475:4;2464:10;:16::i;:::-;4747:26:::1;4759:4;4765:7;4747:11;:26::i;2292:171:102:-:0;361:34:104;2464:16:62;2475:4;2464:10;:16::i;:::-;2414:42:102::1;2435:20;2414;:42::i;3199:103:62:-:0;3265:30;3276:4;3282:12;:10;:12::i;:::-;3265:10;:30::i;:::-;3199:103;:::o;607:406:103:-;724:16;;692:29;750:207;770:24;;;750:207;;;820:4;:22;825:13;;839:1;825:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;820:22:103;;;;;;;;;;;;-1:-1:-1;820:22:103;;;;815:132;;887:4;862;:22;867:13;;881:1;867:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;862:22:103;;;;;;;;;;;;-1:-1:-1;862:22:103;:29;;-1:-1:-1;;862:29:103;;;;;;;;;;909:23;;;:::i;:::-;;;815:132;796:3;;750:207;;;-1:-1:-1;966:16:103;:40;-1:-1:-1;;607:406:103:o;6179:316:62:-;6256:4;6277:22;6285:4;6291:7;6277;:22::i;:::-;6272:217;;6315:6;:12;;;;;;;;;;;-1:-1:-1;;;;;6315:29:62;;;;;;;;;:36;;-1:-1:-1;;6315:36:62;6347:4;6315:36;;;6397:12;:10;:12::i;:::-;-1:-1:-1;;;;;6370:40:62;6388:7;-1:-1:-1;;;;;6370:40:62;6382:4;6370:40;;;;;;;;;;-1:-1:-1;6431:4:62;6424:11;;6272:217;-1:-1:-1;6473:5:62;6466:12;;1284:425:103;1420:16;;1388:29;1446:207;1466:24;;;1446:207;;;1515:4;:22;1520:13;;1534:1;1520:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;1515:22:103;;;;;;;;;;;;-1:-1:-1;1515:22:103;;;;1511:132;;;1582:5;1557:4;:22;1562:13;;1576:1;1562:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;1557:22:103;;;;;;;;;;;;-1:-1:-1;1557:22:103;:30;;-1:-1:-1;;1557:30:103;;;;;;;;;;1605:23;;;:::i;:::-;;;1511:132;1492:3;;1446:207;;3994:182:102;4105:14;4142:27;:25;:27::i;6730:317:62:-;6808:4;6828:22;6836:4;6842:7;6828;:22::i;:::-;6824:217;;;6898:5;6866:12;;;;;;;;;;;-1:-1:-1;;;;;6866:29:62;;;;;;;;;:37;;-1:-1:-1;;6866:37:62;;;6949:12;:10;:12::i;:::-;-1:-1:-1;;;;;6922:40:62;6940:7;-1:-1:-1;;;;;6922:40:62;6934:4;6922:40;;;;;;;;;;-1:-1:-1;6983:4:62;6976:11;;2362:249:103;-1:-1:-1;;;;;2449:24:103;;;;;;:4;:24;;;;;;;;2444:91;;2496:28;;-1:-1:-1;;;2496:28:103;;;;;;;;;;;2444:91;-1:-1:-1;;;;;2544:24:103;;2571:5;2544:24;;;:4;:24;;;;;:32;;-1:-1:-1;;2544:32:103;;;2588:16;2586:18;;2588:16;;2571:5;2586:18;;;:::i;:::-;;;;-1:-1:-1;;2362:249:103:o;1903:236::-;-1:-1:-1;;;;;1981:21:103;;;;;;:4;:21;;;;;;;;1977:90;;;2025:31;;-1:-1:-1;;;2025:31:103;;;;;;;;;;;1977:90;-1:-1:-1;;;;;2076:21:103;;;;;;2100:4;2076:21;;;;;;;:28;;-1:-1:-1;;2076:28:103;;;;;;2116:16;2114:18;;2116:16;;2076:21;2114:18;;;:::i;3432:197:62:-;3520:22;3528:4;3534:7;3520;:22::i;:::-;3515:108;;3565:47;;-1:-1:-1;;;3565:47:62;;-1:-1:-1;;;;;7350:32:139;;3565:47:62;;;7332:51:139;7399:18;;;7392:34;;;7305:18;;3565:47:62;;;;;;;2204:429:66;2266:7;2310:8;3481:2;2420:10;-1:-1:-1;;;;;1705:17:66;1929:31;;2401:71;;;;;2453:19;2435:14;:37;;2401:71;2397:230;;;2511:8;;2520:36;2537:19;2520:14;:36;:::i;:::-;2511:47;;;;;:::i;:::-;2503:56;;;:::i;:::-;2495:65;;2488:72;;;;2204:429;:::o;2397:230::-;735:10:73;2591:25:66;;;;2204:429;:::o;14:286:139:-;72:6;125:2;113:9;104:7;100:23;96:32;93:52;;;141:1;138;131:12;93:52;167:23;;-1:-1:-1;;;;;;219:32:139;;209:43;;199:71;;266:1;263;256:12;497:127;558:10;553:3;549:20;546:1;539:31;589:4;586:1;579:15;613:4;610:1;603:15;629:173;697:20;;-1:-1:-1;;;;;746:31:139;;736:42;;726:70;;792:1;789;782:12;807:1121;891:6;922:2;965;953:9;944:7;940:23;936:32;933:52;;;981:1;978;971:12;933:52;1021:9;1008:23;1050:18;1091:2;1083:6;1080:14;1077:34;;;1107:1;1104;1097:12;1077:34;1145:6;1134:9;1130:22;1120:32;;1190:7;1183:4;1179:2;1175:13;1171:27;1161:55;;1212:1;1209;1202:12;1161:55;1248:2;1235:16;1270:2;1266;1263:10;1260:36;;;1276:18;;:::i;:::-;1322:2;1319:1;1315:10;1354:2;1348:9;1417:2;1413:7;1408:2;1404;1400:11;1396:25;1388:6;1384:38;1472:6;1460:10;1457:22;1452:2;1440:10;1437:18;1434:46;1431:72;;;1483:18;;:::i;:::-;1519:2;1512:22;1569:18;;;1603:15;;;;-1:-1:-1;1645:11:139;;;1641:20;;;1673:19;;;1670:39;;;1705:1;1702;1695:12;1670:39;1729:11;;;;1749:148;1765:6;1760:3;1757:15;1749:148;;;1831:23;1850:3;1831:23;:::i;:::-;1819:36;;1782:12;;;;1875;;;;1749:148;;;1916:6;807:1121;-1:-1:-1;;;;;;;;807:1121:139:o;1933:642::-;2098:2;2150:21;;;2220:13;;2123:18;;;2242:22;;;2069:4;;2098:2;2321:15;;;;2295:2;2280:18;;;2069:4;2364:185;2378:6;2375:1;2372:13;2364:185;;;2453:13;;2446:21;2439:29;2427:42;;2524:15;;;;2489:12;;;;2400:1;2393:9;2364:185;;;-1:-1:-1;2566:3:139;;1933:642;-1:-1:-1;;;;;;1933:642:139:o;2580:615::-;2666:6;2674;2727:2;2715:9;2706:7;2702:23;2698:32;2695:52;;;2743:1;2740;2733:12;2695:52;2783:9;2770:23;2812:18;2853:2;2845:6;2842:14;2839:34;;;2869:1;2866;2859:12;2839:34;2907:6;2896:9;2892:22;2882:32;;2952:7;2945:4;2941:2;2937:13;2933:27;2923:55;;2974:1;2971;2964:12;2923:55;3014:2;3001:16;3040:2;3032:6;3029:14;3026:34;;;3056:1;3053;3046:12;3026:34;3109:7;3104:2;3094:6;3091:1;3087:14;3083:2;3079:23;3075:32;3072:45;3069:65;;;3130:1;3127;3120:12;3069:65;3161:2;3153:11;;;;;3183:6;;-1:-1:-1;2580:615:139;;-1:-1:-1;;;;2580:615:139:o;3382:180::-;3441:6;3494:2;3482:9;3473:7;3469:23;3465:32;3462:52;;;3510:1;3507;3500:12;3462:52;-1:-1:-1;3533:23:139;;3382:180;-1:-1:-1;3382:180:139:o;3749:254::-;3817:6;3825;3878:2;3866:9;3857:7;3853:23;3849:32;3846:52;;;3894:1;3891;3884:12;3846:52;3930:9;3917:23;3907:33;;3959:38;3993:2;3982:9;3978:18;3959:38;:::i;:::-;3949:48;;3749:254;;;;;:::o;4008:186::-;4067:6;4120:2;4108:9;4099:7;4095:23;4091:32;4088:52;;;4136:1;4133;4126:12;4088:52;4159:29;4178:9;4159:29;:::i;4388:114::-;4472:4;4465:5;4461:16;4454:5;4451:27;4441:55;;4492:1;4489;4482:12;4507:243;4564:6;4617:2;4605:9;4596:7;4592:23;4588:32;4585:52;;;4633:1;4630;4623:12;4585:52;4672:9;4659:23;4691:29;4714:5;4691:29;:::i;4963:548::-;5075:4;5104:2;5133;5122:9;5115:21;5165:6;5159:13;5208:6;5203:2;5192:9;5188:18;5181:34;5233:1;5243:140;5257:6;5254:1;5251:13;5243:140;;;5352:14;;;5348:23;;5342:30;5318:17;;;5337:2;5314:26;5307:66;5272:10;;5243:140;;;5247:3;5432:1;5427:2;5418:6;5407:9;5403:22;5399:31;5392:42;5502:2;5495;5491:7;5486:2;5478:6;5474:15;5470:29;5459:9;5455:45;5451:54;5443:62;;;;4963:548;;;;:::o;5516:328::-;5593:6;5601;5609;5662:2;5650:9;5641:7;5637:23;5633:32;5630:52;;;5678:1;5675;5668:12;5630:52;5701:29;5720:9;5701:29;:::i;:::-;5691:39;;5749:38;5783:2;5772:9;5768:18;5749:38;:::i;:::-;5739:48;;5834:2;5823:9;5819:18;5806:32;5796:42;;5516:328;;;;;:::o;5849:127::-;5910:10;5905:3;5901:20;5898:1;5891:31;5941:4;5938:1;5931:15;5965:4;5962:1;5955:15;6493:247;6561:6;6614:2;6602:9;6593:7;6589:23;6585:32;6582:52;;;6630:1;6627;6620:12;6582:52;6662:9;6656:16;6681:29;6704:5;6681:29;:::i;6745:127::-;6806:10;6801:3;6797:20;6794:1;6787:31;6837:4;6834:1;6827:15;6861:4;6858:1;6851:15;6877:135;6916:3;6937:17;;;6934:43;;6957:18;;:::i;:::-;-1:-1:-1;7004:1:139;6993:13;;6877:135::o;7017:136::-;7056:3;7084:5;7074:39;;7093:18;;:::i;:::-;-1:-1:-1;;;7129:18:139;;7017:136::o;7437:128::-;7504:9;;;7525:11;;;7522:37;;;7539:18;;:::i;7570:331::-;7675:9;7686;7728:8;7716:10;7713:24;7710:44;;;7750:1;7747;7740:12;7710:44;7779:6;7769:8;7766:20;7763:40;;;7799:1;7796;7789:12;7763:40;-1:-1:-1;;7825:23:139;;;7870:25;;;;;-1:-1:-1;7570:331:139:o;7906:337::-;-1:-1:-1;;8027:19:139;;8114:11;;;;8145:2;8137:11;;8134:103;;;8224:2;8218;8211:3;8207:2;8203:12;8200:1;8196:20;8192:29;8188:2;8184:38;8180:47;8171:56;;8134:103;;;7906:337;;;;:::o",
+    "linkReferences": {},
+    "immutableReferences": {
+      "54247": [
+        { "start": 572, "length": 32 },
+        { "start": 697, "length": 32 },
+        { "start": 3060, "length": 32 }
+      ]
+    }
+  },
+  "methodIdentifiers": {
+    "ADDRESS_LIST_ADD_ROLE()": "948b851e",
+    "ADDRESS_LIST_REMOVE_ROLE()": "fa83a2da",
+    "CODE_ADDRESS_FROM_NOT_WHITELISTED()": "5b119c0a",
+    "CODE_ADDRESS_TO_NOT_WHITELISTED()": "db136dad",
+    "DEFAULT_ADMIN_ROLE()": "a217fddf",
+    "addAddressToTheList(address)": "daafd1c7",
+    "addAddressesToTheList(address[])": "11d1c5ca",
+    "addressIsListed(address)": "5b577f66",
+    "addressIsListedBatch(address[])": "0a3640d2",
+    "canReturnTransferRestrictionCode(uint8)": "7d045df6",
+    "detectTransferRestriction(address,address,uint256)": "d4ce1415",
+    "getRoleAdmin(bytes32)": "248a9ca3",
+    "grantRole(bytes32,address)": "2f2ff15d",
+    "hasRole(bytes32,address)": "91d14854",
+    "isTrustedForwarder(address)": "572b6c05",
+    "messageForTransferRestriction(uint8)": "7f4ab1dd",
+    "numberListedAddress()": "13be3212",
+    "removeAddressFromTheList(address)": "893c1440",
+    "removeAddressesFromTheList(address[])": "3630e2ea",
+    "renounceRole(bytes32,address)": "36568abe",
+    "revokeRole(bytes32,address)": "d547741f",
+    "supportsInterface(bytes4)": "01ffc9a7",
+    "trustedForwarder()": "7da0a877",
+    "validateTransfer(address,address,uint256)": "c6946a12"
+  },
+  "rawMetadata": "{\"compiler\":{\"version\":\"0.8.22+commit.4fc1097e\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"admin\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"forwarderIrrevocable\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"AccessControlBadConfirmation\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"bytes32\",\"name\":\"neededRole\",\"type\":\"bytes32\"}],\"name\":\"AccessControlUnauthorizedAccount\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"RuleAddressList_AdminWithAddressZeroNotAllowed\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Rulelist_AddressAlreadylisted\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Rulelist_AddressNotPresent\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"previousAdminRole\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"newAdminRole\",\"type\":\"bytes32\"}],\"name\":\"RoleAdminChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"RoleGranted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"RoleRevoked\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"ADDRESS_LIST_ADD_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"ADDRESS_LIST_REMOVE_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"CODE_ADDRESS_FROM_NOT_WHITELISTED\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"CODE_ADDRESS_TO_NOT_WHITELISTED\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"DEFAULT_ADMIN_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_newWhitelistAddress\",\"type\":\"address\"}],\"name\":\"addAddressToTheList\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"listWhitelistedAddress\",\"type\":\"address[]\"}],\"name\":\"addAddressesToTheList\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_targetAddress\",\"type\":\"address\"}],\"name\":\"addressIsListed\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"_targetAddresses\",\"type\":\"address[]\"}],\"name\":\"addressIsListedBatch\",\"outputs\":[{\"internalType\":\"bool[]\",\"name\":\"\",\"type\":\"bool[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint8\",\"name\":\"_restrictionCode\",\"type\":\"uint8\"}],\"name\":\"canReturnTransferRestrictionCode\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"detectTransferRestriction\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"}],\"name\":\"getRoleAdmin\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"grantRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"hasRole\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"forwarder\",\"type\":\"address\"}],\"name\":\"isTrustedForwarder\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint8\",\"name\":\"_restrictionCode\",\"type\":\"uint8\"}],\"name\":\"messageForTransferRestriction\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"numberListedAddress\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_removeWhitelistAddress\",\"type\":\"address\"}],\"name\":\"removeAddressFromTheList\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"listWhitelistedAddress\",\"type\":\"address[]\"}],\"name\":\"removeAddressesFromTheList\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"callerConfirmation\",\"type\":\"address\"}],\"name\":\"renounceRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"revokeRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"supportsInterface\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"trustedForwarder\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_amount\",\"type\":\"uint256\"}],\"name\":\"validateTransfer\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"isValid\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"errors\":{\"AccessControlBadConfirmation()\":[{\"details\":\"The caller of a function is not the expected one. NOTE: Don't confuse with {AccessControlUnauthorizedAccount}.\"}],\"AccessControlUnauthorizedAccount(address,bytes32)\":[{\"details\":\"The `account` is missing a role.\"}]},\"events\":{\"RoleAdminChanged(bytes32,bytes32,bytes32)\":{\"details\":\"Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite {RoleAdminChanged} not being emitted signaling this.\"},\"RoleGranted(bytes32,address,address)\":{\"details\":\"Emitted when `account` is granted `role`. `sender` is the account that originated the contract call, an admin role bearer except when using {AccessControl-_setupRole}.\"},\"RoleRevoked(bytes32,address,address)\":{\"details\":\"Emitted when `account` is revoked `role`. `sender` is the account that originated the contract call:   - if using `revokeRole`, it is the admin role bearer   - if using `renounceRole`, it is the role bearer (i.e. `account`)\"}},\"kind\":\"dev\",\"methods\":{\"addAddressToTheList(address)\":{\"params\":{\"_newWhitelistAddress\":\"The address to whitelist\"}},\"addAddressesToTheList(address[])\":{\"params\":{\"listWhitelistedAddress\":\"an array with the addresses to whitelist\"}},\"addressIsListed(address)\":{\"params\":{\"_targetAddress\":\"The concerned address\"},\"returns\":{\"_0\":\"True if the address is listed, false otherwise\"}},\"canReturnTransferRestrictionCode(uint8)\":{\"params\":{\"_restrictionCode\":\"The target restriction code\"},\"returns\":{\"_0\":\"true if the restriction code is known, false otherwise*\"}},\"constructor\":{\"params\":{\"admin\":\"Address of the contract (Access Control)\",\"forwarderIrrevocable\":\"Address of the forwarder, required for the gasless support\"}},\"detectTransferRestriction(address,address,uint256)\":{\"params\":{\"_from\":\"the origin address\",\"_to\":\"the destination address\"},\"returns\":{\"_0\":\"The restricion code or REJECTED_CODE_BASE.TRANSFER_OK*\"}},\"getRoleAdmin(bytes32)\":{\"details\":\"Returns the admin role that controls `role`. See {grantRole} and {revokeRole}. To change a role's admin, use {_setRoleAdmin}.\"},\"grantRole(bytes32,address)\":{\"details\":\"Grants `role` to `account`. If `account` had not been already granted `role`, emits a {RoleGranted} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleGranted} event.\"},\"hasRole(bytes32,address)\":{\"details\":\"Returns `true` if `account` has been granted `role`.\"},\"isTrustedForwarder(address)\":{\"details\":\"Indicates whether any particular address is the trusted forwarder.\"},\"messageForTransferRestriction(uint8)\":{\"params\":{\"_restrictionCode\":\"The target restriction code\"},\"returns\":{\"_0\":\"true if the transfer is valid, false otherwise*\"}},\"numberListedAddress()\":{\"returns\":{\"_0\":\"Number of listed addresses\"}},\"removeAddressFromTheList(address)\":{\"params\":{\"_removeWhitelistAddress\":\"The address to remove\"}},\"removeAddressesFromTheList(address[])\":{\"params\":{\"listWhitelistedAddress\":\"an array with the addresses to remove\"}},\"renounceRole(bytes32,address)\":{\"details\":\"Revokes `role` from the calling account. Roles are often managed via {grantRole} and {revokeRole}: this function's purpose is to provide a mechanism for accounts to lose their privileges if they are compromised (such as when a trusted device is misplaced). If the calling account had been revoked `role`, emits a {RoleRevoked} event. Requirements: - the caller must be `callerConfirmation`. May emit a {RoleRevoked} event.\"},\"revokeRole(bytes32,address)\":{\"details\":\"Revokes `role` from `account`. If `account` had been granted `role`, emits a {RoleRevoked} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleRevoked} event.\"},\"supportsInterface(bytes4)\":{\"details\":\"See {IERC165-supportsInterface}.\"},\"trustedForwarder()\":{\"details\":\"Returns the address of the trusted forwarder.\"},\"validateTransfer(address,address,uint256)\":{\"params\":{\"_amount\":\"to transfer\",\"_from\":\"the origin address\",\"_to\":\"the destination address\"},\"returns\":{\"isValid\":\"=> true if the transfer is valid, false otherwise*\"}}},\"title\":\"a whitelist manager\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"addAddressToTheList(address)\":{\"notice\":\"Add one address to the whitelist If the address already exists, the transaction is reverted to save gas.\"},\"addAddressesToTheList(address[])\":{\"notice\":\"Add addresses to the whitelist If one of addresses already exist, there is no change for this address. The transaction remains valid (no revert).\"},\"addressIsListed(address)\":{\"notice\":\"Know if an address is listed or not\"},\"addressIsListedBatch(address[])\":{\"notice\":\"batch version of {addressIsListed}\"},\"canReturnTransferRestrictionCode(uint8)\":{\"notice\":\"To know if the restriction code is valid for this rule or not\"},\"detectTransferRestriction(address,address,uint256)\":{\"notice\":\"Check if an addres is in the whitelist or not\"},\"messageForTransferRestriction(uint8)\":{\"notice\":\"Return the corresponding message\"},\"numberListedAddress()\":{\"notice\":\"Get the number of listed addresses\"},\"removeAddressFromTheList(address)\":{\"notice\":\"Remove one address from the whitelist If the address does not exist in the whitelist, the transaction is reverted to save gas.\"},\"removeAddressesFromTheList(address[])\":{\"notice\":\"Remove addresses from the whitelist If the address does not exist in the whitelist, there is no change for this address. The transaction remains valid (no revert).\"},\"validateTransfer(address,address,uint256)\":{\"notice\":\"Validate a transfer\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"src/rules/validation/RuleWhitelist.sol\":\"RuleWhitelist\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[\":@openzeppelin/contracts/=lib/openzeppelin-contracts/contracts/\",\":CMTAT/=lib/CMTAT/contracts/\",\":OZ/=lib/openzeppelin-contracts/contracts/\",\":ds-test/=lib/openzeppelin-contracts/lib/forge-std/lib/ds-test/src/\",\":erc4626-tests/=lib/openzeppelin-contracts/lib/erc4626-tests/\",\":forge-std/=lib/forge-std/src/\",\":openzeppelin-contracts/=lib/openzeppelin-contracts/\"]},\"sources\":{\"lib/CMTAT/contracts/interfaces/draft-IERC1404/draft-IERC1404.sol\":{\"keccak256\":\"0xfba123f04b693467a10bffcc3d30c8ee0a55a159d1a50a9e6ad7efa6a08ad9ad\",\"license\":\"MPL-2.0\",\"urls\":[\"bzz-raw://f0af9bead272c5af8153932efe6e464485aa27c82a2a5c79ed94e780ec373da0\",\"dweb:/ipfs/QmZJj9B5sBDGY8b5qbFkadmQ377xugKwGoxkHPWW3BpnWg\"]},\"lib/CMTAT/contracts/interfaces/draft-IERC1404/draft-IERC1404EnumCode.sol\":{\"keccak256\":\"0x5162820d851ed01a9ce5e0b28b58b4dfa6262d010e0f112ca1dd1867b37600ed\",\"license\":\"MPL-2.0\",\"urls\":[\"bzz-raw://599cbb744369ec114f918eec3f462d0f2f0a33bab292683be34098bf98b31423\",\"dweb:/ipfs/QmTSYGzsUDicQ5jCu88r2XnRqFyS5nJqfPGiz4q3aL35mx\"]},\"lib/CMTAT/contracts/interfaces/draft-IERC1404/draft-IERC1404Wrapper.sol\":{\"keccak256\":\"0xefa53aa4e697f2fd338b56888c9492392100a146ccd7a2c107cbd189f5c99ea3\",\"license\":\"MPL-2.0\",\"urls\":[\"bzz-raw://a7a5933297a01300d5eb8baa49cce9c98c5f3779e329f4ac41dae6e128bdf68e\",\"dweb:/ipfs/QmcDMxLHuuc7n8dVw6PWtQaRrkqMrtQUoBt4XKeNHF69mF\"]},\"lib/openzeppelin-contracts/contracts/access/AccessControl.sol\":{\"keccak256\":\"0xa0e92d42942f4f57c5be50568dac11e9d00c93efcb458026e18d2d9b9b2e7308\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://46326c0bb1e296b67185e81c918e0b40501b8b6386165855df0a3f3c634b6a80\",\"dweb:/ipfs/QmTwyrDYtsxsk6pymJTK94PnEpzsmkpUxFuzEiakDopy4Z\"]},\"lib/openzeppelin-contracts/contracts/access/IAccessControl.sol\":{\"keccak256\":\"0xb6b36edd6a2999fd243ff226d6cbf84bd71af2432bbd0dfe19392996a1d9cb41\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://1fd2f35495652e57e3f99bc6c510bc5f7dd398a176ea2e72d8ed730aebc6ca26\",\"dweb:/ipfs/QmTQV6X4gkikTib49cho5iDX3JvSQbdsoEChoDwrk3CbbH\"]},\"lib/openzeppelin-contracts/contracts/metatx/ERC2771Context.sol\":{\"keccak256\":\"0x98256cf37b71a69b2f5a8a6fe975ea03590dff703102bd141a830f94e8adebf6\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://6251fe1f6a1e45e6d619d150c123afc88b8646b38ee26a136efa9a6988a31d3f\",\"dweb:/ipfs/QmeXDT85wSZdP31wkz3ah3KhponCiksJLP5o2LR5e1JxcK\"]},\"lib/openzeppelin-contracts/contracts/utils/Context.sol\":{\"keccak256\":\"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://6a708e8a5bdb1011c2c381c9a5cfd8a9a956d7d0a9dc1bd8bcdaf52f76ef2f12\",\"dweb:/ipfs/Qmax9WHBnVsZP46ZxEMNRQpLQnrdE4dK8LehML1Py8FowF\"]},\"lib/openzeppelin-contracts/contracts/utils/introspection/ERC165.sol\":{\"keccak256\":\"0x9e8778b14317ba9e256c30a76fd6c32b960af621987f56069e1e819c77c6a133\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://1777404f1dcd0fac188e55a288724ec3c67b45288e49cc64723e95e702b49ab8\",\"dweb:/ipfs/QmZFdC626GButBApwDUvvTnUzdinevC3B24d7yyh57XkiA\"]},\"lib/openzeppelin-contracts/contracts/utils/introspection/IERC165.sol\":{\"keccak256\":\"0x4296879f55019b23e135000eb36896057e7101fb7fb859c5ef690cf14643757b\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://87b3541437c8c443ccd36795e56a338ed12855eec17f8da624511b8d1a7e14df\",\"dweb:/ipfs/QmeJQCtZrQjtJLr6u7ZHWeH3pBnjtLWzvRrKViAi7UZqxL\"]},\"src/interfaces/IRuleValidation.sol\":{\"keccak256\":\"0x6b23f8d7355937f0d304ceb498f661b004d1969f87782af7588a960273af38a1\",\"license\":\"MPL-2.0\",\"urls\":[\"bzz-raw://b9c92ca4ce23304474c8236dd37c60f2c98627ca2a6156eb2ce0767436f40fa9\",\"dweb:/ipfs/QmZMkCu57MjUXjN5TtkhDGgM9RzGQpTX3uD79P1M9Vn2G8\"]},\"src/modules/MetaTxModuleStandalone.sol\":{\"keccak256\":\"0x32423330fbd140fb87b7f3c9f004db3eb7256f0f8c15b76be26ff14ba81edba0\",\"license\":\"MPL-2.0\",\"urls\":[\"bzz-raw://af6e6cfd9ccb587283b8379965a76143a27aaa38115191db1bbb1a5632eb4a25\",\"dweb:/ipfs/QmTdaEc78NfG9wJRYErsCZajvNF8ozLaqEfNyzi7Fu1fMj\"]},\"src/rules/validation/RuleWhitelist.sol\":{\"keccak256\":\"0xf0e635201c41e836209c5b95410eee4f53917039e67d62e6d4b906f86fb6ef43\",\"license\":\"MPL-2.0\",\"urls\":[\"bzz-raw://a047917130bf5d3f6b64285f99bd9d5ff483b4b32753fa85d77d8858e2e2a690\",\"dweb:/ipfs/QmQpvEQXNWm1aitXH6fkDg7nirUzrKHCicmeuPNDXN3QBP\"]},\"src/rules/validation/abstract/RuleAddressList/RuleAddressList.sol\":{\"keccak256\":\"0x062f188bd35d2e2ca224c7a5b576c5720275e5175d3fa3ffd9ab896dcf21c400\",\"license\":\"MPL-2.0\",\"urls\":[\"bzz-raw://fa847c271016bae89e056f66898f4fba411b348bb312face86c94758f8a378ac\",\"dweb:/ipfs/QmPGHHbsmxVgL7tcc77qNVMfxtESgnYqrvdLqxGXdXw2bM\"]},\"src/rules/validation/abstract/RuleAddressList/RuleAddressListInternal.sol\":{\"keccak256\":\"0x4fe41635bb8060e980ed5d9847afd0f2bb89c64501254bea619e65a727ba67b6\",\"license\":\"MPL-2.0\",\"urls\":[\"bzz-raw://e0e417e96caa101c0a8a6a25944c89d9690cd166680dd298918e4819f415c531\",\"dweb:/ipfs/QmPJeFJW8g4dzfHU81Kt5kfLBgVWevChUzArFSjh5iDVR8\"]},\"src/rules/validation/abstract/RuleAddressList/invariantStorage/RuleAddressListInvariantStorage.sol\":{\"keccak256\":\"0x56c9ca1310dccae89d1019b5a9041fcd11f8344656221995fe2fbc4d095b37c3\",\"license\":\"MPL-2.0\",\"urls\":[\"bzz-raw://ce143c19d8c1d192e4fddabb32be213caef4c6bfa19dcf79f3ae6a6cc518a1b7\",\"dweb:/ipfs/Qmbn9wRsiRybULTaKqBkPWe6SEbbfKVRttD1mi2cb8RznB\"]},\"src/rules/validation/abstract/RuleAddressList/invariantStorage/RuleWhitelistInvariantStorage.sol\":{\"keccak256\":\"0x39a4b0b5ef4d03b32e826c67c0244bd0bdc803656e6f7d2301c395b7a3bd5bb2\",\"license\":\"MPL-2.0\",\"urls\":[\"bzz-raw://5c6222cc7a6e87d1bd11c5989c83ee6bf09dca003c3002845dbf41a4b694246e\",\"dweb:/ipfs/QmXQy7odhSupb6BjG1T1KjbmaLs7mcBrag7Sn3cp2JGUyb\"]},\"src/rules/validation/abstract/RuleCommonInvariantStorage.sol\":{\"keccak256\":\"0xea52693dfabf31d5b94201b78ba04cd4e7f9985b616965530317dcb25c59b678\",\"license\":\"MPL-2.0\",\"urls\":[\"bzz-raw://c6a24a2b31405e5511548afd5dca62ea8670a71ebb7fce8604637609ff320749\",\"dweb:/ipfs/QmUDXyeySu8nBRyTWGxdrTs4NC813F5w9PyBTgMs9Y7N7u\"]},\"src/rules/validation/abstract/RuleValidateTransfer.sol\":{\"keccak256\":\"0xd843208b93b04efb86fc20e5f0f8b1a725a6402fcbe5836aadf652c9804b749b\",\"license\":\"MPL-2.0\",\"urls\":[\"bzz-raw://2ce6f485b6d7c43e823fe0add5b894c252dbc36e61143df6e4a00c1bd12dc1cd\",\"dweb:/ipfs/QmQaKkmwo8UacTADjRh9ebj1B8CCjpLRfHoUt3xMcDYhAt\"]},\"src/rules/validation/abstract/RuleWhitelistCommon.sol\":{\"keccak256\":\"0xbab37a174342a2a1d3343bb575b5e85450f662973f8c06cba6103f4071480c7c\",\"license\":\"MPL-2.0\",\"urls\":[\"bzz-raw://a45604ae07b94bec85e15b9d79d24b3ba98d8fed9eebee4e3769da215be1022c\",\"dweb:/ipfs/QmNsESHhPwpHpJiuYiFRADLXGyUuKZmXrGVMcVvt8XyALZ\"]}},\"version\":1}",
+  "metadata": {
+    "compiler": { "version": "0.8.22+commit.4fc1097e" },
+    "language": "Solidity",
+    "output": {
+      "abi": [
+        {
+          "inputs": [
+            { "internalType": "address", "name": "admin", "type": "address" },
+            {
+              "internalType": "address",
+              "name": "forwarderIrrevocable",
+              "type": "address"
+            }
+          ],
+          "stateMutability": "nonpayable",
+          "type": "constructor"
+        },
+        {
+          "inputs": [],
+          "type": "error",
+          "name": "AccessControlBadConfirmation"
+        },
+        {
+          "inputs": [
+            { "internalType": "address", "name": "account", "type": "address" },
+            {
+              "internalType": "bytes32",
+              "name": "neededRole",
+              "type": "bytes32"
+            }
+          ],
+          "type": "error",
+          "name": "AccessControlUnauthorizedAccount"
+        },
+        {
+          "inputs": [],
+          "type": "error",
+          "name": "RuleAddressList_AdminWithAddressZeroNotAllowed"
+        },
+        {
+          "inputs": [],
+          "type": "error",
+          "name": "Rulelist_AddressAlreadylisted"
+        },
+        { "inputs": [], "type": "error", "name": "Rulelist_AddressNotPresent" },
+        {
+          "inputs": [
+            {
+              "internalType": "bytes32",
+              "name": "role",
+              "type": "bytes32",
+              "indexed": true
+            },
+            {
+              "internalType": "bytes32",
+              "name": "previousAdminRole",
+              "type": "bytes32",
+              "indexed": true
+            },
+            {
+              "internalType": "bytes32",
+              "name": "newAdminRole",
+              "type": "bytes32",
+              "indexed": true
+            }
+          ],
+          "type": "event",
+          "name": "RoleAdminChanged",
+          "anonymous": false
+        },
+        {
+          "inputs": [
+            {
+              "internalType": "bytes32",
+              "name": "role",
+              "type": "bytes32",
+              "indexed": true
+            },
+            {
+              "internalType": "address",
+              "name": "account",
+              "type": "address",
+              "indexed": true
+            },
+            {
+              "internalType": "address",
+              "name": "sender",
+              "type": "address",
+              "indexed": true
+            }
+          ],
+          "type": "event",
+          "name": "RoleGranted",
+          "anonymous": false
+        },
+        {
+          "inputs": [
+            {
+              "internalType": "bytes32",
+              "name": "role",
+              "type": "bytes32",
+              "indexed": true
+            },
+            {
+              "internalType": "address",
+              "name": "account",
+              "type": "address",
+              "indexed": true
+            },
+            {
+              "internalType": "address",
+              "name": "sender",
+              "type": "address",
+              "indexed": true
+            }
+          ],
+          "type": "event",
+          "name": "RoleRevoked",
+          "anonymous": false
+        },
+        {
+          "inputs": [],
+          "stateMutability": "view",
+          "type": "function",
+          "name": "ADDRESS_LIST_ADD_ROLE",
+          "outputs": [
+            { "internalType": "bytes32", "name": "", "type": "bytes32" }
+          ]
+        },
+        {
+          "inputs": [],
+          "stateMutability": "view",
+          "type": "function",
+          "name": "ADDRESS_LIST_REMOVE_ROLE",
+          "outputs": [
+            { "internalType": "bytes32", "name": "", "type": "bytes32" }
+          ]
+        },
+        {
+          "inputs": [],
+          "stateMutability": "view",
+          "type": "function",
+          "name": "CODE_ADDRESS_FROM_NOT_WHITELISTED",
+          "outputs": [{ "internalType": "uint8", "name": "", "type": "uint8" }]
+        },
+        {
+          "inputs": [],
+          "stateMutability": "view",
+          "type": "function",
+          "name": "CODE_ADDRESS_TO_NOT_WHITELISTED",
+          "outputs": [{ "internalType": "uint8", "name": "", "type": "uint8" }]
+        },
+        {
+          "inputs": [],
+          "stateMutability": "view",
+          "type": "function",
+          "name": "DEFAULT_ADMIN_ROLE",
+          "outputs": [
+            { "internalType": "bytes32", "name": "", "type": "bytes32" }
+          ]
+        },
+        {
+          "inputs": [
+            {
+              "internalType": "address",
+              "name": "_newWhitelistAddress",
+              "type": "address"
+            }
+          ],
+          "stateMutability": "nonpayable",
+          "type": "function",
+          "name": "addAddressToTheList"
+        },
+        {
+          "inputs": [
+            {
+              "internalType": "address[]",
+              "name": "listWhitelistedAddress",
+              "type": "address[]"
+            }
+          ],
+          "stateMutability": "nonpayable",
+          "type": "function",
+          "name": "addAddressesToTheList"
+        },
+        {
+          "inputs": [
+            {
+              "internalType": "address",
+              "name": "_targetAddress",
+              "type": "address"
+            }
+          ],
+          "stateMutability": "view",
+          "type": "function",
+          "name": "addressIsListed",
+          "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }]
+        },
+        {
+          "inputs": [
+            {
+              "internalType": "address[]",
+              "name": "_targetAddresses",
+              "type": "address[]"
+            }
+          ],
+          "stateMutability": "view",
+          "type": "function",
+          "name": "addressIsListedBatch",
+          "outputs": [
+            { "internalType": "bool[]", "name": "", "type": "bool[]" }
+          ]
+        },
+        {
+          "inputs": [
+            {
+              "internalType": "uint8",
+              "name": "_restrictionCode",
+              "type": "uint8"
+            }
+          ],
+          "stateMutability": "pure",
+          "type": "function",
+          "name": "canReturnTransferRestrictionCode",
+          "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }]
+        },
+        {
+          "inputs": [
+            { "internalType": "address", "name": "_from", "type": "address" },
+            { "internalType": "address", "name": "_to", "type": "address" },
+            { "internalType": "uint256", "name": "", "type": "uint256" }
+          ],
+          "stateMutability": "view",
+          "type": "function",
+          "name": "detectTransferRestriction",
+          "outputs": [{ "internalType": "uint8", "name": "", "type": "uint8" }]
+        },
+        {
+          "inputs": [
+            { "internalType": "bytes32", "name": "role", "type": "bytes32" }
+          ],
+          "stateMutability": "view",
+          "type": "function",
+          "name": "getRoleAdmin",
+          "outputs": [
+            { "internalType": "bytes32", "name": "", "type": "bytes32" }
+          ]
+        },
+        {
+          "inputs": [
+            { "internalType": "bytes32", "name": "role", "type": "bytes32" },
+            { "internalType": "address", "name": "account", "type": "address" }
+          ],
+          "stateMutability": "nonpayable",
+          "type": "function",
+          "name": "grantRole"
+        },
+        {
+          "inputs": [
+            { "internalType": "bytes32", "name": "role", "type": "bytes32" },
+            { "internalType": "address", "name": "account", "type": "address" }
+          ],
+          "stateMutability": "view",
+          "type": "function",
+          "name": "hasRole",
+          "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }]
+        },
+        {
+          "inputs": [
+            {
+              "internalType": "address",
+              "name": "forwarder",
+              "type": "address"
+            }
+          ],
+          "stateMutability": "view",
+          "type": "function",
+          "name": "isTrustedForwarder",
+          "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }]
+        },
+        {
+          "inputs": [
+            {
+              "internalType": "uint8",
+              "name": "_restrictionCode",
+              "type": "uint8"
+            }
+          ],
+          "stateMutability": "pure",
+          "type": "function",
+          "name": "messageForTransferRestriction",
+          "outputs": [
+            { "internalType": "string", "name": "", "type": "string" }
+          ]
+        },
+        {
+          "inputs": [],
+          "stateMutability": "view",
+          "type": "function",
+          "name": "numberListedAddress",
+          "outputs": [
+            { "internalType": "uint256", "name": "", "type": "uint256" }
+          ]
+        },
+        {
+          "inputs": [
+            {
+              "internalType": "address",
+              "name": "_removeWhitelistAddress",
+              "type": "address"
+            }
+          ],
+          "stateMutability": "nonpayable",
+          "type": "function",
+          "name": "removeAddressFromTheList"
+        },
+        {
+          "inputs": [
+            {
+              "internalType": "address[]",
+              "name": "listWhitelistedAddress",
+              "type": "address[]"
+            }
+          ],
+          "stateMutability": "nonpayable",
+          "type": "function",
+          "name": "removeAddressesFromTheList"
+        },
+        {
+          "inputs": [
+            { "internalType": "bytes32", "name": "role", "type": "bytes32" },
+            {
+              "internalType": "address",
+              "name": "callerConfirmation",
+              "type": "address"
+            }
+          ],
+          "stateMutability": "nonpayable",
+          "type": "function",
+          "name": "renounceRole"
+        },
+        {
+          "inputs": [
+            { "internalType": "bytes32", "name": "role", "type": "bytes32" },
+            { "internalType": "address", "name": "account", "type": "address" }
+          ],
+          "stateMutability": "nonpayable",
+          "type": "function",
+          "name": "revokeRole"
+        },
+        {
+          "inputs": [
+            {
+              "internalType": "bytes4",
+              "name": "interfaceId",
+              "type": "bytes4"
+            }
+          ],
+          "stateMutability": "view",
+          "type": "function",
+          "name": "supportsInterface",
+          "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }]
+        },
+        {
+          "inputs": [],
+          "stateMutability": "view",
+          "type": "function",
+          "name": "trustedForwarder",
+          "outputs": [
+            { "internalType": "address", "name": "", "type": "address" }
+          ]
+        },
+        {
+          "inputs": [
+            { "internalType": "address", "name": "_from", "type": "address" },
+            { "internalType": "address", "name": "_to", "type": "address" },
+            { "internalType": "uint256", "name": "_amount", "type": "uint256" }
+          ],
+          "stateMutability": "view",
+          "type": "function",
+          "name": "validateTransfer",
+          "outputs": [
+            { "internalType": "bool", "name": "isValid", "type": "bool" }
+          ]
+        }
+      ],
+      "devdoc": {
+        "kind": "dev",
+        "methods": {
+          "addAddressToTheList(address)": {
+            "params": { "_newWhitelistAddress": "The address to whitelist" }
+          },
+          "addAddressesToTheList(address[])": {
+            "params": {
+              "listWhitelistedAddress": "an array with the addresses to whitelist"
+            }
+          },
+          "addressIsListed(address)": {
+            "params": { "_targetAddress": "The concerned address" },
+            "returns": {
+              "_0": "True if the address is listed, false otherwise"
+            }
+          },
+          "canReturnTransferRestrictionCode(uint8)": {
+            "params": { "_restrictionCode": "The target restriction code" },
+            "returns": {
+              "_0": "true if the restriction code is known, false otherwise*"
+            }
+          },
+          "constructor": {
+            "params": {
+              "admin": "Address of the contract (Access Control)",
+              "forwarderIrrevocable": "Address of the forwarder, required for the gasless support"
+            }
+          },
+          "detectTransferRestriction(address,address,uint256)": {
+            "params": {
+              "_from": "the origin address",
+              "_to": "the destination address"
+            },
+            "returns": {
+              "_0": "The restricion code or REJECTED_CODE_BASE.TRANSFER_OK*"
+            }
+          },
+          "getRoleAdmin(bytes32)": {
+            "details": "Returns the admin role that controls `role`. See {grantRole} and {revokeRole}. To change a role's admin, use {_setRoleAdmin}."
+          },
+          "grantRole(bytes32,address)": {
+            "details": "Grants `role` to `account`. If `account` had not been already granted `role`, emits a {RoleGranted} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleGranted} event."
+          },
+          "hasRole(bytes32,address)": {
+            "details": "Returns `true` if `account` has been granted `role`."
+          },
+          "isTrustedForwarder(address)": {
+            "details": "Indicates whether any particular address is the trusted forwarder."
+          },
+          "messageForTransferRestriction(uint8)": {
+            "params": { "_restrictionCode": "The target restriction code" },
+            "returns": {
+              "_0": "true if the transfer is valid, false otherwise*"
+            }
+          },
+          "numberListedAddress()": {
+            "returns": { "_0": "Number of listed addresses" }
+          },
+          "removeAddressFromTheList(address)": {
+            "params": { "_removeWhitelistAddress": "The address to remove" }
+          },
+          "removeAddressesFromTheList(address[])": {
+            "params": {
+              "listWhitelistedAddress": "an array with the addresses to remove"
+            }
+          },
+          "renounceRole(bytes32,address)": {
+            "details": "Revokes `role` from the calling account. Roles are often managed via {grantRole} and {revokeRole}: this function's purpose is to provide a mechanism for accounts to lose their privileges if they are compromised (such as when a trusted device is misplaced). If the calling account had been revoked `role`, emits a {RoleRevoked} event. Requirements: - the caller must be `callerConfirmation`. May emit a {RoleRevoked} event."
+          },
+          "revokeRole(bytes32,address)": {
+            "details": "Revokes `role` from `account`. If `account` had been granted `role`, emits a {RoleRevoked} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleRevoked} event."
+          },
+          "supportsInterface(bytes4)": {
+            "details": "See {IERC165-supportsInterface}."
+          },
+          "trustedForwarder()": {
+            "details": "Returns the address of the trusted forwarder."
+          },
+          "validateTransfer(address,address,uint256)": {
+            "params": {
+              "_amount": "to transfer",
+              "_from": "the origin address",
+              "_to": "the destination address"
+            },
+            "returns": {
+              "isValid": "=> true if the transfer is valid, false otherwise*"
+            }
+          }
+        },
+        "version": 1
+      },
+      "userdoc": {
+        "kind": "user",
+        "methods": {
+          "addAddressToTheList(address)": {
+            "notice": "Add one address to the whitelist If the address already exists, the transaction is reverted to save gas."
+          },
+          "addAddressesToTheList(address[])": {
+            "notice": "Add addresses to the whitelist If one of addresses already exist, there is no change for this address. The transaction remains valid (no revert)."
+          },
+          "addressIsListed(address)": {
+            "notice": "Know if an address is listed or not"
+          },
+          "addressIsListedBatch(address[])": {
+            "notice": "batch version of {addressIsListed}"
+          },
+          "canReturnTransferRestrictionCode(uint8)": {
+            "notice": "To know if the restriction code is valid for this rule or not"
+          },
+          "detectTransferRestriction(address,address,uint256)": {
+            "notice": "Check if an addres is in the whitelist or not"
+          },
+          "messageForTransferRestriction(uint8)": {
+            "notice": "Return the corresponding message"
+          },
+          "numberListedAddress()": {
+            "notice": "Get the number of listed addresses"
+          },
+          "removeAddressFromTheList(address)": {
+            "notice": "Remove one address from the whitelist If the address does not exist in the whitelist, the transaction is reverted to save gas."
+          },
+          "removeAddressesFromTheList(address[])": {
+            "notice": "Remove addresses from the whitelist If the address does not exist in the whitelist, there is no change for this address. The transaction remains valid (no revert)."
+          },
+          "validateTransfer(address,address,uint256)": {
+            "notice": "Validate a transfer"
+          }
+        },
+        "version": 1
+      }
+    },
+    "settings": {
+      "remappings": [
+        "@openzeppelin/contracts/=lib/openzeppelin-contracts/contracts/",
+        "CMTAT/=lib/CMTAT/contracts/",
+        "OZ/=lib/openzeppelin-contracts/contracts/",
+        "ds-test/=lib/openzeppelin-contracts/lib/forge-std/lib/ds-test/src/",
+        "erc4626-tests/=lib/openzeppelin-contracts/lib/erc4626-tests/",
+        "forge-std/=lib/forge-std/src/",
+        "openzeppelin-contracts/=lib/openzeppelin-contracts/"
+      ],
+      "optimizer": { "enabled": true, "runs": 200 },
+      "metadata": { "bytecodeHash": "ipfs" },
+      "compilationTarget": {
+        "src/rules/validation/RuleWhitelist.sol": "RuleWhitelist"
+      },
+      "evmVersion": "london",
+      "libraries": {}
+    },
+    "sources": {
+      "lib/CMTAT/contracts/interfaces/draft-IERC1404/draft-IERC1404.sol": {
+        "keccak256": "0xfba123f04b693467a10bffcc3d30c8ee0a55a159d1a50a9e6ad7efa6a08ad9ad",
+        "urls": [
+          "bzz-raw://f0af9bead272c5af8153932efe6e464485aa27c82a2a5c79ed94e780ec373da0",
+          "dweb:/ipfs/QmZJj9B5sBDGY8b5qbFkadmQ377xugKwGoxkHPWW3BpnWg"
+        ],
+        "license": "MPL-2.0"
+      },
+      "lib/CMTAT/contracts/interfaces/draft-IERC1404/draft-IERC1404EnumCode.sol": {
+        "keccak256": "0x5162820d851ed01a9ce5e0b28b58b4dfa6262d010e0f112ca1dd1867b37600ed",
+        "urls": [
+          "bzz-raw://599cbb744369ec114f918eec3f462d0f2f0a33bab292683be34098bf98b31423",
+          "dweb:/ipfs/QmTSYGzsUDicQ5jCu88r2XnRqFyS5nJqfPGiz4q3aL35mx"
+        ],
+        "license": "MPL-2.0"
+      },
+      "lib/CMTAT/contracts/interfaces/draft-IERC1404/draft-IERC1404Wrapper.sol": {
+        "keccak256": "0xefa53aa4e697f2fd338b56888c9492392100a146ccd7a2c107cbd189f5c99ea3",
+        "urls": [
+          "bzz-raw://a7a5933297a01300d5eb8baa49cce9c98c5f3779e329f4ac41dae6e128bdf68e",
+          "dweb:/ipfs/QmcDMxLHuuc7n8dVw6PWtQaRrkqMrtQUoBt4XKeNHF69mF"
+        ],
+        "license": "MPL-2.0"
+      },
+      "lib/openzeppelin-contracts/contracts/access/AccessControl.sol": {
+        "keccak256": "0xa0e92d42942f4f57c5be50568dac11e9d00c93efcb458026e18d2d9b9b2e7308",
+        "urls": [
+          "bzz-raw://46326c0bb1e296b67185e81c918e0b40501b8b6386165855df0a3f3c634b6a80",
+          "dweb:/ipfs/QmTwyrDYtsxsk6pymJTK94PnEpzsmkpUxFuzEiakDopy4Z"
+        ],
+        "license": "MIT"
+      },
+      "lib/openzeppelin-contracts/contracts/access/IAccessControl.sol": {
+        "keccak256": "0xb6b36edd6a2999fd243ff226d6cbf84bd71af2432bbd0dfe19392996a1d9cb41",
+        "urls": [
+          "bzz-raw://1fd2f35495652e57e3f99bc6c510bc5f7dd398a176ea2e72d8ed730aebc6ca26",
+          "dweb:/ipfs/QmTQV6X4gkikTib49cho5iDX3JvSQbdsoEChoDwrk3CbbH"
+        ],
+        "license": "MIT"
+      },
+      "lib/openzeppelin-contracts/contracts/metatx/ERC2771Context.sol": {
+        "keccak256": "0x98256cf37b71a69b2f5a8a6fe975ea03590dff703102bd141a830f94e8adebf6",
+        "urls": [
+          "bzz-raw://6251fe1f6a1e45e6d619d150c123afc88b8646b38ee26a136efa9a6988a31d3f",
+          "dweb:/ipfs/QmeXDT85wSZdP31wkz3ah3KhponCiksJLP5o2LR5e1JxcK"
+        ],
+        "license": "MIT"
+      },
+      "lib/openzeppelin-contracts/contracts/utils/Context.sol": {
+        "keccak256": "0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2",
+        "urls": [
+          "bzz-raw://6a708e8a5bdb1011c2c381c9a5cfd8a9a956d7d0a9dc1bd8bcdaf52f76ef2f12",
+          "dweb:/ipfs/Qmax9WHBnVsZP46ZxEMNRQpLQnrdE4dK8LehML1Py8FowF"
+        ],
+        "license": "MIT"
+      },
+      "lib/openzeppelin-contracts/contracts/utils/introspection/ERC165.sol": {
+        "keccak256": "0x9e8778b14317ba9e256c30a76fd6c32b960af621987f56069e1e819c77c6a133",
+        "urls": [
+          "bzz-raw://1777404f1dcd0fac188e55a288724ec3c67b45288e49cc64723e95e702b49ab8",
+          "dweb:/ipfs/QmZFdC626GButBApwDUvvTnUzdinevC3B24d7yyh57XkiA"
+        ],
+        "license": "MIT"
+      },
+      "lib/openzeppelin-contracts/contracts/utils/introspection/IERC165.sol": {
+        "keccak256": "0x4296879f55019b23e135000eb36896057e7101fb7fb859c5ef690cf14643757b",
+        "urls": [
+          "bzz-raw://87b3541437c8c443ccd36795e56a338ed12855eec17f8da624511b8d1a7e14df",
+          "dweb:/ipfs/QmeJQCtZrQjtJLr6u7ZHWeH3pBnjtLWzvRrKViAi7UZqxL"
+        ],
+        "license": "MIT"
+      },
+      "src/interfaces/IRuleValidation.sol": {
+        "keccak256": "0x6b23f8d7355937f0d304ceb498f661b004d1969f87782af7588a960273af38a1",
+        "urls": [
+          "bzz-raw://b9c92ca4ce23304474c8236dd37c60f2c98627ca2a6156eb2ce0767436f40fa9",
+          "dweb:/ipfs/QmZMkCu57MjUXjN5TtkhDGgM9RzGQpTX3uD79P1M9Vn2G8"
+        ],
+        "license": "MPL-2.0"
+      },
+      "src/modules/MetaTxModuleStandalone.sol": {
+        "keccak256": "0x32423330fbd140fb87b7f3c9f004db3eb7256f0f8c15b76be26ff14ba81edba0",
+        "urls": [
+          "bzz-raw://af6e6cfd9ccb587283b8379965a76143a27aaa38115191db1bbb1a5632eb4a25",
+          "dweb:/ipfs/QmTdaEc78NfG9wJRYErsCZajvNF8ozLaqEfNyzi7Fu1fMj"
+        ],
+        "license": "MPL-2.0"
+      },
+      "src/rules/validation/RuleWhitelist.sol": {
+        "keccak256": "0xf0e635201c41e836209c5b95410eee4f53917039e67d62e6d4b906f86fb6ef43",
+        "urls": [
+          "bzz-raw://a047917130bf5d3f6b64285f99bd9d5ff483b4b32753fa85d77d8858e2e2a690",
+          "dweb:/ipfs/QmQpvEQXNWm1aitXH6fkDg7nirUzrKHCicmeuPNDXN3QBP"
+        ],
+        "license": "MPL-2.0"
+      },
+      "src/rules/validation/abstract/RuleAddressList/RuleAddressList.sol": {
+        "keccak256": "0x062f188bd35d2e2ca224c7a5b576c5720275e5175d3fa3ffd9ab896dcf21c400",
+        "urls": [
+          "bzz-raw://fa847c271016bae89e056f66898f4fba411b348bb312face86c94758f8a378ac",
+          "dweb:/ipfs/QmPGHHbsmxVgL7tcc77qNVMfxtESgnYqrvdLqxGXdXw2bM"
+        ],
+        "license": "MPL-2.0"
+      },
+      "src/rules/validation/abstract/RuleAddressList/RuleAddressListInternal.sol": {
+        "keccak256": "0x4fe41635bb8060e980ed5d9847afd0f2bb89c64501254bea619e65a727ba67b6",
+        "urls": [
+          "bzz-raw://e0e417e96caa101c0a8a6a25944c89d9690cd166680dd298918e4819f415c531",
+          "dweb:/ipfs/QmPJeFJW8g4dzfHU81Kt5kfLBgVWevChUzArFSjh5iDVR8"
+        ],
+        "license": "MPL-2.0"
+      },
+      "src/rules/validation/abstract/RuleAddressList/invariantStorage/RuleAddressListInvariantStorage.sol": {
+        "keccak256": "0x56c9ca1310dccae89d1019b5a9041fcd11f8344656221995fe2fbc4d095b37c3",
+        "urls": [
+          "bzz-raw://ce143c19d8c1d192e4fddabb32be213caef4c6bfa19dcf79f3ae6a6cc518a1b7",
+          "dweb:/ipfs/Qmbn9wRsiRybULTaKqBkPWe6SEbbfKVRttD1mi2cb8RznB"
+        ],
+        "license": "MPL-2.0"
+      },
+      "src/rules/validation/abstract/RuleAddressList/invariantStorage/RuleWhitelistInvariantStorage.sol": {
+        "keccak256": "0x39a4b0b5ef4d03b32e826c67c0244bd0bdc803656e6f7d2301c395b7a3bd5bb2",
+        "urls": [
+          "bzz-raw://5c6222cc7a6e87d1bd11c5989c83ee6bf09dca003c3002845dbf41a4b694246e",
+          "dweb:/ipfs/QmXQy7odhSupb6BjG1T1KjbmaLs7mcBrag7Sn3cp2JGUyb"
+        ],
+        "license": "MPL-2.0"
+      },
+      "src/rules/validation/abstract/RuleCommonInvariantStorage.sol": {
+        "keccak256": "0xea52693dfabf31d5b94201b78ba04cd4e7f9985b616965530317dcb25c59b678",
+        "urls": [
+          "bzz-raw://c6a24a2b31405e5511548afd5dca62ea8670a71ebb7fce8604637609ff320749",
+          "dweb:/ipfs/QmUDXyeySu8nBRyTWGxdrTs4NC813F5w9PyBTgMs9Y7N7u"
+        ],
+        "license": "MPL-2.0"
+      },
+      "src/rules/validation/abstract/RuleValidateTransfer.sol": {
+        "keccak256": "0xd843208b93b04efb86fc20e5f0f8b1a725a6402fcbe5836aadf652c9804b749b",
+        "urls": [
+          "bzz-raw://2ce6f485b6d7c43e823fe0add5b894c252dbc36e61143df6e4a00c1bd12dc1cd",
+          "dweb:/ipfs/QmQaKkmwo8UacTADjRh9ebj1B8CCjpLRfHoUt3xMcDYhAt"
+        ],
+        "license": "MPL-2.0"
+      },
+      "src/rules/validation/abstract/RuleWhitelistCommon.sol": {
+        "keccak256": "0xbab37a174342a2a1d3343bb575b5e85450f662973f8c06cba6103f4071480c7c",
+        "urls": [
+          "bzz-raw://a45604ae07b94bec85e15b9d79d24b3ba98d8fed9eebee4e3769da215be1022c",
+          "dweb:/ipfs/QmNsESHhPwpHpJiuYiFRADLXGyUuKZmXrGVMcVvt8XyALZ"
+        ],
+        "license": "MPL-2.0"
+      }
+    },
+    "version": 1
+  },
+  "id": 100
+}
diff --git a/doc/schema/RuleEngine b/doc/schema/RuleEngine
index a10c47c..e908186 100644
--- a/doc/schema/RuleEngine
+++ b/doc/schema/RuleEngine
@@ -1 +1 @@
-<mxfile host="Electron" modified="2023-11-22T15:29:10.370Z" agent="5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) draw.io/20.6.2 Chrome/106.0.5249.199 Electron/21.3.3 Safari/537.36" etag="mWpZs10bCFiKODvFNmPL" version="20.6.2" type="device"><diagram id="NT6XaUAKe-6zpoMFsSYq" name="RuleEngine">1VpRc+I2EP41zLQPx1iSbfBjgPT60JtmLvRS+qbYAjQxFiOLA+7XV8aysSQTHIKJk5dI67Vk73777a5MD41Xu68cr5ffWETiHnSiXQ9NehACCAL5L5Psc4kHlWDBaaSUjoJH+osooaOkGxqRVFMUjMWCrnVhyJKEhEKTYc7ZVlebs1jfdY0XxBI8hji2pU80EstcChHyjxf+JHSxLLb2PTe/ssKFtnqVdIkjtq2I0H0PjTljIh+tdmMSZ9YrDJPf98eJq+WTcZKIJje4Uz4bcB+Tp/3fs5ftcPrPj/++qFV+4nij3nj8bXo3VU8s9oUdtksqyOMah9l8K33dQ6OlWMVyBuQQp+vc+nO6I3K/kf1wxU6EC7KriNTDfiVsRQTfSxV1FQ6U4RR0gOfl8+3REaDQWVZ9UAixcv6iXPtoHjlQFnqDtaBlLcFxks4J/02wHhwX13637EeS6C6Do5yFMU5TGuoG5GyTRJnlJo6cSaPx/b9y8sXpOwAWkll2ue+iQSGY7Ko3TPbV2QPhVL414Up40iMC8wUR5zFCIi1UbL9V/OLVuKWQcRJjQX/qAVbnKrXDA6PyiUtYAKjDAiLD2ynb8JCou6rxYCwEfQNfgbFQbhhroQNyyte+HEzIAtOUvZAks5pkKek3E0OSQNbZcLOK70LBpGNHWTRRyVZ/4WcSP7CUCsoSqfLMhGCrisJdTBfZBcGMyGUbEdOEjEv+fBUrzaPXM7xUEHoFJKgGJH5boeta1r5WjDp6eHpngvOkbXPcno/Ds/HqdSpefaQjATkXxqsfGJAysdJyvPoWguSQRliQqUoCNqKkCw6haWRLFYyhhADhNVG6olGUrTHiJKW/8PNhvQw86+zlDq/rjXrepBZOr8LfjN+yclKbaLVJXVw7fTQcIN0R78NJocLm85S04jnP8tz3TUzuk4Ukvi5UOt6wc5XOoDW6BDpdDi7my09Wt5hOhkN0IQ+65kK35cGhBQ3B5Qg6siKRHRaOUzuoukOEBbCvQIRu4ALNEwXiusuEgeW7SLYIoSgy2HeSCk7DQxX5MeUR2VFR0oQczyry4y3Z5P0FldeUSJxOMYnvWemi71T+jAWb8srQMXgF3pZXCisbaVpKigOUIxZ1rJ1J2VfI0IFhm8DuZsq+9CbtDLCPIpSxQOeMBZ2acua21rJ77RvzXntFDuwUNw3Mvt+9sNsbmN2ed2M2etuBQcKSrEyJcLo8QAHoGMnkD1jIIic5SKCDpFRijr2U58rQxpLKhSprtpwNQeN02C3IBY6rIQUV3dNbIReYhbVvLNQ25Or7VCmxSemjOR25H87pdS2qH8ttR89ysMgGpL/oS5WnzDwxTTNf84NFcz25b6lqWVgaRuhmzMN1zOLs6LWI+DmNY0PUvKup85vu2Su4DjjgfPHi1riuvc8oH56O+/CSPgS0xLyNibdbJ7sD30rR1+hDAvMDj/tqe9MyKUO7DuBHdI5ZVHPYcZuDsbI6qNYG6rY2ygPYEKXdBinwr9IsBwanAvMr5AlYSmDgfUVNnWOdfHyrKR9oH/nlIF/xupi3U2tLmK/CfFaNgTdgvi1WblwPdwvwFn36V2Fli+wD2G9WHp+G/NW52j6abour+w7wdL4GLmqDsN/2W47zoHY+J6jBpwH1CR6HZhp6F4/L6fGHY7n68fd36P5/</diagram></mxfile>
\ No newline at end of file
+<mxfile host="Electron" modified="2024-07-08T11:13:01.570Z" agent="5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) draw.io/20.6.2 Chrome/106.0.5249.199 Electron/21.3.3 Safari/537.36" etag="1DqoXVM6f3_kqLpATKRN" version="20.6.2" type="device"><diagram id="NT6XaUAKe-6zpoMFsSYq" name="RuleEngine">1VpLc+I4EP41VO0e4rIkP/AxkMzMYac2NWEnm70JW4AqxqJkMcD8+pWxbCzJBEIwIblEar3s7q+/7hbuoeF8/ZXjxew7S0jag26y7qG7HoQA+VD+KySbUuL3+6VgymmiJu0Ej/Q3UUJXSZc0Ibk2UTCWCrrQhTHLMhILTYY5Zyt92oSl+qkLPCWW4DHGqS19oomYlVKIULAb+EbodFYdHfheOTLH1Wz1KvkMJ2zVEKH7HhpyxkTZmq+HJC20VymmXPdlz2j9ZJxk4pgF3og/hzzA5Gnz9/PLqj/65+d/N2qXXzhdqjcefh/djtQTi02lh9WMCvK4wHHRX0lb99BgJuap7AHZxPmi1P6Erok8b2A/XHUS4YKsGyL1sF8JmxPBN3KKGoWhUpyCDvD9sr/aGQJUc2ZNG1RCrIw/rffeqUc2lIbeoC1oaQs4guMsnxD+h2A9OKxG/7Q0SLLktgCk7MUpznMa6yrkbJklhe7uXNmTauObf2XnxnVcACvJczHseCisBHfr5oK7TbP3QDiV7024Eu61icB8SsRhlJBEcxbbcg3L+C2GqWScpFjQX7qLtRlLnfDAqHziGhgA6sCAyLB3zpY8JmpV0yOMjWBgICwyNioVY220xU792qfDCVlwGrEXkhVakzwl7WZiSFLIomgu5+ltLJg07KDwJyr56i88JukDy6mgLJNTxkwINm9MuE3ptBgQzPBdthQpzciwZtBXsXK8//qGlSpKb4AEtYAk6Mp5PUvb5/JRV3dP/4Bz7tVtidvDfnjQX/2r8tcA6UhA7on+GkQGpEysdOyvgYUg6MgOTbAgIxUGbExJI2yd04iYyh1jCQLCW/x0TpOk2GPASU5/4/F2vwI+i+L1ti/sD3r+XSugXnUA04Pr7EkdouUnbZ7tOqgfIt0UZ0HKDQy1XW/6+g5sMslJJ6b1LdP+WKbkPptKZrRM+gHJkN+/umQo7IxPgc6n4cmE+skSG9PIsI9OJErP3OiyRNm3oCG4bEFXpiyyCMNpbjvV9fBkBewz8KQXeUBnNPA+pHTPhJFlO4SdRJYRsahi3A+SC07jbab5MSkUWVNRM4VsPzfkuyVF5/1Jl38sl7hXRSaBb0UMx238GRseSy1916AWeFlqqbRsRGopqa5ZdljUsXYgap8hSEeGbiK74qlr14uUPMC+sFDKAlenLOi2ZDSX1ZZdj3sXp77uUh14VfQUmtcD3olFYWgWhf6FCelt9woZy4pkJcH5bAsFoGOkkD9gIVOdbCuBLpJSiTn2Ul9AQxtLKhyqwNlxQARHR8TrglzkehpSUFVDvRVykZleB8ZGXUOuvVqVEpuUPprWkffhtN5WqAapPHYwlo1p0SDO1JFTngr1pDQvbM23Gi3nyXPrqZaGpWKErsbSXYcsLW5oK4+f0DQ1RMfXNm120y17BtMBFxzOX7wW03X3e4sdkf3LFyPwlGoEdES+R3Pvdd0Bh4EVpc9RjUTmT0Heq0VOx7wM7VTAGzt8B9AhS1ouPi5zSVbnCM0MQS3rIkmARwL1unEKgrNUzZHBrMD8yXIPMiUw8KYxTd1p7X18qzoPtW8CZKPc8bywtwOs3xnsm0h/brrBG2DfFTcfnRhfF+YtEg3Ows0W5UfQOS5P3o/6szO2fVONxl0RtuMCXydt4KEuWPttX38chrX7OWENPg2s95A5NGPRu8hcdncfm5XTd9/sofv/AQ==</diagram></mxfile>
\ No newline at end of file
diff --git a/doc/schema/rule/ruleWhitelistWrapper.drawio b/doc/schema/rule/ruleWhitelistWrapper.drawio
index 695db2b..70e72c6 100644
--- a/doc/schema/rule/ruleWhitelistWrapper.drawio
+++ b/doc/schema/rule/ruleWhitelistWrapper.drawio
@@ -1 +1 @@
-<mxfile host="Electron" modified="2024-06-10T15:08:23.006Z" agent="5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) draw.io/20.6.2 Chrome/106.0.5249.199 Electron/21.3.3 Safari/537.36" etag="ZhdH9EA9LXOtab_TQP2a" version="20.6.2" type="device"><diagram id="zM64sRnQbgzkaFHiXnTb" name="RuleWhitelistWrapper">7VrLcpswFP0als3whizj2Eln2k4zzSJJdwrIoKmMPEJ+5esrjMBIsmPsxpgk3STcowfo3MO90sWGcz1Z3lIwTX+QGGLDNuOl4QwN2w4vTf63AFYl4PthCSQUxSVkbYB79AIFKMYlMxTDXOrICMEMTWUwIlkGIyZhgFKykLuNCZbvOgUJ1ID7CGAdfUAxS0vUdhx/0/AVoiStbu17btkyAVVvsZQ8BTFZNCBnZDjXlBBWXk2W1xAX5FXElONudrTWT0ZhxtoMYDcvz7d+bOY2+j0fWZgFafrFLmeZAzwTK/41w3CUJSiD4rHZqiIjX6AJBrzBGSxSxOD9FERF04K7nmMpm2BuWfxyTDImnGmF3NafVTz+HFIGlw1IPPstJBPI6Ip3qaQkaBRCcipaFw23mAJLGx6pQSCkkNRTb8jiF4KvA7hzNO4eClYwytkDZ2QKad4vCl23dxy6uznkMOVa5P+sftEYWjKN4dlZ9DQWFzqLdr9Z7IEY/TY0Zv2m0XfPTmOg0ahRBrP4qsjO3IowyHMUyURRMstiWNzE5BZcIvYoWorrpwK/8IQ1XDa6DVeVkfGlPDaNxqjC3AxbW9W41i7KyYxGcH9qZYAmkO1PIzCWdiK6wxsO9bb4s8IoxIChubx/2eZjcYc7gjK20ZPjy3pyPUUm5brFqOZ2Q5nIVYTpqnoridEmWkuuXvbxKgy7UaF9nAzt7nTotNSh2ysdBmp6cI/UYaAI2r7sVoeX/6PhISr0+qVCRwliqnhaq1A5vriqnE+swuptOq0MrQ8iQr9XIvQ9ZYvnHCtCU57ICzsWoV5teCMRmlIsDF4Phm+np36lTH/X8f5QnWgTdZwyLb2yYgQDRrlh8xnNMcA5NIKhLh7uiO/gGWJZMwCjJCsExR0MKQeK4xWKAL4SDRMUx8UcAwpz9AKe1/MVUpkWS1wv2hsY3rCVeF6Xvnqwq0uX4q5Gszi47cBnXlhB6Mn++Tf5VF3IeJzD0zhUL/Oc48WvE5AlJ6CguwzktcxA/ToUhrayhz52M66msq4PhZZeKXv3kaV6tz5nZNFrdmeNLM1gUu+IO4ks/oeILK66JT12z+JZHUeWLVXP9x5Zqnfrc0aWwwqIGVl/AIhBnq5DiSW7s8DvAOOuzNaIbToczRklf+oPy/buWFSXd56a0WdfKOp5JOpXqScM9hyO20aiSyWkeepx/dSRaEvFMRj8/MYhQgu+uWLp+h2O9U/8n2MX3rYOZPdKoY63J8W1/jSj1IFc/60Uys3ND1rK7pufBTmjvw==</diagram></mxfile>
\ No newline at end of file
+<mxfile host="Electron" modified="2024-07-08T12:13:05.136Z" agent="5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) draw.io/20.6.2 Chrome/106.0.5249.199 Electron/21.3.3 Safari/537.36" etag="gq2LeAhVXaQx1WaH6jqn" version="20.6.2" type="device"><diagram id="zM64sRnQbgzkaFHiXnTb" name="RuleWhitelistWrapper">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</diagram></mxfile>
\ No newline at end of file
diff --git a/doc/schema/rule/ruleWhitelistWrapperV2.drawio.png b/doc/schema/rule/ruleWhitelistWrapperV2.drawio.png
new file mode 100644
index 0000000000000000000000000000000000000000..b8295c7c0fb8c8e7328778a40775d74b98341a5c
GIT binary patch
literal 111165
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
PgJ0?@+R9mqrhfkq0-bwP

literal 0
HcmV?d00001


From b220f6861cbadffe662a3b3875121b5673294ca9 Mon Sep 17 00:00:00 2001
From: Ryan Sauge <ryan.sauge@protonmail.com>
Date: Tue, 9 Jul 2024 17:58:32 +0200
Subject: [PATCH 2/2] Remove json files

---
 RuleEngineV2.0.2.json     | 1449 -------------------------------------
 RuleWhitelistWrapper.json |    1 -
 RuleWhitelistv2.0.2.json  | 1081 ---------------------------
 3 files changed, 2531 deletions(-)
 delete mode 100644 RuleEngineV2.0.2.json
 delete mode 100644 RuleWhitelistWrapper.json
 delete mode 100644 RuleWhitelistv2.0.2.json

diff --git a/RuleEngineV2.0.2.json b/RuleEngineV2.0.2.json
deleted file mode 100644
index aaf230e..0000000
--- a/RuleEngineV2.0.2.json
+++ /dev/null
@@ -1,1449 +0,0 @@
-{
-  "contractName": "RuleEngine",
-  "abi": [
-    {
-      "type": "constructor",
-      "inputs": [
-        { "name": "admin", "type": "address", "internalType": "address" },
-        {
-          "name": "forwarderIrrevocable",
-          "type": "address",
-          "internalType": "address"
-        },
-        {
-          "name": "tokenContract",
-          "type": "address",
-          "internalType": "address"
-        }
-      ],
-      "stateMutability": "nonpayable"
-    },
-    {
-      "type": "function",
-      "name": "DEFAULT_ADMIN_ROLE",
-      "inputs": [],
-      "outputs": [{ "name": "", "type": "bytes32", "internalType": "bytes32" }],
-      "stateMutability": "view"
-    },
-    {
-      "type": "function",
-      "name": "RULE_ENGINE_OPERATOR_ROLE",
-      "inputs": [],
-      "outputs": [{ "name": "", "type": "bytes32", "internalType": "bytes32" }],
-      "stateMutability": "view"
-    },
-    {
-      "type": "function",
-      "name": "TOKEN_CONTRACT_ROLE",
-      "inputs": [],
-      "outputs": [{ "name": "", "type": "bytes32", "internalType": "bytes32" }],
-      "stateMutability": "view"
-    },
-    {
-      "type": "function",
-      "name": "addRuleOperation",
-      "inputs": [
-        {
-          "name": "rule_",
-          "type": "address",
-          "internalType": "contract IRuleOperation"
-        }
-      ],
-      "outputs": [],
-      "stateMutability": "nonpayable"
-    },
-    {
-      "type": "function",
-      "name": "addRuleValidation",
-      "inputs": [
-        {
-          "name": "rule_",
-          "type": "address",
-          "internalType": "contract IRuleValidation"
-        }
-      ],
-      "outputs": [],
-      "stateMutability": "nonpayable"
-    },
-    {
-      "type": "function",
-      "name": "clearRulesOperation",
-      "inputs": [],
-      "outputs": [],
-      "stateMutability": "nonpayable"
-    },
-    {
-      "type": "function",
-      "name": "clearRulesValidation",
-      "inputs": [],
-      "outputs": [],
-      "stateMutability": "nonpayable"
-    },
-    {
-      "type": "function",
-      "name": "detectTransferRestriction",
-      "inputs": [
-        { "name": "_from", "type": "address", "internalType": "address" },
-        { "name": "_to", "type": "address", "internalType": "address" },
-        { "name": "_amount", "type": "uint256", "internalType": "uint256" }
-      ],
-      "outputs": [{ "name": "", "type": "uint8", "internalType": "uint8" }],
-      "stateMutability": "view"
-    },
-    {
-      "type": "function",
-      "name": "detectTransferRestrictionValidation",
-      "inputs": [
-        { "name": "_from", "type": "address", "internalType": "address" },
-        { "name": "_to", "type": "address", "internalType": "address" },
-        { "name": "_amount", "type": "uint256", "internalType": "uint256" }
-      ],
-      "outputs": [{ "name": "", "type": "uint8", "internalType": "uint8" }],
-      "stateMutability": "view"
-    },
-    {
-      "type": "function",
-      "name": "getRoleAdmin",
-      "inputs": [
-        { "name": "role", "type": "bytes32", "internalType": "bytes32" }
-      ],
-      "outputs": [{ "name": "", "type": "bytes32", "internalType": "bytes32" }],
-      "stateMutability": "view"
-    },
-    {
-      "type": "function",
-      "name": "getRuleIndexOperation",
-      "inputs": [
-        {
-          "name": "rule_",
-          "type": "address",
-          "internalType": "contract IRuleOperation"
-        }
-      ],
-      "outputs": [
-        { "name": "index", "type": "uint256", "internalType": "uint256" }
-      ],
-      "stateMutability": "view"
-    },
-    {
-      "type": "function",
-      "name": "getRuleIndexValidation",
-      "inputs": [
-        {
-          "name": "rule_",
-          "type": "address",
-          "internalType": "contract IRuleValidation"
-        }
-      ],
-      "outputs": [
-        { "name": "index", "type": "uint256", "internalType": "uint256" }
-      ],
-      "stateMutability": "view"
-    },
-    {
-      "type": "function",
-      "name": "grantRole",
-      "inputs": [
-        { "name": "role", "type": "bytes32", "internalType": "bytes32" },
-        { "name": "account", "type": "address", "internalType": "address" }
-      ],
-      "outputs": [],
-      "stateMutability": "nonpayable"
-    },
-    {
-      "type": "function",
-      "name": "hasRole",
-      "inputs": [
-        { "name": "role", "type": "bytes32", "internalType": "bytes32" },
-        { "name": "account", "type": "address", "internalType": "address" }
-      ],
-      "outputs": [{ "name": "", "type": "bool", "internalType": "bool" }],
-      "stateMutability": "view"
-    },
-    {
-      "type": "function",
-      "name": "isTrustedForwarder",
-      "inputs": [
-        { "name": "forwarder", "type": "address", "internalType": "address" }
-      ],
-      "outputs": [{ "name": "", "type": "bool", "internalType": "bool" }],
-      "stateMutability": "view"
-    },
-    {
-      "type": "function",
-      "name": "messageForTransferRestriction",
-      "inputs": [
-        { "name": "_restrictionCode", "type": "uint8", "internalType": "uint8" }
-      ],
-      "outputs": [{ "name": "", "type": "string", "internalType": "string" }],
-      "stateMutability": "view"
-    },
-    {
-      "type": "function",
-      "name": "operateOnTransfer",
-      "inputs": [
-        { "name": "from", "type": "address", "internalType": "address" },
-        { "name": "to", "type": "address", "internalType": "address" },
-        { "name": "amount", "type": "uint256", "internalType": "uint256" }
-      ],
-      "outputs": [
-        { "name": "isValid", "type": "bool", "internalType": "bool" }
-      ],
-      "stateMutability": "nonpayable"
-    },
-    {
-      "type": "function",
-      "name": "removeRuleOperation",
-      "inputs": [
-        {
-          "name": "rule_",
-          "type": "address",
-          "internalType": "contract IRuleOperation"
-        },
-        { "name": "index", "type": "uint256", "internalType": "uint256" }
-      ],
-      "outputs": [],
-      "stateMutability": "nonpayable"
-    },
-    {
-      "type": "function",
-      "name": "removeRuleValidation",
-      "inputs": [
-        {
-          "name": "rule_",
-          "type": "address",
-          "internalType": "contract IRuleValidation"
-        },
-        { "name": "index", "type": "uint256", "internalType": "uint256" }
-      ],
-      "outputs": [],
-      "stateMutability": "nonpayable"
-    },
-    {
-      "type": "function",
-      "name": "renounceRole",
-      "inputs": [
-        { "name": "role", "type": "bytes32", "internalType": "bytes32" },
-        {
-          "name": "callerConfirmation",
-          "type": "address",
-          "internalType": "address"
-        }
-      ],
-      "outputs": [],
-      "stateMutability": "nonpayable"
-    },
-    {
-      "type": "function",
-      "name": "revokeRole",
-      "inputs": [
-        { "name": "role", "type": "bytes32", "internalType": "bytes32" },
-        { "name": "account", "type": "address", "internalType": "address" }
-      ],
-      "outputs": [],
-      "stateMutability": "nonpayable"
-    },
-    {
-      "type": "function",
-      "name": "ruleOperation",
-      "inputs": [
-        { "name": "ruleId", "type": "uint256", "internalType": "uint256" }
-      ],
-      "outputs": [{ "name": "", "type": "address", "internalType": "address" }],
-      "stateMutability": "view"
-    },
-    {
-      "type": "function",
-      "name": "ruleValidation",
-      "inputs": [
-        { "name": "ruleId", "type": "uint256", "internalType": "uint256" }
-      ],
-      "outputs": [{ "name": "", "type": "address", "internalType": "address" }],
-      "stateMutability": "view"
-    },
-    {
-      "type": "function",
-      "name": "rulesCountOperation",
-      "inputs": [],
-      "outputs": [{ "name": "", "type": "uint256", "internalType": "uint256" }],
-      "stateMutability": "view"
-    },
-    {
-      "type": "function",
-      "name": "rulesCountValidation",
-      "inputs": [],
-      "outputs": [{ "name": "", "type": "uint256", "internalType": "uint256" }],
-      "stateMutability": "view"
-    },
-    {
-      "type": "function",
-      "name": "rulesOperation",
-      "inputs": [],
-      "outputs": [
-        { "name": "", "type": "address[]", "internalType": "address[]" }
-      ],
-      "stateMutability": "view"
-    },
-    {
-      "type": "function",
-      "name": "rulesValidation",
-      "inputs": [],
-      "outputs": [
-        { "name": "", "type": "address[]", "internalType": "address[]" }
-      ],
-      "stateMutability": "view"
-    },
-    {
-      "type": "function",
-      "name": "setRulesOperation",
-      "inputs": [
-        { "name": "rules_", "type": "address[]", "internalType": "address[]" }
-      ],
-      "outputs": [],
-      "stateMutability": "nonpayable"
-    },
-    {
-      "type": "function",
-      "name": "setRulesValidation",
-      "inputs": [
-        { "name": "rules_", "type": "address[]", "internalType": "address[]" }
-      ],
-      "outputs": [],
-      "stateMutability": "nonpayable"
-    },
-    {
-      "type": "function",
-      "name": "supportsInterface",
-      "inputs": [
-        { "name": "interfaceId", "type": "bytes4", "internalType": "bytes4" }
-      ],
-      "outputs": [{ "name": "", "type": "bool", "internalType": "bool" }],
-      "stateMutability": "view"
-    },
-    {
-      "type": "function",
-      "name": "trustedForwarder",
-      "inputs": [],
-      "outputs": [{ "name": "", "type": "address", "internalType": "address" }],
-      "stateMutability": "view"
-    },
-    {
-      "type": "function",
-      "name": "validateTransfer",
-      "inputs": [
-        { "name": "_from", "type": "address", "internalType": "address" },
-        { "name": "_to", "type": "address", "internalType": "address" },
-        { "name": "_amount", "type": "uint256", "internalType": "uint256" }
-      ],
-      "outputs": [{ "name": "", "type": "bool", "internalType": "bool" }],
-      "stateMutability": "view"
-    },
-    {
-      "type": "function",
-      "name": "validateTransferValidation",
-      "inputs": [
-        { "name": "_from", "type": "address", "internalType": "address" },
-        { "name": "_to", "type": "address", "internalType": "address" },
-        { "name": "_amount", "type": "uint256", "internalType": "uint256" }
-      ],
-      "outputs": [{ "name": "", "type": "bool", "internalType": "bool" }],
-      "stateMutability": "view"
-    },
-    {
-      "type": "event",
-      "name": "AddRule",
-      "inputs": [
-        {
-          "name": "rule",
-          "type": "address",
-          "indexed": true,
-          "internalType": "address"
-        }
-      ],
-      "anonymous": false
-    },
-    {
-      "type": "event",
-      "name": "ClearRules",
-      "inputs": [
-        {
-          "name": "rulesRemoved",
-          "type": "address[]",
-          "indexed": false,
-          "internalType": "address[]"
-        }
-      ],
-      "anonymous": false
-    },
-    {
-      "type": "event",
-      "name": "RemoveRule",
-      "inputs": [
-        {
-          "name": "rule",
-          "type": "address",
-          "indexed": true,
-          "internalType": "address"
-        }
-      ],
-      "anonymous": false
-    },
-    {
-      "type": "event",
-      "name": "RoleAdminChanged",
-      "inputs": [
-        {
-          "name": "role",
-          "type": "bytes32",
-          "indexed": true,
-          "internalType": "bytes32"
-        },
-        {
-          "name": "previousAdminRole",
-          "type": "bytes32",
-          "indexed": true,
-          "internalType": "bytes32"
-        },
-        {
-          "name": "newAdminRole",
-          "type": "bytes32",
-          "indexed": true,
-          "internalType": "bytes32"
-        }
-      ],
-      "anonymous": false
-    },
-    {
-      "type": "event",
-      "name": "RoleGranted",
-      "inputs": [
-        {
-          "name": "role",
-          "type": "bytes32",
-          "indexed": true,
-          "internalType": "bytes32"
-        },
-        {
-          "name": "account",
-          "type": "address",
-          "indexed": true,
-          "internalType": "address"
-        },
-        {
-          "name": "sender",
-          "type": "address",
-          "indexed": true,
-          "internalType": "address"
-        }
-      ],
-      "anonymous": false
-    },
-    {
-      "type": "event",
-      "name": "RoleRevoked",
-      "inputs": [
-        {
-          "name": "role",
-          "type": "bytes32",
-          "indexed": true,
-          "internalType": "bytes32"
-        },
-        {
-          "name": "account",
-          "type": "address",
-          "indexed": true,
-          "internalType": "address"
-        },
-        {
-          "name": "sender",
-          "type": "address",
-          "indexed": true,
-          "internalType": "address"
-        }
-      ],
-      "anonymous": false
-    },
-    { "type": "error", "name": "AccessControlBadConfirmation", "inputs": [] },
-    {
-      "type": "error",
-      "name": "AccessControlUnauthorizedAccount",
-      "inputs": [
-        { "name": "account", "type": "address", "internalType": "address" },
-        { "name": "neededRole", "type": "bytes32", "internalType": "bytes32" }
-      ]
-    },
-    {
-      "type": "error",
-      "name": "RuleEngine_AdminWithAddressZeroNotAllowed",
-      "inputs": []
-    },
-    { "type": "error", "name": "RuleEngine_ArrayIsEmpty", "inputs": [] },
-    {
-      "type": "error",
-      "name": "RuleEngine_RuleAddressZeroNotAllowed",
-      "inputs": []
-    },
-    { "type": "error", "name": "RuleEngine_RuleAlreadyExists", "inputs": [] },
-    { "type": "error", "name": "RuleEngine_RuleDoNotMatch", "inputs": [] },
-    { "type": "error", "name": "RuleEngine_TransferInvalid", "inputs": [] }
-  ],
-  "bytecode":"0x60a06040523480156200001157600080fd5b5060405162001db338038062001db3833981016040819052620000349162000246565b6001600160a01b0380831660805283166200006257604051630872273360e21b815260040160405180910390fd5b6001600160a01b03811615620000a0576200009e7fd32fd1ee5f4f111da6f27444787e5200ec57a8849509c00ef2998467052b32a382620000e4565b505b620000ad600084620000e4565b50620000da7fb3c151d85eb431da97012a1682e6ab41bddc7db1012e7c40bd326c24bf56f99984620000e4565b505050506200030f565b6000828152602081815260408083206001600160a01b038516845290915281205460ff166200018b576000838152602081815260408083206001600160a01b03861684529091529020805460ff191660011790556200014262000195565b6001600160a01b0316826001600160a01b0316847f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45060016200018f565b5060005b92915050565b6000620001a1620001a6565b905090565b6000366014620001b63362000202565b8015620001c35750808210155b15620001fa57600036620001d8838562000290565b620001e5928290620002b2565b620001f091620002de565b60601c9250505090565b339250505090565b60006200020e60805190565b6001600160a01b0316826001600160a01b0316149050919050565b80516001600160a01b03811681146200024157600080fd5b919050565b6000806000606084860312156200025c57600080fd5b620002678462000229565b9250620002776020850162000229565b9150620002876040850162000229565b90509250925092565b818103818111156200018f57634e487b7160e01b600052601160045260246000fd5b60008085851115620002c357600080fd5b83861115620002d157600080fd5b5050820193919092039150565b6001600160601b03198135818116916014851015620003075780818660140360031b1b83161692505b505092915050565b608051611a7a620003396000396000818161033d01528181610384015261137d0152611a7a6000f3fe608060405234801561001057600080fd5b50600436106101fa5760003560e01c80638a1b6c8e1161011a578063c6946a12116100ad578063ce29ed351161007c578063ce29ed3514610495578063d0e835f2146104a8578063d4ce1415146104bb578063d547741f146104ce578063eb2647e3146104e157600080fd5b8063c6946a1214610449578063ca1f6c4d1461045c578063ca3e16e71461046f578063cd1d4dc71461048257600080fd5b8063a39eda14116100e9578063a39eda1414610406578063c03888c21461041b578063c57086a11461042e578063c68a651a1461043657600080fd5b80638a1b6c8e146103db5780638a2021b1146103e357806391d14854146103eb578063a217fddf146103fe57600080fd5b806336568abe116101925780636728f545116101615780636728f5451461036d5780637da0a877146103825780637f4ab1dd146103a857806383304df0146103c857600080fd5b806336568abe146102dc578063397a7d3c146102ef5780634d53374e1461031a578063572b6c051461032d57600080fd5b806328aa67bc116101ce57806328aa67bc146102895780632f2ff15d146102ae578063323a4616146102c1578063334a29cc146102c957600080fd5b80621582f7146101ff57806301ffc9a7146102095780630fbbfb5514610231578063248a9ca314610266575b600080fd5b6102076104f4565b005b61021c6102173660046115bc565b610517565b60405190151581526020015b60405180910390f35b6102587fd32fd1ee5f4f111da6f27444787e5200ec57a8849509c00ef2998467052b32a381565b604051908152602001610228565b6102586102743660046115e6565b60009081526020819052604090206001015490565b61029c610297366004611614565b61054e565b60405160ff9091168152602001610228565b6102076102bc366004611655565b610626565b600354610258565b6102076102d7366004611685565b610651565b6102076102ea366004611655565b61068f565b6103026102fd3660046115e6565b6106d7565b6040516001600160a01b039091168152602001610228565b6102076103283660046116fa565b610707565b61021c61033b366004611726565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0390811691161490565b610258600080516020611a2583398151915281565b7f0000000000000000000000000000000000000000000000000000000000000000610302565b6103bb6103b6366004611752565b610729565b6040516102289190611793565b6102586103d6366004611726565b610960565b61020761096d565b600254610258565b61021c6103f9366004611655565b61098d565b610258600081565b61040e6109b6565b60405161022891906117c6565b61021c610429366004611614565b610a18565b61040e610a6f565b610207610444366004611726565b610acf565b61021c610457366004611614565b610b2a565b61020761046a366004611685565b610b44565b61030261047d3660046115e6565b610b82565b610207610490366004611726565b610b97565b6102076104a33660046116fa565b610bba565b6102586104b6366004611726565b610bdc565b61029c6104c9366004611614565b610be9565b6102076104dc366004611655565b610cde565b61021c6104ef366004611614565b610d03565b600080516020611a2583398151915261050c81610d11565b610514610d22565b50565b60006001600160e01b03198216637965db0b60e01b148061054857506301ffc9a760e01b6001600160e01b03198316145b92915050565b600254600090815b818110156106175760006002828154811061057357610573611813565b60009182526020909120015460405163d4ce141560e01b81526001600160a01b0389811660048301528881166024830152604482018890529091169063d4ce141590606401602060405180830381865afa1580156105d5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105f99190611829565b905060ff81161561060e57925061061f915050565b50600101610556565b5060005b9150505b9392505050565b60008281526020819052604090206001015461064181610d11565b61064b8383610db2565b50505050565b600080516020611a2583398151915261066981610d11565b6002541561067957610679610e45565b6106838383610eca565b61064b60028484611544565b610697611065565b6001600160a01b0316816001600160a01b0316146106c85760405163334bd91960e11b815260040160405180910390fd5b6106d28282611074565b505050565b6000600282815481106106ec576106ec611813565b6000918252602090912001546001600160a01b031692915050565b600080516020611a2583398151915261071f81610d11565b6106d283836110fd565b60025460609060005b81811015610869576002818154811061074d5761074d611813565b600091825260209091200154604051633e822efb60e11b815260ff861660048201526001600160a01b0390911690637d045df690602401602060405180830381865afa1580156107a1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107c59190611846565b1561086157600281815481106107dd576107dd611813565b600091825260209091200154604051637f4ab1dd60e01b815260ff861660048201526001600160a01b0390911690637f4ab1dd90602401600060405180830381865afa158015610831573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610859919081019061187e565b949350505050565b600101610732565b505060035460005b81811015610924576003818154811061088c5761088c611813565b600091825260209091200154604051633e822efb60e11b815260ff861660048201526001600160a01b0390911690637d045df690602401602060405180830381865afa1580156108e0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109049190611846565b1561091c57600381815481106107dd576107dd611813565b600101610871565b505060408051808201909152601881527f556e6b6e6f776e207265737472696374696f6e20636f64650000000000000000602082015292915050565b6000610548600283611141565b600080516020611a2583398151915261098581610d11565b610514610e45565b6000918252602082815260408084206001600160a01b0393909316845291905290205460ff1690565b60606003805480602002602001604051908101604052809291908181526020018280548015610a0e57602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116109f0575b5050505050905090565b60007fd32fd1ee5f4f111da6f27444787e5200ec57a8849509c00ef2998467052b32a3610a4481610d11565b610a4f858585610d03565b610a5c5760009150610a67565b61061b85858561119f565b509392505050565b60606002805480602002602001604051908101604052809291908181526020018280548015610a0e576020028201919060005260206000209081546001600160a01b031681526001909101906020018083116109f0575050505050905090565b600080516020611a25833981519152610ae781610d11565b610af2600383611274565b6040516001600160a01b038316907f60305ce6c9104acd0969d358f926bf391174340660aaf5e6215261fd6847bf4690600090a25050565b600080610b38858585610be9565b60ff1614949350505050565b600080516020611a25833981519152610b5c81610d11565b60035415610b6c57610b6c610d22565b610b768383610eca565b61064b60038484611544565b6000600382815481106106ec576106ec611813565b600080516020611a25833981519152610baf81610d11565b610af2600283611274565b600080516020611a25833981519152610bd281610d11565b6106d28383611320565b6000610548600383611141565b600080610bf785858561054e565b905060ff811615610c0957905061061f565b60035460005b81811015610cd157600060038281548110610c2c57610c2c611813565b60009182526020909120015460405163d4ce141560e01b81526001600160a01b038a811660048301528981166024830152604482018990529091169063d4ce141590606401602060405180830381865afa158015610c8e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cb29190611829565b905060ff811615610cc857935061061f92505050565b50600101610c0f565b5060009695505050505050565b600082815260208190526040902060010154610cf981610d11565b61064b8383611074565b600080610b3885858561054e565b61051481610d1d611065565b61132c565b6003546000905b8015610d7657600181039150610d6660038381548110610d4b57610d4b611813565b6000918252602090912001546001600160a01b031683611320565b610d6f81611941565b9050610d29565b507f93dd3e43e4773b52a627c0ce6a20183638a2d2a264cfc9b6b7da0cccc95ea4b26003604051610da79190611958565b60405180910390a150565b6000610dbe838361098d565b610e3d576000838152602081815260408083206001600160a01b03861684529091529020805460ff19166001179055610df5611065565b6001600160a01b0316826001600160a01b0316847f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a4506001610548565b506000610548565b6002546000905b8015610e9957600181039150610e8960028381548110610e6e57610e6e611813565b6000918252602090912001546001600160a01b0316836110fd565b610e9281611941565b9050610e4c565b507f93dd3e43e4773b52a627c0ce6a20183638a2d2a264cfc9b6b7da0cccc95ea4b26002604051610da79190611958565b6000819003610eec57604051630b9b3e5960e21b815260040160405180910390fd5b60005b818110156106d2576000838383818110610f0b57610f0b611813565b9050602002016020810190610f209190611726565b6001600160a01b031603610f47576040516350092f7560e11b815260040160405180910390fd5b60016000848484818110610f5d57610f5d611813565b9050602002016020810190610f729190611726565b6001600160a01b0316815260208101919091526040016000205460ff1615610fad5760405163860d015160e01b815260040160405180910390fd5b6001806000858585818110610fc457610fc4611813565b9050602002016020810190610fd99190611726565b6001600160a01b031681526020810191909152604001600020805460ff191691151591909117905582828281811061101357611013611813565b90506020020160208101906110289190611726565b6001600160a01b03167f60305ce6c9104acd0969d358f926bf391174340660aaf5e6215261fd6847bf4660405160405180910390a2600101610eef565b600061106f61136d565b905090565b6000611080838361098d565b15610e3d576000838152602081815260408083206001600160a01b03861684529091529020805460ff191690556110b5611065565b6001600160a01b0316826001600160a01b0316847ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a4506001610548565b611109600283836113e2565b6040516001600160a01b038316907f6d83315c9718799346b67584ec64301b1457e989c8e35a8e2982a7776c04bfc490600090a25050565b81546000905b8082101561119657826001600160a01b031684838154811061116b5761116b611813565b6000918252602090912001546001600160a01b03160361118b5750610548565b816001019150611147565b50509054919050565b600354600090815b81811015611268576000600382815481106111c4576111c4611813565b60009182526020909120015460405163601c446160e11b81526001600160a01b0389811660048301528881166024830152604482018890529091169063c03888c2906064016020604051808303816000875af1158015611228573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061124c9190611846565b90508061125f576000935050505061061f565b506001016111a7565b50600195945050505050565b6001600160a01b03811661129b576040516350092f7560e11b815260040160405180910390fd5b6001600160a01b03811660009081526001602052604090205460ff16156112d55760405163860d015160e01b815260040160405180910390fd5b8154600181810184556000938452602080852090920180546001600160a01b039094166001600160a01b0319909416841790559183528190526040909120805460ff19169091179055565b611109600383836113e2565b611336828261098d565b6113695760405163e2517d3f60e01b81526001600160a01b03821660048201526024810183905260440160405180910390fd5b5050565b6000366014336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161480156113aa5750808210155b156113da576000366113bc838561199c565b6113c79282906119af565b6113d0916119d9565b60601c9250505090565b339250505090565b816001600160a01b03168382815481106113fe576113fe611813565b6000918252602090912001546001600160a01b03161461143157604051632f64842d60e11b815260040160405180910390fd5b825461143f9060019061199c565b81146114c457825483906114559060019061199c565b8154811061146557611465611813565b9060005260206000200160009054906101000a90046001600160a01b031683828154811061149557611495611813565b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b031602179055505b828054806114d4576114d4611a0e565b60008281526020808220830160001990810180546001600160a01b03191690559092019092556001600160a01b03841680835260019091526040808320805460ff191690555190917f6d83315c9718799346b67584ec64301b1457e989c8e35a8e2982a7776c04bfc491a2505050565b828054828255906000526020600020908101928215611597579160200282015b828111156115975781546001600160a01b0319166001600160a01b03843516178255602090920191600190910190611564565b506115a39291506115a7565b5090565b5b808211156115a357600081556001016115a8565b6000602082840312156115ce57600080fd5b81356001600160e01b03198116811461061f57600080fd5b6000602082840312156115f857600080fd5b5035919050565b6001600160a01b038116811461051457600080fd5b60008060006060848603121561162957600080fd5b8335611634816115ff565b92506020840135611644816115ff565b929592945050506040919091013590565b6000806040838503121561166857600080fd5b82359150602083013561167a816115ff565b809150509250929050565b6000806020838503121561169857600080fd5b823567ffffffffffffffff808211156116b057600080fd5b818501915085601f8301126116c457600080fd5b8135818111156116d357600080fd5b8660208260051b85010111156116e857600080fd5b60209290920196919550909350505050565b6000806040838503121561170d57600080fd5b8235611718816115ff565b946020939093013593505050565b60006020828403121561173857600080fd5b813561061f816115ff565b60ff8116811461051457600080fd5b60006020828403121561176457600080fd5b813561061f81611743565b60005b8381101561178a578181015183820152602001611772565b50506000910152565b60208152600082518060208401526117b281604085016020870161176f565b601f01601f19169190910160400192915050565b6020808252825182820181905260009190848201906040850190845b818110156118075783516001600160a01b0316835292840192918401916001016117e2565b50909695505050505050565b634e487b7160e01b600052603260045260246000fd5b60006020828403121561183b57600080fd5b815161061f81611743565b60006020828403121561185857600080fd5b8151801515811461061f57600080fd5b634e487b7160e01b600052604160045260246000fd5b60006020828403121561189057600080fd5b815167ffffffffffffffff808211156118a857600080fd5b818401915084601f8301126118bc57600080fd5b8151818111156118ce576118ce611868565b604051601f8201601f19908116603f011681019083821181831017156118f6576118f6611868565b8160405282815287602084870101111561190f57600080fd5b61192083602083016020880161176f565b979650505050505050565b634e487b7160e01b600052601160045260246000fd5b6000816119505761195061192b565b506000190190565b6020808252825482820181905260008481528281209092916040850190845b818110156118075783546001600160a01b031683526001938401939285019201611977565b818103818111156105485761054861192b565b600080858511156119bf57600080fd5b838611156119cc57600080fd5b5050820193919092039150565b6bffffffffffffffffffffffff198135818116916014851015611a065780818660140360031b1b83161692505b505092915050565b634e487b7160e01b600052603160045260246000fdfeb3c151d85eb431da97012a1682e6ab41bddc7db1012e7c40bd326c24bf56f999a264697066735822122001e96293b791a1cb7a365e53c8a2381e86a2d2227bf7299377f4ae8437a930e364736f6c63430008160033",
-  "deployedBytecode": {
-    "object": "0x608060405234801561001057600080fd5b50600436106101fa5760003560e01c80638a1b6c8e1161011a578063c6946a12116100ad578063ce29ed351161007c578063ce29ed3514610495578063d0e835f2146104a8578063d4ce1415146104bb578063d547741f146104ce578063eb2647e3146104e157600080fd5b8063c6946a1214610449578063ca1f6c4d1461045c578063ca3e16e71461046f578063cd1d4dc71461048257600080fd5b8063a39eda14116100e9578063a39eda1414610406578063c03888c21461041b578063c57086a11461042e578063c68a651a1461043657600080fd5b80638a1b6c8e146103db5780638a2021b1146103e357806391d14854146103eb578063a217fddf146103fe57600080fd5b806336568abe116101925780636728f545116101615780636728f5451461036d5780637da0a877146103825780637f4ab1dd146103a857806383304df0146103c857600080fd5b806336568abe146102dc578063397a7d3c146102ef5780634d53374e1461031a578063572b6c051461032d57600080fd5b806328aa67bc116101ce57806328aa67bc146102895780632f2ff15d146102ae578063323a4616146102c1578063334a29cc146102c957600080fd5b80621582f7146101ff57806301ffc9a7146102095780630fbbfb5514610231578063248a9ca314610266575b600080fd5b6102076104f4565b005b61021c6102173660046115bc565b610517565b60405190151581526020015b60405180910390f35b6102587fd32fd1ee5f4f111da6f27444787e5200ec57a8849509c00ef2998467052b32a381565b604051908152602001610228565b6102586102743660046115e6565b60009081526020819052604090206001015490565b61029c610297366004611614565b61054e565b60405160ff9091168152602001610228565b6102076102bc366004611655565b610626565b600354610258565b6102076102d7366004611685565b610651565b6102076102ea366004611655565b61068f565b6103026102fd3660046115e6565b6106d7565b6040516001600160a01b039091168152602001610228565b6102076103283660046116fa565b610707565b61021c61033b366004611726565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0390811691161490565b610258600080516020611a2583398151915281565b7f0000000000000000000000000000000000000000000000000000000000000000610302565b6103bb6103b6366004611752565b610729565b6040516102289190611793565b6102586103d6366004611726565b610960565b61020761096d565b600254610258565b61021c6103f9366004611655565b61098d565b610258600081565b61040e6109b6565b60405161022891906117c6565b61021c610429366004611614565b610a18565b61040e610a6f565b610207610444366004611726565b610acf565b61021c610457366004611614565b610b2a565b61020761046a366004611685565b610b44565b61030261047d3660046115e6565b610b82565b610207610490366004611726565b610b97565b6102076104a33660046116fa565b610bba565b6102586104b6366004611726565b610bdc565b61029c6104c9366004611614565b610be9565b6102076104dc366004611655565b610cde565b61021c6104ef366004611614565b610d03565b600080516020611a2583398151915261050c81610d11565b610514610d22565b50565b60006001600160e01b03198216637965db0b60e01b148061054857506301ffc9a760e01b6001600160e01b03198316145b92915050565b600254600090815b818110156106175760006002828154811061057357610573611813565b60009182526020909120015460405163d4ce141560e01b81526001600160a01b0389811660048301528881166024830152604482018890529091169063d4ce141590606401602060405180830381865afa1580156105d5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105f99190611829565b905060ff81161561060e57925061061f915050565b50600101610556565b5060005b9150505b9392505050565b60008281526020819052604090206001015461064181610d11565b61064b8383610db2565b50505050565b600080516020611a2583398151915261066981610d11565b6002541561067957610679610e45565b6106838383610eca565b61064b60028484611544565b610697611065565b6001600160a01b0316816001600160a01b0316146106c85760405163334bd91960e11b815260040160405180910390fd5b6106d28282611074565b505050565b6000600282815481106106ec576106ec611813565b6000918252602090912001546001600160a01b031692915050565b600080516020611a2583398151915261071f81610d11565b6106d283836110fd565b60025460609060005b81811015610869576002818154811061074d5761074d611813565b600091825260209091200154604051633e822efb60e11b815260ff861660048201526001600160a01b0390911690637d045df690602401602060405180830381865afa1580156107a1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107c59190611846565b1561086157600281815481106107dd576107dd611813565b600091825260209091200154604051637f4ab1dd60e01b815260ff861660048201526001600160a01b0390911690637f4ab1dd90602401600060405180830381865afa158015610831573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610859919081019061187e565b949350505050565b600101610732565b505060035460005b81811015610924576003818154811061088c5761088c611813565b600091825260209091200154604051633e822efb60e11b815260ff861660048201526001600160a01b0390911690637d045df690602401602060405180830381865afa1580156108e0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109049190611846565b1561091c57600381815481106107dd576107dd611813565b600101610871565b505060408051808201909152601881527f556e6b6e6f776e207265737472696374696f6e20636f64650000000000000000602082015292915050565b6000610548600283611141565b600080516020611a2583398151915261098581610d11565b610514610e45565b6000918252602082815260408084206001600160a01b0393909316845291905290205460ff1690565b60606003805480602002602001604051908101604052809291908181526020018280548015610a0e57602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116109f0575b5050505050905090565b60007fd32fd1ee5f4f111da6f27444787e5200ec57a8849509c00ef2998467052b32a3610a4481610d11565b610a4f858585610d03565b610a5c5760009150610a67565b61061b85858561119f565b509392505050565b60606002805480602002602001604051908101604052809291908181526020018280548015610a0e576020028201919060005260206000209081546001600160a01b031681526001909101906020018083116109f0575050505050905090565b600080516020611a25833981519152610ae781610d11565b610af2600383611274565b6040516001600160a01b038316907f60305ce6c9104acd0969d358f926bf391174340660aaf5e6215261fd6847bf4690600090a25050565b600080610b38858585610be9565b60ff1614949350505050565b600080516020611a25833981519152610b5c81610d11565b60035415610b6c57610b6c610d22565b610b768383610eca565b61064b60038484611544565b6000600382815481106106ec576106ec611813565b600080516020611a25833981519152610baf81610d11565b610af2600283611274565b600080516020611a25833981519152610bd281610d11565b6106d28383611320565b6000610548600383611141565b600080610bf785858561054e565b905060ff811615610c0957905061061f565b60035460005b81811015610cd157600060038281548110610c2c57610c2c611813565b60009182526020909120015460405163d4ce141560e01b81526001600160a01b038a811660048301528981166024830152604482018990529091169063d4ce141590606401602060405180830381865afa158015610c8e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cb29190611829565b905060ff811615610cc857935061061f92505050565b50600101610c0f565b5060009695505050505050565b600082815260208190526040902060010154610cf981610d11565b61064b8383611074565b600080610b3885858561054e565b61051481610d1d611065565b61132c565b6003546000905b8015610d7657600181039150610d6660038381548110610d4b57610d4b611813565b6000918252602090912001546001600160a01b031683611320565b610d6f81611941565b9050610d29565b507f93dd3e43e4773b52a627c0ce6a20183638a2d2a264cfc9b6b7da0cccc95ea4b26003604051610da79190611958565b60405180910390a150565b6000610dbe838361098d565b610e3d576000838152602081815260408083206001600160a01b03861684529091529020805460ff19166001179055610df5611065565b6001600160a01b0316826001600160a01b0316847f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a4506001610548565b506000610548565b6002546000905b8015610e9957600181039150610e8960028381548110610e6e57610e6e611813565b6000918252602090912001546001600160a01b0316836110fd565b610e9281611941565b9050610e4c565b507f93dd3e43e4773b52a627c0ce6a20183638a2d2a264cfc9b6b7da0cccc95ea4b26002604051610da79190611958565b6000819003610eec57604051630b9b3e5960e21b815260040160405180910390fd5b60005b818110156106d2576000838383818110610f0b57610f0b611813565b9050602002016020810190610f209190611726565b6001600160a01b031603610f47576040516350092f7560e11b815260040160405180910390fd5b60016000848484818110610f5d57610f5d611813565b9050602002016020810190610f729190611726565b6001600160a01b0316815260208101919091526040016000205460ff1615610fad5760405163860d015160e01b815260040160405180910390fd5b6001806000858585818110610fc457610fc4611813565b9050602002016020810190610fd99190611726565b6001600160a01b031681526020810191909152604001600020805460ff191691151591909117905582828281811061101357611013611813565b90506020020160208101906110289190611726565b6001600160a01b03167f60305ce6c9104acd0969d358f926bf391174340660aaf5e6215261fd6847bf4660405160405180910390a2600101610eef565b600061106f61136d565b905090565b6000611080838361098d565b15610e3d576000838152602081815260408083206001600160a01b03861684529091529020805460ff191690556110b5611065565b6001600160a01b0316826001600160a01b0316847ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a4506001610548565b611109600283836113e2565b6040516001600160a01b038316907f6d83315c9718799346b67584ec64301b1457e989c8e35a8e2982a7776c04bfc490600090a25050565b81546000905b8082101561119657826001600160a01b031684838154811061116b5761116b611813565b6000918252602090912001546001600160a01b03160361118b5750610548565b816001019150611147565b50509054919050565b600354600090815b81811015611268576000600382815481106111c4576111c4611813565b60009182526020909120015460405163601c446160e11b81526001600160a01b0389811660048301528881166024830152604482018890529091169063c03888c2906064016020604051808303816000875af1158015611228573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061124c9190611846565b90508061125f576000935050505061061f565b506001016111a7565b50600195945050505050565b6001600160a01b03811661129b576040516350092f7560e11b815260040160405180910390fd5b6001600160a01b03811660009081526001602052604090205460ff16156112d55760405163860d015160e01b815260040160405180910390fd5b8154600181810184556000938452602080852090920180546001600160a01b039094166001600160a01b0319909416841790559183528190526040909120805460ff19169091179055565b611109600383836113e2565b611336828261098d565b6113695760405163e2517d3f60e01b81526001600160a01b03821660048201526024810183905260440160405180910390fd5b5050565b6000366014336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161480156113aa5750808210155b156113da576000366113bc838561199c565b6113c79282906119af565b6113d0916119d9565b60601c9250505090565b339250505090565b816001600160a01b03168382815481106113fe576113fe611813565b6000918252602090912001546001600160a01b03161461143157604051632f64842d60e11b815260040160405180910390fd5b825461143f9060019061199c565b81146114c457825483906114559060019061199c565b8154811061146557611465611813565b9060005260206000200160009054906101000a90046001600160a01b031683828154811061149557611495611813565b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b031602179055505b828054806114d4576114d4611a0e565b60008281526020808220830160001990810180546001600160a01b03191690559092019092556001600160a01b03841680835260019091526040808320805460ff191690555190917f6d83315c9718799346b67584ec64301b1457e989c8e35a8e2982a7776c04bfc491a2505050565b828054828255906000526020600020908101928215611597579160200282015b828111156115975781546001600160a01b0319166001600160a01b03843516178255602090920191600190910190611564565b506115a39291506115a7565b5090565b5b808211156115a357600081556001016115a8565b6000602082840312156115ce57600080fd5b81356001600160e01b03198116811461061f57600080fd5b6000602082840312156115f857600080fd5b5035919050565b6001600160a01b038116811461051457600080fd5b60008060006060848603121561162957600080fd5b8335611634816115ff565b92506020840135611644816115ff565b929592945050506040919091013590565b6000806040838503121561166857600080fd5b82359150602083013561167a816115ff565b809150509250929050565b6000806020838503121561169857600080fd5b823567ffffffffffffffff808211156116b057600080fd5b818501915085601f8301126116c457600080fd5b8135818111156116d357600080fd5b8660208260051b85010111156116e857600080fd5b60209290920196919550909350505050565b6000806040838503121561170d57600080fd5b8235611718816115ff565b946020939093013593505050565b60006020828403121561173857600080fd5b813561061f816115ff565b60ff8116811461051457600080fd5b60006020828403121561176457600080fd5b813561061f81611743565b60005b8381101561178a578181015183820152602001611772565b50506000910152565b60208152600082518060208401526117b281604085016020870161176f565b601f01601f19169190910160400192915050565b6020808252825182820181905260009190848201906040850190845b818110156118075783516001600160a01b0316835292840192918401916001016117e2565b50909695505050505050565b634e487b7160e01b600052603260045260246000fd5b60006020828403121561183b57600080fd5b815161061f81611743565b60006020828403121561185857600080fd5b8151801515811461061f57600080fd5b634e487b7160e01b600052604160045260246000fd5b60006020828403121561189057600080fd5b815167ffffffffffffffff808211156118a857600080fd5b818401915084601f8301126118bc57600080fd5b8151818111156118ce576118ce611868565b604051601f8201601f19908116603f011681019083821181831017156118f6576118f6611868565b8160405282815287602084870101111561190f57600080fd5b61192083602083016020880161176f565b979650505050505050565b634e487b7160e01b600052601160045260246000fd5b6000816119505761195061192b565b506000190190565b6020808252825482820181905260008481528281209092916040850190845b818110156118075783546001600160a01b031683526001938401939285019201611977565b818103818111156105485761054861192b565b600080858511156119bf57600080fd5b838611156119cc57600080fd5b5050820193919092039150565b6bffffffffffffffffffffffff198135818116916014851015611a065780818660140360031b1b83161692505b505092915050565b634e487b7160e01b600052603160045260246000fdfeb3c151d85eb431da97012a1682e6ab41bddc7db1012e7c40bd326c24bf56f999a264697066735822122001e96293b791a1cb7a365e53c8a2381e86a2d2227bf7299377f4ae8437a930e364736f6c63430008160033",
-    "sourceMap": "323:5144:84:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1001:113:91;;;:::i;:::-;;2565:202:62;;;;;;:::i;:::-;;:::i;:::-;;;470:14:139;;463:22;445:41;;433:2;418:18;2565:202:62;;;;;;;;802:86:90;;856:32;802:86;;;;;643:25:139;;;631:2;616:18;802:86:90;497:177:139;3810:120:62;;;;;;:::i;:::-;3875:7;3901:12;;;;;;;;;;:22;;;;3810:120;860:555:92;;;;;;:::i;:::-;;:::i;:::-;;;1633:4:139;1621:17;;;1603:36;;1591:2;1576:18;860:555:92;1461:184:139;4226:136:62;;;;;;:::i;:::-;;:::i;3255:118:91:-;3344:15;:22;3255:118;;797:280:93;;;;;;:::i;:::-;;:::i;5328:245:62:-;;;;;;:::i;:::-;;:::i;4051:143:93:-;;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;3121:32:139;;;3103:51;;3091:2;3076:18;4051:143:93;2957:203:139;2580:194:93;;;;;;:::i;:::-;;:::i;1830:137:66:-;;;;;;:::i;:::-;1705:17;-1:-1:-1;;;;;1929:31:66;;;;;;;1830:137;666:98:90;;-1:-1:-1;;;;;;;;;;;666:98:90;;1622:107:66;1705:17;1622:107;;2978:1092:84;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;3706:190:93:-;;;;;;:::i;:::-;;:::i;1163:115::-;;;:::i;3432:120::-;3522:16;:23;3432:120;;2854:136:62;;;;;;:::i;:::-;;:::i;2187:49::-;;2232:4;2187:49;;4097:151:91;;;:::i;:::-;;;;;;;:::i;4143:464:84:-;;;;;;:::i;:::-;;:::i;4282:153:93:-;;;:::i;1794:214:91:-;;;;;;:::i;:::-;;:::i;2502:272:84:-;;;;;;:::i;:::-;;:::i;648:267:91:-;;;;;;:::i;:::-;;:::i;3868:141::-;;;;;;:::i;:::-;;:::i;1963:217:93:-;;;;;;:::i;:::-;;:::i;2408:191:91:-;;;;;;:::i;:::-;;:::i;3526:187::-;;;;;;:::i;:::-;;:::i;1438:829:84:-;;;;;;:::i;:::-;;:::i;4642:138:62:-;;;;;;:::i;:::-;;:::i;1650:292:92:-;;;;;;:::i;:::-;;:::i;1001:113:91:-;-1:-1:-1;;;;;;;;;;;2464:16:62;2475:4;2464:10;:16::i;:::-;1085:22:91::1;:20;:22::i;:::-;1001:113:::0;:::o;2565:202:62:-;2650:4;-1:-1:-1;;;;;;2673:47:62;;-1:-1:-1;;;2673:47:62;;:87;;-1:-1:-1;;;;;;;;;;861:40:78;;;2724:36:62;2666:94;2565:202;-1:-1:-1;;2565:202:62:o;860:555:92:-;1049:16;:23;1010:5;;;1082:272;1106:11;1102:1;:15;1082:272;;;1138:17;1174:16;1191:1;1174:19;;;;;;;;:::i;:::-;;;;;;;;;;;1158:100;;-1:-1:-1;;;1158:100:92;;-1:-1:-1;;;;;6735:15:139;;;1158:100:92;;;6717:34:139;6787:15;;;6767:18;;;6760:43;6819:18;;;6812:34;;;1174:19:92;;;;1158:79;;6652:18:139;;1158:100:92;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;1138:120;-1:-1:-1;1276:15:92;;;;1272:72;;1318:11;-1:-1:-1;1311:18:92;;-1:-1:-1;;1311:18:92;1272:72;-1:-1:-1;1119:3:92;;1082:272;;;-1:-1:-1;1377:30:92;1371:37;1364:44;;;860:555;;;;;;:::o;4226:136:62:-;3875:7;3901:12;;;;;;;;;;:22;;;2464:16;2475:4;2464:10;:16::i;:::-;4330:25:::1;4341:4;4347:7;4330:10;:25::i;:::-;;4226:136:::0;;;:::o;797:280:93:-;-1:-1:-1;;;;;;;;;;;2464:16:62;2475:4;2464:10;:16::i;:::-;932::93::1;:23:::0;:27;928:81:::1;;975:23;:21;:23::i;:::-;1018:17;1028:6;;1018:9;:17::i;:::-;1045:25;:16;1064:6:::0;;1045:25:::1;:::i;5328:245:62:-:0;5443:12;:10;:12::i;:::-;-1:-1:-1;;;;;5421:34:62;:18;-1:-1:-1;;;;;5421:34:62;;5417:102;;5478:30;;-1:-1:-1;;;5478:30:62;;;;;;;;;;;5417:102;5529:37;5541:4;5547:18;5529:11;:37::i;:::-;;5328:245;;:::o;4051:143:93:-;4137:7;4163:16;4180:6;4163:24;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;4163:24:93;;4051:143;-1:-1:-1;;4051:143:93:o;2580:194::-;-1:-1:-1;;;;;;;;;;;2464:16:62;2475:4;2464:10;:16::i;:::-;2723:44:93::1;2753:5;2761;2723:21;:44::i;2978:1092:84:-:0;3156:16;:23;3087:13;;3134:19;3189:379;3213:11;3209:1;:15;3189:379;;;3282:16;3299:1;3282:19;;;;;;;;:::i;:::-;;;;;;;;;;;3266:108;;-1:-1:-1;;;3266:108:84;;1633:4:139;1621:17;;3266:108:84;;;1603:36:139;-1:-1:-1;;;;;3282:19:84;;;;3266:90;;1576:18:139;;3266:108:84;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;3245:313;;;3450:16;3467:1;3450:19;;;;;;;;:::i;:::-;;;;;;;;;;;3434:109;;-1:-1:-1;;;3434:109:84;;1633:4:139;1621:17;;3434:109:84;;;1603:36:139;-1:-1:-1;;;;;3450:19:84;;;;3434:91;;1576:18:139;;3434:109:84;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;3434:109:84;;;;;;;;;;;;:::i;:::-;3407:136;2978:1092;-1:-1:-1;;;;2978:1092:84:o;3245:313::-;3226:3;;3189:379;;;-1:-1:-1;;3612:15:84;:22;3649:9;3644:377;3668:11;3664:1;:15;3644:377;;;3737:15;3753:1;3737:18;;;;;;;;:::i;:::-;;;;;;;;;;;3721:107;;-1:-1:-1;;;3721:107:84;;1633:4:139;1621:17;;3721:107:84;;;1603:36:139;-1:-1:-1;;;;;3737:18:84;;;;3721:89;;1576:18:139;;3721:107:84;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;3700:311;;;3904:15;3920:1;3904:18;;;;;;;;:::i;3700:311::-;3681:3;;3644:377;;;-1:-1:-1;;4030:33:84;;;;;;;;;;;;;;;;;;2978:1092;-1:-1:-1;;2978:1092:84:o;3706:190:93:-;3798:13;3830:59;3856:16;3882:5;3830:25;:59::i;1163:115::-;-1:-1:-1;;;;;;;;;;;2464:16:62;2475:4;2464:10;:16::i;:::-;1248:23:93::1;:21;:23::i;2854:136:62:-:0;2931:4;2954:12;;;;;;;;;;;-1:-1:-1;;;;;2954:29:62;;;;;;;;;;;;;;;2854:136::o;4097:151:91:-;4187:16;4226:15;4219:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;4219:22:91;;;;;;;;;;;;;;;;;;;;;;;4097:151;:::o;4143:464:84:-;4299:12;856:32:90;2464:16:62;2475:4;2464:10;:16::i;:::-;4374:65:84::1;4422:4;4428:2;4432:6;4374:47;:65::i;:::-;4356:131;;4471:5;4464:12;;;;4356:131;4544:56;4583:4;4589:2;4593:6;4544:38;:56::i;2490:1:62:-;4143:464:84::0;;;;;;:::o;4282:153:93:-;4373:16;4412;4405:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;4405:23:93;;;;;;;;;;;;;;;;;;;;;;4282:153;:::o;1794:214:91:-;-1:-1:-1;;;;;;;;;;;2464:16:62;2475:4;2464:10;:16::i;:::-;1909:54:91::1;1931:15;1956:5;1909:21;:54::i;:::-;1978:23;::::0;-1:-1:-1;;;;;1978:23:91;::::1;::::0;::::1;::::0;;;::::1;1794:214:::0;;:::o;2502:272:84:-;2633:4;;2668:46;2694:5;2701:3;2706:7;2668:25;:46::i;:::-;:99;;;;2502:272;-1:-1:-1;;;;2502:272:84:o;648:267:91:-;-1:-1:-1;;;;;;;;;;;2464:16:62;2475:4;2464:10;:16::i;:::-;773:15:91::1;:22:::0;:26;769:79:::1;;815:22;:20;:22::i;:::-;857:17;867:6;;857:9;:17::i;:::-;884:24;:15;902:6:::0;;884:24:::1;:::i;3868:141::-:0;3953:7;3979:15;3995:6;3979:23;;;;;;;;:::i;1963:217:93:-;-1:-1:-1;;;;;;;;;;;2464:16:62;2475:4;2464:10;:16::i;:::-;2080:55:93::1;2102:16;2128:5;2080:21;:55::i;2408:191:91:-:0;-1:-1:-1;;;;;;;;;;;2464:16:62;2475:4;2464:10;:16::i;:::-;2549:43:91::1;2578:5;2586;2549:20;:43::i;3526:187::-:0;3616:13;3648:58;3674:15;3699:5;3648:25;:58::i;1438:829:84:-;1578:5;1617:10;1630:123;1700:5;1719:3;1736:7;1630:56;:123::i;:::-;1617:136;-1:-1:-1;1767:45:84;;;;1763:87;;1835:4;-1:-1:-1;1828:11:84;;1763:87;1903:15;:22;1881:19;1935:271;1959:11;1955:1;:15;1935:271;;;1991:17;2027:15;2043:1;2027:18;;;;;;;;:::i;:::-;;;;;;;;;;;2011:99;;-1:-1:-1;;;2011:99:84;;-1:-1:-1;;;;;6735:15:139;;;2011:99:84;;;6717:34:139;6787:15;;;6767:18;;;6760:43;6819:18;;;6812:34;;;2027:18:84;;;;2011:78;;6652:18:139;;2011:99:84;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;1991:119;-1:-1:-1;2128:15:84;;;;2124:72;;2170:11;-1:-1:-1;2163:18:84;;-1:-1:-1;;;2163:18:84;2124:72;-1:-1:-1;1972:3:84;;1935:271;;;-1:-1:-1;2229:30:84;2216:44;1438:829;-1:-1:-1;;;;;;1438:829:84:o;4642:138:62:-;3875:7;3901:12;;;;;;;;;;:22;;;2464:16;2475:4;2464:10;:16::i;:::-;4747:26:::1;4759:4;4765:7;4747:11;:26::i;1650:292:92:-:0;1791:4;;1826:56;1862:5;1869:3;1874:7;1826:35;:56::i;3199:103:62:-;3265:30;3276:4;3282:12;:10;:12::i;:::-;3265:10;:30::i;1200:439:91:-;1363:15;:22;1251:13;;1346:245;1387:5;;1346:245;;1500:1;1496;:5;1488:13;;1529:51;1550:15;1566:5;1550:22;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;1550:22:91;1574:5;1529:20;:51::i;:::-;1394:3;;;:::i;:::-;;;1346:245;;;;1605:27;1616:15;1605:27;;;;;;:::i;:::-;;;;;;;;1241:398;1200:439::o;6179:316:62:-;6256:4;6277:22;6285:4;6291:7;6277;:22::i;:::-;6272:217;;6315:6;:12;;;;;;;;;;;-1:-1:-1;;;;;6315:29:62;;;;;;;;;:36;;-1:-1:-1;;6315:36:62;6347:4;6315:36;;;6397:12;:10;:12::i;:::-;-1:-1:-1;;;;;6370:40:62;6388:7;-1:-1:-1;;;;;6370:40:62;6382:4;6370:40;;;;;;;;;;-1:-1:-1;6431:4:62;6424:11;;6272:217;-1:-1:-1;6473:5:62;6466:12;;1364:444:93;1528:16;:23;1416:13;;1511:248;1553:5;;1511:248;;1666:1;1662;:5;1654:13;;1695:53;1717:16;1734:5;1717:23;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;1717:23:93;1742:5;1695:21;:53::i;:::-;1560:3;;;:::i;:::-;;;1511:248;;;;1773:28;1784:16;1773:28;;;;;;:::i;596:600:94:-;682:1;665:18;;;661:81;;706:25;;-1:-1:-1;;;706:25:94;;;;;;;;;;;661:81;756:9;751:439;771:17;;;751:439;;;840:3;818:6;;825:1;818:9;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;810:34:94;;806:118;;871:38;;-1:-1:-1;;;871:38:94;;;;;;;;;;;806:118;941:14;:25;956:6;;963:1;956:9;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;941:25:94;;;;;;;;;;;;-1:-1:-1;941:25:94;;;;937:101;;;993:30;;-1:-1:-1;;;993:30:94;;;;;;;;;;;937:101;1079:4;1051:14;:25;1066:6;;1073:1;1066:9;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;1051:25:94;;;;;;;;;;;;-1:-1:-1;1051:25:94;:32;;-1:-1:-1;;1051:32:94;;;;;;;;;;1110:6;;1117:1;1110:9;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;1102:18:94;;;;;;;;;;;1162:3;;751:439;;4708:182:84;4819:14;4856:27;:25;:27::i;:::-;4849:34;;4708:182;:::o;6730:317:62:-;6808:4;6828:22;6836:4;6842:7;6828;:22::i;:::-;6824:217;;;6898:5;6866:12;;;;;;;;;;;-1:-1:-1;;;;;6866:29:62;;;;;;;;;:37;;-1:-1:-1;;6866:37:62;;;6949:12;:10;:12::i;:::-;-1:-1:-1;;;;;6922:40:62;6940:7;-1:-1:-1;;;;;6922:40:62;6934:4;6922:40;;;;;;;;;;-1:-1:-1;6983:4:62;6976:11;;3174:184:93;3254:56;3279:16;3297:5;3304;3254:24;:56::i;:::-;3325:26;;-1:-1:-1;;;;;3325:26:93;;;;;;;;3174:184;;:::o;2668:413:94:-;2823:13;;2776;;2846:199;2870:11;2862:5;:19;2846:199;;;2920:5;-1:-1:-1;;;;;2903:22:94;:6;2910:5;2903:13;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;2903:13:94;:22;2899:73;;2945:12;;;2899:73;3013:7;;;;;2846:199;;;-1:-1:-1;;3061:13:94;;;2668:413;-1:-1:-1;2668:413:94:o;4473:513:91:-;4640:15;:22;4594:12;;;4672:287;4696:11;4692:1;:15;4672:287;;;4728:11;4757:15;4773:1;4757:18;;;;;;;;:::i;:::-;;;;;;;;;;;4742:135;;-1:-1:-1;;;4742:135:91;;-1:-1:-1;;;;;6735:15:139;;;4742:135:91;;;6717:34:139;6787:15;;;6767:18;;;6760:43;6819:18;;;6812:34;;;4757:18:91;;;;4742:52;;6652:18:139;;4742:135:91;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;4728:149;;4896:6;4891:58;;4929:5;4922:12;;;;;;;4891:58;-1:-1:-1;4709:3:91;;4672:287;;;-1:-1:-1;4975:4:91;;4473:513;-1:-1:-1;;;;;4473:513:91:o;1351:354:94:-;-1:-1:-1;;;;;1433:30:94;;1429:106;;1486:38;;-1:-1:-1;;;1486:38:94;;;;;;;;;;;1429:106;-1:-1:-1;;;;;1548:21:94;;;;;;:14;:21;;;;;;;;1544:89;;;1592:30;;-1:-1:-1;;;1592:30:94;;;;;;;;;;;1544:89;1642:18;;;;;;;;-1:-1:-1;1642:18:94;;;;;;;;;;;;-1:-1:-1;;;;;1642:18:94;;;-1:-1:-1;;;;;;1642:18:94;;;;;;;1670:21;;;;;;;;;;:28;;-1:-1:-1;;1670:28:94;;;;;;1351:354::o;2999:182:91:-;3078:55;3103:15;3120:5;3127;3078:24;:55::i;3432:197:62:-;3520:22;3528:4;3534:7;3520;:22::i;:::-;3515:108;;3565:47;;-1:-1:-1;;;3565:47:62;;-1:-1:-1;;;;;9708:32:139;;3565:47:62;;;9690:51:139;9757:18;;;9750:34;;;9663:18;;3565:47:62;;;;;;;3515:108;3432:197;;:::o;2204:429:66:-;2266:7;2310:8;3481:2;2420:10;-1:-1:-1;;;;;1705:17:66;1929:31;;2401:71;;;;;2453:19;2435:14;:37;;2401:71;2397:230;;;2511:8;;2520:36;2537:19;2520:14;:36;:::i;:::-;2511:47;;;;;:::i;:::-;2503:56;;;:::i;:::-;2495:65;;2488:72;;;;2204:429;:::o;2397:230::-;735:10:73;2591:25:66;;;;2204:429;:::o;2105:419:94:-;2252:5;-1:-1:-1;;;;;2235:22:94;:6;2242:5;2235:13;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;2235:13:94;:22;2231:87;;2280:27;;-1:-1:-1;;;2280:27:94;;;;;;;;;;;2231:87;2340:13;;:17;;2356:1;;2340:17;:::i;:::-;2331:5;:26;2327:98;;2396:13;;2389:6;;2396:17;;2412:1;;2396:17;:::i;:::-;2389:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;2389:25:94;2373:6;2380:5;2373:13;;;;;;;;:::i;:::-;;;;;;;;;:41;;;;;-1:-1:-1;;;;;2373:41:94;;;;;-1:-1:-1;;;;;2373:41:94;;;;;;2327:98;2434:6;:12;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;2434:12:94;;;;;-1:-1:-1;;;;;;2434:12:94;;;;;;;;;-1:-1:-1;;;;;2456:21:94;;;;;2434:12;2456:21;;;;;;;:29;;-1:-1:-1;;2456:29:94;;;2500:17;2456:21;;2500:17;;;2105:419;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:286:139;72:6;125:2;113:9;104:7;100:23;96:32;93:52;;;141:1;138;131:12;93:52;167:23;;-1:-1:-1;;;;;;219:32:139;;209:43;;199:71;;266:1;263;256:12;679:180;738:6;791:2;779:9;770:7;766:23;762:32;759:52;;;807:1;804;797:12;759:52;-1:-1:-1;830:23:139;;679:180;-1:-1:-1;679:180:139:o;864:131::-;-1:-1:-1;;;;;939:31:139;;929:42;;919:70;;985:1;982;975:12;1000:456;1077:6;1085;1093;1146:2;1134:9;1125:7;1121:23;1117:32;1114:52;;;1162:1;1159;1152:12;1114:52;1201:9;1188:23;1220:31;1245:5;1220:31;:::i;:::-;1270:5;-1:-1:-1;1327:2:139;1312:18;;1299:32;1340:33;1299:32;1340:33;:::i;:::-;1000:456;;1392:7;;-1:-1:-1;;;1446:2:139;1431:18;;;;1418:32;;1000:456::o;1650:315::-;1718:6;1726;1779:2;1767:9;1758:7;1754:23;1750:32;1747:52;;;1795:1;1792;1785:12;1747:52;1831:9;1818:23;1808:33;;1891:2;1880:9;1876:18;1863:32;1904:31;1929:5;1904:31;:::i;:::-;1954:5;1944:15;;;1650:315;;;;;:::o;2152:615::-;2238:6;2246;2299:2;2287:9;2278:7;2274:23;2270:32;2267:52;;;2315:1;2312;2305:12;2267:52;2355:9;2342:23;2384:18;2425:2;2417:6;2414:14;2411:34;;;2441:1;2438;2431:12;2411:34;2479:6;2468:9;2464:22;2454:32;;2524:7;2517:4;2513:2;2509:13;2505:27;2495:55;;2546:1;2543;2536:12;2495:55;2586:2;2573:16;2612:2;2604:6;2601:14;2598:34;;;2628:1;2625;2618:12;2598:34;2681:7;2676:2;2666:6;2663:1;2659:14;2655:2;2651:23;2647:32;2644:45;2641:65;;;2702:1;2699;2692:12;2641:65;2733:2;2725:11;;;;;2755:6;;-1:-1:-1;2152:615:139;;-1:-1:-1;;;;2152:615:139:o;3165:340::-;3258:6;3266;3319:2;3307:9;3298:7;3294:23;3290:32;3287:52;;;3335:1;3332;3325:12;3287:52;3374:9;3361:23;3393:31;3418:5;3393:31;:::i;:::-;3443:5;3495:2;3480:18;;;;3467:32;;-1:-1:-1;;;3165:340:139:o;3510:247::-;3569:6;3622:2;3610:9;3601:7;3597:23;3593:32;3590:52;;;3638:1;3635;3628:12;3590:52;3677:9;3664:23;3696:31;3721:5;3696:31;:::i;3762:114::-;3846:4;3839:5;3835:16;3828:5;3825:27;3815:55;;3866:1;3863;3856:12;3881:243;3938:6;3991:2;3979:9;3970:7;3966:23;3962:32;3959:52;;;4007:1;4004;3997:12;3959:52;4046:9;4033:23;4065:29;4088:5;4065:29;:::i;4129:250::-;4214:1;4224:113;4238:6;4235:1;4232:13;4224:113;;;4314:11;;;4308:18;4295:11;;;4288:39;4260:2;4253:10;4224:113;;;-1:-1:-1;;4371:1:139;4353:16;;4346:27;4129:250::o;4384:396::-;4533:2;4522:9;4515:21;4496:4;4565:6;4559:13;4608:6;4603:2;4592:9;4588:18;4581:34;4624:79;4696:6;4691:2;4680:9;4676:18;4671:2;4663:6;4659:15;4624:79;:::i;:::-;4764:2;4743:15;-1:-1:-1;;4739:29:139;4724:45;;;;4771:2;4720:54;;4384:396;-1:-1:-1;;4384:396:139:o;5062:658::-;5233:2;5285:21;;;5355:13;;5258:18;;;5377:22;;;5204:4;;5233:2;5456:15;;;;5430:2;5415:18;;;5204:4;5499:195;5513:6;5510:1;5507:13;5499:195;;;5578:13;;-1:-1:-1;;;;;5574:39:139;5562:52;;5669:15;;;;5634:12;;;;5610:1;5528:9;5499:195;;;-1:-1:-1;5711:3:139;;5062:658;-1:-1:-1;;;;;;5062:658:139:o;6345:127::-;6406:10;6401:3;6397:20;6394:1;6387:31;6437:4;6434:1;6427:15;6461:4;6458:1;6451:15;6857:247;6925:6;6978:2;6966:9;6957:7;6953:23;6949:32;6946:52;;;6994:1;6991;6984:12;6946:52;7026:9;7020:16;7045:29;7068:5;7045:29;:::i;7241:277::-;7308:6;7361:2;7349:9;7340:7;7336:23;7332:32;7329:52;;;7377:1;7374;7367:12;7329:52;7409:9;7403:16;7462:5;7455:13;7448:21;7441:5;7438:32;7428:60;;7484:1;7481;7474:12;7523:127;7584:10;7579:3;7575:20;7572:1;7565:31;7615:4;7612:1;7605:15;7639:4;7636:1;7629:15;7655:897;7735:6;7788:2;7776:9;7767:7;7763:23;7759:32;7756:52;;;7804:1;7801;7794:12;7756:52;7837:9;7831:16;7866:18;7907:2;7899:6;7896:14;7893:34;;;7923:1;7920;7913:12;7893:34;7961:6;7950:9;7946:22;7936:32;;8006:7;7999:4;7995:2;7991:13;7987:27;7977:55;;8028:1;8025;8018:12;7977:55;8057:2;8051:9;8079:2;8075;8072:10;8069:36;;;8085:18;;:::i;:::-;8160:2;8154:9;8128:2;8214:13;;-1:-1:-1;;8210:22:139;;;8234:2;8206:31;8202:40;8190:53;;;8258:18;;;8278:22;;;8255:46;8252:72;;;8304:18;;:::i;:::-;8344:10;8340:2;8333:22;8379:2;8371:6;8364:18;8419:7;8414:2;8409;8405;8401:11;8397:20;8394:33;8391:53;;;8440:1;8437;8430:12;8391:53;8453:68;8518:2;8513;8505:6;8501:15;8496:2;8492;8488:11;8453:68;:::i;:::-;8540:6;7655:897;-1:-1:-1;;;;;;;7655:897:139:o;8557:127::-;8618:10;8613:3;8609:20;8606:1;8599:31;8649:4;8646:1;8639:15;8673:4;8670:1;8663:15;8689:136;8728:3;8756:5;8746:39;;8765:18;;:::i;:::-;-1:-1:-1;;;8801:18:139;;8689:136::o;8830:681::-;8998:2;9050:21;;;9120:13;;9023:18;;;9142:22;;;8969:4;9207:17;;;9247:16;;;8969:4;;8998:2;9195;9180:18;;;8969:4;9291:194;9305:6;9302:1;9299:13;9291:194;;;9370:13;;-1:-1:-1;;;;;9366:39:139;9354:52;;9402:1;9461:14;;;;9426:12;;;;9320:9;9291:194;;9795:128;9862:9;;;9883:11;;;9880:37;;;9897:18;;:::i;9928:331::-;10033:9;10044;10086:8;10074:10;10071:24;10068:44;;;10108:1;10105;10098:12;10068:44;10137:6;10127:8;10124:20;10121:40;;;10157:1;10154;10147:12;10121:40;-1:-1:-1;;10183:23:139;;;10228:25;;;;;-1:-1:-1;9928:331:139:o;10264:337::-;-1:-1:-1;;10385:19:139;;10472:11;;;;10503:2;10495:11;;10492:103;;;10582:2;10576;10569:3;10565:2;10561:12;10558:1;10554:20;10550:29;10546:2;10542:38;10538:47;10529:56;;10492:103;;;10264:337;;;;:::o;10606:127::-;10667:10;10662:3;10658:20;10655:1;10648:31;10698:4;10695:1;10688:15;10722:4;10719:1;10712:15",
-    "linkReferences": {},
-    "immutableReferences": {
-      "54247": [
-        { "start": 829, "length": 32 },
-        { "start": 900, "length": 32 },
-        { "start": 4989, "length": 32 }
-      ]
-    }
-  },
-  "methodIdentifiers": {
-    "DEFAULT_ADMIN_ROLE()": "a217fddf",
-    "RULE_ENGINE_OPERATOR_ROLE()": "6728f545",
-    "TOKEN_CONTRACT_ROLE()": "0fbbfb55",
-    "addRuleOperation(address)": "c68a651a",
-    "addRuleValidation(address)": "cd1d4dc7",
-    "clearRulesOperation()": "001582f7",
-    "clearRulesValidation()": "8a1b6c8e",
-    "detectTransferRestriction(address,address,uint256)": "d4ce1415",
-    "detectTransferRestrictionValidation(address,address,uint256)": "28aa67bc",
-    "getRoleAdmin(bytes32)": "248a9ca3",
-    "getRuleIndexOperation(address)": "d0e835f2",
-    "getRuleIndexValidation(address)": "83304df0",
-    "grantRole(bytes32,address)": "2f2ff15d",
-    "hasRole(bytes32,address)": "91d14854",
-    "isTrustedForwarder(address)": "572b6c05",
-    "messageForTransferRestriction(uint8)": "7f4ab1dd",
-    "operateOnTransfer(address,address,uint256)": "c03888c2",
-    "removeRuleOperation(address,uint256)": "ce29ed35",
-    "removeRuleValidation(address,uint256)": "4d53374e",
-    "renounceRole(bytes32,address)": "36568abe",
-    "revokeRole(bytes32,address)": "d547741f",
-    "ruleOperation(uint256)": "ca3e16e7",
-    "ruleValidation(uint256)": "397a7d3c",
-    "rulesCountOperation()": "323a4616",
-    "rulesCountValidation()": "8a2021b1",
-    "rulesOperation()": "a39eda14",
-    "rulesValidation()": "c57086a1",
-    "setRulesOperation(address[])": "ca1f6c4d",
-    "setRulesValidation(address[])": "334a29cc",
-    "supportsInterface(bytes4)": "01ffc9a7",
-    "trustedForwarder()": "7da0a877",
-    "validateTransfer(address,address,uint256)": "c6946a12",
-    "validateTransferValidation(address,address,uint256)": "eb2647e3"
-  },
-  "rawMetadata": "{\"compiler\":{\"version\":\"0.8.22+commit.4fc1097e\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"admin\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"forwarderIrrevocable\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"tokenContract\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"AccessControlBadConfirmation\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"bytes32\",\"name\":\"neededRole\",\"type\":\"bytes32\"}],\"name\":\"AccessControlUnauthorizedAccount\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"RuleEngine_AdminWithAddressZeroNotAllowed\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"RuleEngine_ArrayIsEmpty\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"RuleEngine_RuleAddressZeroNotAllowed\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"RuleEngine_RuleAlreadyExists\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"RuleEngine_RuleDoNotMatch\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"RuleEngine_TransferInvalid\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"rule\",\"type\":\"address\"}],\"name\":\"AddRule\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address[]\",\"name\":\"rulesRemoved\",\"type\":\"address[]\"}],\"name\":\"ClearRules\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"rule\",\"type\":\"address\"}],\"name\":\"RemoveRule\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"previousAdminRole\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"newAdminRole\",\"type\":\"bytes32\"}],\"name\":\"RoleAdminChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"RoleGranted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"RoleRevoked\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"DEFAULT_ADMIN_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"RULE_ENGINE_OPERATOR_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"TOKEN_CONTRACT_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract IRuleOperation\",\"name\":\"rule_\",\"type\":\"address\"}],\"name\":\"addRuleOperation\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract IRuleValidation\",\"name\":\"rule_\",\"type\":\"address\"}],\"name\":\"addRuleValidation\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"clearRulesOperation\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"clearRulesValidation\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_amount\",\"type\":\"uint256\"}],\"name\":\"detectTransferRestriction\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_amount\",\"type\":\"uint256\"}],\"name\":\"detectTransferRestrictionValidation\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"}],\"name\":\"getRoleAdmin\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract IRuleOperation\",\"name\":\"rule_\",\"type\":\"address\"}],\"name\":\"getRuleIndexOperation\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract IRuleValidation\",\"name\":\"rule_\",\"type\":\"address\"}],\"name\":\"getRuleIndexValidation\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"grantRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"hasRole\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"forwarder\",\"type\":\"address\"}],\"name\":\"isTrustedForwarder\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint8\",\"name\":\"_restrictionCode\",\"type\":\"uint8\"}],\"name\":\"messageForTransferRestriction\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"operateOnTransfer\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"isValid\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract IRuleOperation\",\"name\":\"rule_\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"}],\"name\":\"removeRuleOperation\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract IRuleValidation\",\"name\":\"rule_\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"}],\"name\":\"removeRuleValidation\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"callerConfirmation\",\"type\":\"address\"}],\"name\":\"renounceRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"revokeRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"ruleId\",\"type\":\"uint256\"}],\"name\":\"ruleOperation\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"ruleId\",\"type\":\"uint256\"}],\"name\":\"ruleValidation\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"rulesCountOperation\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"rulesCountValidation\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"rulesOperation\",\"outputs\":[{\"internalType\":\"address[]\",\"name\":\"\",\"type\":\"address[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"rulesValidation\",\"outputs\":[{\"internalType\":\"address[]\",\"name\":\"\",\"type\":\"address[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"rules_\",\"type\":\"address[]\"}],\"name\":\"setRulesOperation\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"rules_\",\"type\":\"address[]\"}],\"name\":\"setRulesValidation\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"supportsInterface\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"trustedForwarder\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_amount\",\"type\":\"uint256\"}],\"name\":\"validateTransfer\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_amount\",\"type\":\"uint256\"}],\"name\":\"validateTransferValidation\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"errors\":{\"AccessControlBadConfirmation()\":[{\"details\":\"The caller of a function is not the expected one. NOTE: Don't confuse with {AccessControlUnauthorizedAccount}.\"}],\"AccessControlUnauthorizedAccount(address,bytes32)\":[{\"details\":\"The `account` is missing a role.\"}]},\"events\":{\"RoleAdminChanged(bytes32,bytes32,bytes32)\":{\"details\":\"Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite {RoleAdminChanged} not being emitted signaling this.\"},\"RoleGranted(bytes32,address,address)\":{\"details\":\"Emitted when `account` is granted `role`. `sender` is the account that originated the contract call, an admin role bearer except when using {AccessControl-_setupRole}.\"},\"RoleRevoked(bytes32,address,address)\":{\"details\":\"Emitted when `account` is revoked `role`. `sender` is the account that originated the contract call:   - if using `revokeRole`, it is the admin role bearer   - if using `renounceRole`, it is the role bearer (i.e. `account`)\"}},\"kind\":\"dev\",\"methods\":{\"constructor\":{\"params\":{\"admin\":\"Address of the contract (Access Control)\",\"forwarderIrrevocable\":\"Address of the forwarder, required for the gasless support\"}},\"detectTransferRestriction(address,address,uint256)\":{\"params\":{\"_amount\":\"to transfer\",\"_from\":\"the origin address\",\"_to\":\"the destination address\"},\"returns\":{\"_0\":\"The restricion code or REJECTED_CODE_BASE.TRANSFER_OK*\"}},\"detectTransferRestrictionValidation(address,address,uint256)\":{\"params\":{\"_amount\":\"to transfer\",\"_from\":\"the origin address\",\"_to\":\"the destination address\"},\"returns\":{\"_0\":\"The restricion code or REJECTED_CODE_BASE.TRANSFER_OK*\"}},\"getRoleAdmin(bytes32)\":{\"details\":\"Returns the admin role that controls `role`. See {grantRole} and {revokeRole}. To change a role's admin, use {_setRoleAdmin}.\"},\"getRuleIndexOperation(address)\":{\"returns\":{\"index\":\"if the rule is found, _rulesOperation.length otherwise\"}},\"getRuleIndexValidation(address)\":{\"returns\":{\"index\":\"if the rule is found, _rulesValidation.length otherwise\"}},\"grantRole(bytes32,address)\":{\"details\":\"Grants `role` to `account`. If `account` had not been already granted `role`, emits a {RoleGranted} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleGranted} event.\"},\"hasRole(bytes32,address)\":{\"details\":\"Returns `true` if `account` has been granted `role`.\"},\"isTrustedForwarder(address)\":{\"details\":\"Indicates whether any particular address is the trusted forwarder.\"},\"messageForTransferRestriction(uint8)\":{\"params\":{\"_restrictionCode\":\"The target restriction code\"},\"returns\":{\"_0\":\"True if the transfer is valid, false otherwise*\"}},\"removeRuleOperation(address,uint256)\":{\"details\":\"To reduce the array size, the last rule is moved to the location occupied by the rule to remove\",\"params\":{\"index\":\"the position inside the array of rule\",\"rule_\":\"address of the target rule\"}},\"removeRuleValidation(address,uint256)\":{\"details\":\"To reduce the array size, the last rule is moved to the location occupied by the rule to remove\",\"params\":{\"index\":\"the position inside the array of rule\",\"rule_\":\"address of the target rule\"}},\"renounceRole(bytes32,address)\":{\"details\":\"Revokes `role` from the calling account. Roles are often managed via {grantRole} and {revokeRole}: this function's purpose is to provide a mechanism for accounts to lose their privileges if they are compromised (such as when a trusted device is misplaced). If the calling account had been revoked `role`, emits a {RoleRevoked} event. Requirements: - the caller must be `callerConfirmation`. May emit a {RoleRevoked} event.\"},\"revokeRole(bytes32,address)\":{\"details\":\"Revokes `role` from `account`. If `account` had been granted `role`, emits a {RoleRevoked} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleRevoked} event.\"},\"ruleOperation(uint256)\":{\"params\":{\"ruleId\":\"index of the rule\"},\"returns\":{\"_0\":\"a rule address\"}},\"ruleValidation(uint256)\":{\"params\":{\"ruleId\":\"index of the rule\"},\"returns\":{\"_0\":\"a rule address\"}},\"rulesCountOperation()\":{\"returns\":{\"_0\":\"The number of rules inside the array\"}},\"rulesCountValidation()\":{\"returns\":{\"_0\":\"The number of rules inside the array\"}},\"rulesOperation()\":{\"returns\":{\"_0\":\"An array of rules\"}},\"rulesValidation()\":{\"returns\":{\"_0\":\"An array of rules\"}},\"setRulesValidation(address[])\":{\"details\":\"take address[] instead of IRuleEngineValidation[] since it is not possible to cast IRuleEngineValidation[] -> address[]\"},\"supportsInterface(bytes4)\":{\"details\":\"See {IERC165-supportsInterface}.\"},\"trustedForwarder()\":{\"details\":\"Returns the address of the trusted forwarder.\"},\"validateTransfer(address,address,uint256)\":{\"params\":{\"_amount\":\"to transfer\",\"_from\":\"the origin address\",\"_to\":\"the destination address\"},\"returns\":{\"_0\":\"True if the transfer is valid, false otherwise*\"}},\"validateTransferValidation(address,address,uint256)\":{\"params\":{\"_amount\":\"to transfer\",\"_from\":\"the origin address\",\"_to\":\"the destination address\"},\"returns\":{\"_0\":\"True if the transfer is valid, false otherwise*\"}}},\"title\":\"Implementation of a ruleEngine as defined by the CMTAT\",\"version\":1},\"userdoc\":{\"events\":{\"AddRule(address)\":{\"notice\":\"Generate when a rule is added\"},\"ClearRules(address[])\":{\"notice\":\"Generate when all the rules are cleared\"},\"RemoveRule(address)\":{\"notice\":\"Generate when a rule is removed\"}},\"kind\":\"user\",\"methods\":{\"RULE_ENGINE_OPERATOR_ROLE()\":{\"notice\":\"Role to manage the ruleEngine\"},\"TOKEN_CONTRACT_ROLE()\":{\"notice\":\"token contract\"},\"addRuleOperation(address)\":{\"notice\":\"Add a rule to the array of rules Revert if one rule is a zero address or if the rule is already present\"},\"addRuleValidation(address)\":{\"notice\":\"Add a rule to the array of rules Revert if one rule is a zero address or if the rule is already present\"},\"clearRulesOperation()\":{\"notice\":\"Clear all the rules of the array of rules\"},\"clearRulesValidation()\":{\"notice\":\"Clear all the rules of the array of rules\"},\"detectTransferRestriction(address,address,uint256)\":{\"notice\":\"Go through all the rule to know if a restriction exists on the transfer\"},\"detectTransferRestrictionValidation(address,address,uint256)\":{\"notice\":\"Go through all the rule to know if a restriction exists on the transfer\"},\"getRuleIndexOperation(address)\":{\"notice\":\"Get the index of a rule inside the list\"},\"getRuleIndexValidation(address)\":{\"notice\":\"Get the index of a rule inside the list\"},\"messageForTransferRestriction(uint8)\":{\"notice\":\"Return the message corresponding to the code\"},\"removeRuleOperation(address,uint256)\":{\"notice\":\"Remove a rule from the array of rules Revert if the rule found at the specified index does not match the rule in argument\"},\"removeRuleValidation(address,uint256)\":{\"notice\":\"Remove a rule from the array of rules Revert if the rule found at the specified index does not match the rule in argument\"},\"ruleOperation(uint256)\":{\"notice\":\"Get the rule at the position specified by ruleId\"},\"ruleValidation(uint256)\":{\"notice\":\"Get the rule at the position specified by ruleId\"},\"rulesOperation()\":{\"notice\":\"Get all the rules\"},\"rulesValidation()\":{\"notice\":\"Get all the rules\"},\"setRulesOperation(address[])\":{\"notice\":\"Set all the rules, will overwrite all the previous rules. \\\\n Revert if one rule is a zero address or if the rule is already present\"},\"setRulesValidation(address[])\":{\"notice\":\"Set all the rules, will overwrite all the previous rules. \\\\n Revert if one rule is a zero address or if the rule is already present\"},\"validateTransfer(address,address,uint256)\":{\"notice\":\"Validate a transfer\"},\"validateTransferValidation(address,address,uint256)\":{\"notice\":\"Validate a transfer\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"src/RuleEngine.sol\":\"RuleEngine\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[\":@openzeppelin/contracts/=lib/openzeppelin-contracts/contracts/\",\":CMTAT/=lib/CMTAT/contracts/\",\":OZ/=lib/openzeppelin-contracts/contracts/\",\":ds-test/=lib/openzeppelin-contracts/lib/forge-std/lib/ds-test/src/\",\":erc4626-tests/=lib/openzeppelin-contracts/lib/erc4626-tests/\",\":forge-std/=lib/forge-std/src/\",\":openzeppelin-contracts/=lib/openzeppelin-contracts/\"]},\"sources\":{\"lib/CMTAT/contracts/interfaces/draft-IERC1404/draft-IERC1404.sol\":{\"keccak256\":\"0xfba123f04b693467a10bffcc3d30c8ee0a55a159d1a50a9e6ad7efa6a08ad9ad\",\"license\":\"MPL-2.0\",\"urls\":[\"bzz-raw://f0af9bead272c5af8153932efe6e464485aa27c82a2a5c79ed94e780ec373da0\",\"dweb:/ipfs/QmZJj9B5sBDGY8b5qbFkadmQ377xugKwGoxkHPWW3BpnWg\"]},\"lib/CMTAT/contracts/interfaces/draft-IERC1404/draft-IERC1404EnumCode.sol\":{\"keccak256\":\"0x5162820d851ed01a9ce5e0b28b58b4dfa6262d010e0f112ca1dd1867b37600ed\",\"license\":\"MPL-2.0\",\"urls\":[\"bzz-raw://599cbb744369ec114f918eec3f462d0f2f0a33bab292683be34098bf98b31423\",\"dweb:/ipfs/QmTSYGzsUDicQ5jCu88r2XnRqFyS5nJqfPGiz4q3aL35mx\"]},\"lib/CMTAT/contracts/interfaces/draft-IERC1404/draft-IERC1404Wrapper.sol\":{\"keccak256\":\"0xefa53aa4e697f2fd338b56888c9492392100a146ccd7a2c107cbd189f5c99ea3\",\"license\":\"MPL-2.0\",\"urls\":[\"bzz-raw://a7a5933297a01300d5eb8baa49cce9c98c5f3779e329f4ac41dae6e128bdf68e\",\"dweb:/ipfs/QmcDMxLHuuc7n8dVw6PWtQaRrkqMrtQUoBt4XKeNHF69mF\"]},\"lib/CMTAT/contracts/interfaces/engine/IRuleEngine.sol\":{\"keccak256\":\"0x5db0b6db44e76f6b52541fdd68f5d534c035777c00df4f65e66a500e46d1049f\",\"license\":\"MPL-2.0\",\"urls\":[\"bzz-raw://a03b82a1cfcda98db1a52a0e6fb1a22cf4545604e59167a7c23439ef463b9607\",\"dweb:/ipfs/QmPwqKgMSBmURhgmvXi2hMxM7FTLTtEsZMn6mXRjpbqxSc\"]},\"lib/openzeppelin-contracts/contracts/access/AccessControl.sol\":{\"keccak256\":\"0xa0e92d42942f4f57c5be50568dac11e9d00c93efcb458026e18d2d9b9b2e7308\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://46326c0bb1e296b67185e81c918e0b40501b8b6386165855df0a3f3c634b6a80\",\"dweb:/ipfs/QmTwyrDYtsxsk6pymJTK94PnEpzsmkpUxFuzEiakDopy4Z\"]},\"lib/openzeppelin-contracts/contracts/access/IAccessControl.sol\":{\"keccak256\":\"0xb6b36edd6a2999fd243ff226d6cbf84bd71af2432bbd0dfe19392996a1d9cb41\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://1fd2f35495652e57e3f99bc6c510bc5f7dd398a176ea2e72d8ed730aebc6ca26\",\"dweb:/ipfs/QmTQV6X4gkikTib49cho5iDX3JvSQbdsoEChoDwrk3CbbH\"]},\"lib/openzeppelin-contracts/contracts/metatx/ERC2771Context.sol\":{\"keccak256\":\"0x98256cf37b71a69b2f5a8a6fe975ea03590dff703102bd141a830f94e8adebf6\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://6251fe1f6a1e45e6d619d150c123afc88b8646b38ee26a136efa9a6988a31d3f\",\"dweb:/ipfs/QmeXDT85wSZdP31wkz3ah3KhponCiksJLP5o2LR5e1JxcK\"]},\"lib/openzeppelin-contracts/contracts/utils/Context.sol\":{\"keccak256\":\"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://6a708e8a5bdb1011c2c381c9a5cfd8a9a956d7d0a9dc1bd8bcdaf52f76ef2f12\",\"dweb:/ipfs/Qmax9WHBnVsZP46ZxEMNRQpLQnrdE4dK8LehML1Py8FowF\"]},\"lib/openzeppelin-contracts/contracts/utils/introspection/ERC165.sol\":{\"keccak256\":\"0x9e8778b14317ba9e256c30a76fd6c32b960af621987f56069e1e819c77c6a133\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://1777404f1dcd0fac188e55a288724ec3c67b45288e49cc64723e95e702b49ab8\",\"dweb:/ipfs/QmZFdC626GButBApwDUvvTnUzdinevC3B24d7yyh57XkiA\"]},\"lib/openzeppelin-contracts/contracts/utils/introspection/IERC165.sol\":{\"keccak256\":\"0x4296879f55019b23e135000eb36896057e7101fb7fb859c5ef690cf14643757b\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://87b3541437c8c443ccd36795e56a338ed12855eec17f8da624511b8d1a7e14df\",\"dweb:/ipfs/QmeJQCtZrQjtJLr6u7ZHWeH3pBnjtLWzvRrKViAi7UZqxL\"]},\"src/RuleEngine.sol\":{\"keccak256\":\"0x108df8613195e2df8429038ed65bdc4cf930bda8fa86ca2b13311ad5383727f5\",\"license\":\"MPL-2.0\",\"urls\":[\"bzz-raw://f81ea56c32b2c8e92d80cd3ed0cad80b5f2a3fac35f54532ce1dcd2b436a5f9b\",\"dweb:/ipfs/QmW6GdVvEfyn47o9GkcpybmP8PYDfT6fvTFHAU1syMkdya\"]},\"src/interfaces/IRuleEngineOperation.sol\":{\"keccak256\":\"0x21f2fe8b4408853f65d5b9540426d93286c6be1a6e7424a243034453bb961809\",\"license\":\"MPL-2.0\",\"urls\":[\"bzz-raw://3c0fc26eb256d6e6a1e85a07ed83b50a16cf0a519abf8d405388505e21dd6b91\",\"dweb:/ipfs/Qmamkpa5fBptqAa2kXZLAqKXJY4NMdFWw8ozwob9o8Ze76\"]},\"src/interfaces/IRuleEngineValidation.sol\":{\"keccak256\":\"0x19f9b71580dddb20a29570bff88f711abf0c8aec18bd563643764aa37355eac1\",\"license\":\"MPL-2.0\",\"urls\":[\"bzz-raw://4a48e1abaa9d740c88bb33958b2227b1d98723a357fe35a6cc3a2843b00cdc20\",\"dweb:/ipfs/QmVaEQQhH522tKEJLizmFDuTeAyxb8bZP7byHpfNxwSmyT\"]},\"src/interfaces/IRuleOperation.sol\":{\"keccak256\":\"0x4960e62d6678d66d36d611f2e6819fbdeeed748c2d638965bf631b88c3beefb6\",\"license\":\"MPL-2.0\",\"urls\":[\"bzz-raw://b5509fccac80d4ab115d73281b22cc3877a7295ed39d901aba8fd73ce9275fce\",\"dweb:/ipfs/QmZQHqPtv2K7Bv4no5gnqmpWX92Gq7ENTD7vvZNvj5bUZE\"]},\"src/interfaces/IRuleValidation.sol\":{\"keccak256\":\"0x6b23f8d7355937f0d304ceb498f661b004d1969f87782af7588a960273af38a1\",\"license\":\"MPL-2.0\",\"urls\":[\"bzz-raw://b9c92ca4ce23304474c8236dd37c60f2c98627ca2a6156eb2ce0767436f40fa9\",\"dweb:/ipfs/QmZMkCu57MjUXjN5TtkhDGgM9RzGQpTX3uD79P1M9Vn2G8\"]},\"src/modules/MetaTxModuleStandalone.sol\":{\"keccak256\":\"0x32423330fbd140fb87b7f3c9f004db3eb7256f0f8c15b76be26ff14ba81edba0\",\"license\":\"MPL-2.0\",\"urls\":[\"bzz-raw://af6e6cfd9ccb587283b8379965a76143a27aaa38115191db1bbb1a5632eb4a25\",\"dweb:/ipfs/QmTdaEc78NfG9wJRYErsCZajvNF8ozLaqEfNyzi7Fu1fMj\"]},\"src/modules/RuleEngineInvariantStorage.sol\":{\"keccak256\":\"0x09093b1b80c8fd27ef80aaec46522ec5525aebcdb0fe77231821197d6fe7a1a0\",\"license\":\"MPL-2.0\",\"urls\":[\"bzz-raw://4939364678439e43818b1efb114b662219629b5945ecd98b1e39eca64d46dc44\",\"dweb:/ipfs/QmSikHEsDZy8hzyQ33N3AhiM25S7pCFEmqADZxK53FpCDq\"]},\"src/modules/RuleEngineOperation.sol\":{\"keccak256\":\"0xb8c4fa96bc94d612ee39003f13092611b2ecaaf668d566636026a20fab957e7a\",\"license\":\"MPL-2.0\",\"urls\":[\"bzz-raw://4249be172c68926880eb32292b9f4c917eb1b9e6ca14845b71757dd5c219b5bd\",\"dweb:/ipfs/QmQYNUiQGSANNtUTmMg2H7PiN68mEvKJzgWin9QdZzgNrs\"]},\"src/modules/RuleEngineValidation.sol\":{\"keccak256\":\"0x9922d5d720fb23684e32a17ea6a99d40b7f516b6c2078eb94ebe7efdc5ead367\",\"license\":\"MPL-2.0\",\"urls\":[\"bzz-raw://0982786aeb0ce4e2a04a99cf306f67ce0d20f1a11c81070f070429d76117d26a\",\"dweb:/ipfs/QmPfmFe5D5eWiMFj1VKWfDhomMmqiUgmpGC4LaqLfTKR9w\"]},\"src/modules/RuleEngineValidationCommon.sol\":{\"keccak256\":\"0xf1d0fdd62ba10b81918a6749e1fcf9f020b298a8179a1cf6c849fe0aaa5edddb\",\"license\":\"MPL-2.0\",\"urls\":[\"bzz-raw://57ae96630675750b371656a3e9ce3a5b1e2ce16327d3e292b934def1b85c8a1d\",\"dweb:/ipfs/QmZm9obyXiMCJzLPNCvvtN9QogngmRnkZJmBke2bc79Jgk\"]},\"src/modules/RuleInternal.sol\":{\"keccak256\":\"0xa6d2f8844062b318c31cb97570b840ac2faa50111564c97b7190bcadcab4419c\",\"license\":\"MPL-2.0\",\"urls\":[\"bzz-raw://878b4ba012b1c46973bb50018973a90ea6b700706a2ae52b0bae7d240df510b3\",\"dweb:/ipfs/QmdRjwxgoo4xc3JmyAirRbbLupKVZ51r67e1D93bTFSF6A\"]}},\"version\":1}",
-  "metadata": {
-    "compiler": { "version": "0.8.22+commit.4fc1097e" },
-    "language": "Solidity",
-    "output": {
-      "abi": [
-        {
-          "inputs": [
-            { "internalType": "address", "name": "admin", "type": "address" },
-            {
-              "internalType": "address",
-              "name": "forwarderIrrevocable",
-              "type": "address"
-            },
-            {
-              "internalType": "address",
-              "name": "tokenContract",
-              "type": "address"
-            }
-          ],
-          "stateMutability": "nonpayable",
-          "type": "constructor"
-        },
-        {
-          "inputs": [],
-          "type": "error",
-          "name": "AccessControlBadConfirmation"
-        },
-        {
-          "inputs": [
-            { "internalType": "address", "name": "account", "type": "address" },
-            {
-              "internalType": "bytes32",
-              "name": "neededRole",
-              "type": "bytes32"
-            }
-          ],
-          "type": "error",
-          "name": "AccessControlUnauthorizedAccount"
-        },
-        {
-          "inputs": [],
-          "type": "error",
-          "name": "RuleEngine_AdminWithAddressZeroNotAllowed"
-        },
-        { "inputs": [], "type": "error", "name": "RuleEngine_ArrayIsEmpty" },
-        {
-          "inputs": [],
-          "type": "error",
-          "name": "RuleEngine_RuleAddressZeroNotAllowed"
-        },
-        {
-          "inputs": [],
-          "type": "error",
-          "name": "RuleEngine_RuleAlreadyExists"
-        },
-        { "inputs": [], "type": "error", "name": "RuleEngine_RuleDoNotMatch" },
-        { "inputs": [], "type": "error", "name": "RuleEngine_TransferInvalid" },
-        {
-          "inputs": [
-            {
-              "internalType": "address",
-              "name": "rule",
-              "type": "address",
-              "indexed": true
-            }
-          ],
-          "type": "event",
-          "name": "AddRule",
-          "anonymous": false
-        },
-        {
-          "inputs": [
-            {
-              "internalType": "address[]",
-              "name": "rulesRemoved",
-              "type": "address[]",
-              "indexed": false
-            }
-          ],
-          "type": "event",
-          "name": "ClearRules",
-          "anonymous": false
-        },
-        {
-          "inputs": [
-            {
-              "internalType": "address",
-              "name": "rule",
-              "type": "address",
-              "indexed": true
-            }
-          ],
-          "type": "event",
-          "name": "RemoveRule",
-          "anonymous": false
-        },
-        {
-          "inputs": [
-            {
-              "internalType": "bytes32",
-              "name": "role",
-              "type": "bytes32",
-              "indexed": true
-            },
-            {
-              "internalType": "bytes32",
-              "name": "previousAdminRole",
-              "type": "bytes32",
-              "indexed": true
-            },
-            {
-              "internalType": "bytes32",
-              "name": "newAdminRole",
-              "type": "bytes32",
-              "indexed": true
-            }
-          ],
-          "type": "event",
-          "name": "RoleAdminChanged",
-          "anonymous": false
-        },
-        {
-          "inputs": [
-            {
-              "internalType": "bytes32",
-              "name": "role",
-              "type": "bytes32",
-              "indexed": true
-            },
-            {
-              "internalType": "address",
-              "name": "account",
-              "type": "address",
-              "indexed": true
-            },
-            {
-              "internalType": "address",
-              "name": "sender",
-              "type": "address",
-              "indexed": true
-            }
-          ],
-          "type": "event",
-          "name": "RoleGranted",
-          "anonymous": false
-        },
-        {
-          "inputs": [
-            {
-              "internalType": "bytes32",
-              "name": "role",
-              "type": "bytes32",
-              "indexed": true
-            },
-            {
-              "internalType": "address",
-              "name": "account",
-              "type": "address",
-              "indexed": true
-            },
-            {
-              "internalType": "address",
-              "name": "sender",
-              "type": "address",
-              "indexed": true
-            }
-          ],
-          "type": "event",
-          "name": "RoleRevoked",
-          "anonymous": false
-        },
-        {
-          "inputs": [],
-          "stateMutability": "view",
-          "type": "function",
-          "name": "DEFAULT_ADMIN_ROLE",
-          "outputs": [
-            { "internalType": "bytes32", "name": "", "type": "bytes32" }
-          ]
-        },
-        {
-          "inputs": [],
-          "stateMutability": "view",
-          "type": "function",
-          "name": "RULE_ENGINE_OPERATOR_ROLE",
-          "outputs": [
-            { "internalType": "bytes32", "name": "", "type": "bytes32" }
-          ]
-        },
-        {
-          "inputs": [],
-          "stateMutability": "view",
-          "type": "function",
-          "name": "TOKEN_CONTRACT_ROLE",
-          "outputs": [
-            { "internalType": "bytes32", "name": "", "type": "bytes32" }
-          ]
-        },
-        {
-          "inputs": [
-            {
-              "internalType": "contract IRuleOperation",
-              "name": "rule_",
-              "type": "address"
-            }
-          ],
-          "stateMutability": "nonpayable",
-          "type": "function",
-          "name": "addRuleOperation"
-        },
-        {
-          "inputs": [
-            {
-              "internalType": "contract IRuleValidation",
-              "name": "rule_",
-              "type": "address"
-            }
-          ],
-          "stateMutability": "nonpayable",
-          "type": "function",
-          "name": "addRuleValidation"
-        },
-        {
-          "inputs": [],
-          "stateMutability": "nonpayable",
-          "type": "function",
-          "name": "clearRulesOperation"
-        },
-        {
-          "inputs": [],
-          "stateMutability": "nonpayable",
-          "type": "function",
-          "name": "clearRulesValidation"
-        },
-        {
-          "inputs": [
-            { "internalType": "address", "name": "_from", "type": "address" },
-            { "internalType": "address", "name": "_to", "type": "address" },
-            { "internalType": "uint256", "name": "_amount", "type": "uint256" }
-          ],
-          "stateMutability": "view",
-          "type": "function",
-          "name": "detectTransferRestriction",
-          "outputs": [{ "internalType": "uint8", "name": "", "type": "uint8" }]
-        },
-        {
-          "inputs": [
-            { "internalType": "address", "name": "_from", "type": "address" },
-            { "internalType": "address", "name": "_to", "type": "address" },
-            { "internalType": "uint256", "name": "_amount", "type": "uint256" }
-          ],
-          "stateMutability": "view",
-          "type": "function",
-          "name": "detectTransferRestrictionValidation",
-          "outputs": [{ "internalType": "uint8", "name": "", "type": "uint8" }]
-        },
-        {
-          "inputs": [
-            { "internalType": "bytes32", "name": "role", "type": "bytes32" }
-          ],
-          "stateMutability": "view",
-          "type": "function",
-          "name": "getRoleAdmin",
-          "outputs": [
-            { "internalType": "bytes32", "name": "", "type": "bytes32" }
-          ]
-        },
-        {
-          "inputs": [
-            {
-              "internalType": "contract IRuleOperation",
-              "name": "rule_",
-              "type": "address"
-            }
-          ],
-          "stateMutability": "view",
-          "type": "function",
-          "name": "getRuleIndexOperation",
-          "outputs": [
-            { "internalType": "uint256", "name": "index", "type": "uint256" }
-          ]
-        },
-        {
-          "inputs": [
-            {
-              "internalType": "contract IRuleValidation",
-              "name": "rule_",
-              "type": "address"
-            }
-          ],
-          "stateMutability": "view",
-          "type": "function",
-          "name": "getRuleIndexValidation",
-          "outputs": [
-            { "internalType": "uint256", "name": "index", "type": "uint256" }
-          ]
-        },
-        {
-          "inputs": [
-            { "internalType": "bytes32", "name": "role", "type": "bytes32" },
-            { "internalType": "address", "name": "account", "type": "address" }
-          ],
-          "stateMutability": "nonpayable",
-          "type": "function",
-          "name": "grantRole"
-        },
-        {
-          "inputs": [
-            { "internalType": "bytes32", "name": "role", "type": "bytes32" },
-            { "internalType": "address", "name": "account", "type": "address" }
-          ],
-          "stateMutability": "view",
-          "type": "function",
-          "name": "hasRole",
-          "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }]
-        },
-        {
-          "inputs": [
-            {
-              "internalType": "address",
-              "name": "forwarder",
-              "type": "address"
-            }
-          ],
-          "stateMutability": "view",
-          "type": "function",
-          "name": "isTrustedForwarder",
-          "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }]
-        },
-        {
-          "inputs": [
-            {
-              "internalType": "uint8",
-              "name": "_restrictionCode",
-              "type": "uint8"
-            }
-          ],
-          "stateMutability": "view",
-          "type": "function",
-          "name": "messageForTransferRestriction",
-          "outputs": [
-            { "internalType": "string", "name": "", "type": "string" }
-          ]
-        },
-        {
-          "inputs": [
-            { "internalType": "address", "name": "from", "type": "address" },
-            { "internalType": "address", "name": "to", "type": "address" },
-            { "internalType": "uint256", "name": "amount", "type": "uint256" }
-          ],
-          "stateMutability": "nonpayable",
-          "type": "function",
-          "name": "operateOnTransfer",
-          "outputs": [
-            { "internalType": "bool", "name": "isValid", "type": "bool" }
-          ]
-        },
-        {
-          "inputs": [
-            {
-              "internalType": "contract IRuleOperation",
-              "name": "rule_",
-              "type": "address"
-            },
-            { "internalType": "uint256", "name": "index", "type": "uint256" }
-          ],
-          "stateMutability": "nonpayable",
-          "type": "function",
-          "name": "removeRuleOperation"
-        },
-        {
-          "inputs": [
-            {
-              "internalType": "contract IRuleValidation",
-              "name": "rule_",
-              "type": "address"
-            },
-            { "internalType": "uint256", "name": "index", "type": "uint256" }
-          ],
-          "stateMutability": "nonpayable",
-          "type": "function",
-          "name": "removeRuleValidation"
-        },
-        {
-          "inputs": [
-            { "internalType": "bytes32", "name": "role", "type": "bytes32" },
-            {
-              "internalType": "address",
-              "name": "callerConfirmation",
-              "type": "address"
-            }
-          ],
-          "stateMutability": "nonpayable",
-          "type": "function",
-          "name": "renounceRole"
-        },
-        {
-          "inputs": [
-            { "internalType": "bytes32", "name": "role", "type": "bytes32" },
-            { "internalType": "address", "name": "account", "type": "address" }
-          ],
-          "stateMutability": "nonpayable",
-          "type": "function",
-          "name": "revokeRole"
-        },
-        {
-          "inputs": [
-            { "internalType": "uint256", "name": "ruleId", "type": "uint256" }
-          ],
-          "stateMutability": "view",
-          "type": "function",
-          "name": "ruleOperation",
-          "outputs": [
-            { "internalType": "address", "name": "", "type": "address" }
-          ]
-        },
-        {
-          "inputs": [
-            { "internalType": "uint256", "name": "ruleId", "type": "uint256" }
-          ],
-          "stateMutability": "view",
-          "type": "function",
-          "name": "ruleValidation",
-          "outputs": [
-            { "internalType": "address", "name": "", "type": "address" }
-          ]
-        },
-        {
-          "inputs": [],
-          "stateMutability": "view",
-          "type": "function",
-          "name": "rulesCountOperation",
-          "outputs": [
-            { "internalType": "uint256", "name": "", "type": "uint256" }
-          ]
-        },
-        {
-          "inputs": [],
-          "stateMutability": "view",
-          "type": "function",
-          "name": "rulesCountValidation",
-          "outputs": [
-            { "internalType": "uint256", "name": "", "type": "uint256" }
-          ]
-        },
-        {
-          "inputs": [],
-          "stateMutability": "view",
-          "type": "function",
-          "name": "rulesOperation",
-          "outputs": [
-            { "internalType": "address[]", "name": "", "type": "address[]" }
-          ]
-        },
-        {
-          "inputs": [],
-          "stateMutability": "view",
-          "type": "function",
-          "name": "rulesValidation",
-          "outputs": [
-            { "internalType": "address[]", "name": "", "type": "address[]" }
-          ]
-        },
-        {
-          "inputs": [
-            {
-              "internalType": "address[]",
-              "name": "rules_",
-              "type": "address[]"
-            }
-          ],
-          "stateMutability": "nonpayable",
-          "type": "function",
-          "name": "setRulesOperation"
-        },
-        {
-          "inputs": [
-            {
-              "internalType": "address[]",
-              "name": "rules_",
-              "type": "address[]"
-            }
-          ],
-          "stateMutability": "nonpayable",
-          "type": "function",
-          "name": "setRulesValidation"
-        },
-        {
-          "inputs": [
-            {
-              "internalType": "bytes4",
-              "name": "interfaceId",
-              "type": "bytes4"
-            }
-          ],
-          "stateMutability": "view",
-          "type": "function",
-          "name": "supportsInterface",
-          "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }]
-        },
-        {
-          "inputs": [],
-          "stateMutability": "view",
-          "type": "function",
-          "name": "trustedForwarder",
-          "outputs": [
-            { "internalType": "address", "name": "", "type": "address" }
-          ]
-        },
-        {
-          "inputs": [
-            { "internalType": "address", "name": "_from", "type": "address" },
-            { "internalType": "address", "name": "_to", "type": "address" },
-            { "internalType": "uint256", "name": "_amount", "type": "uint256" }
-          ],
-          "stateMutability": "view",
-          "type": "function",
-          "name": "validateTransfer",
-          "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }]
-        },
-        {
-          "inputs": [
-            { "internalType": "address", "name": "_from", "type": "address" },
-            { "internalType": "address", "name": "_to", "type": "address" },
-            { "internalType": "uint256", "name": "_amount", "type": "uint256" }
-          ],
-          "stateMutability": "view",
-          "type": "function",
-          "name": "validateTransferValidation",
-          "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }]
-        }
-      ],
-      "devdoc": {
-        "kind": "dev",
-        "methods": {
-          "constructor": {
-            "params": {
-              "admin": "Address of the contract (Access Control)",
-              "forwarderIrrevocable": "Address of the forwarder, required for the gasless support"
-            }
-          },
-          "detectTransferRestriction(address,address,uint256)": {
-            "params": {
-              "_amount": "to transfer",
-              "_from": "the origin address",
-              "_to": "the destination address"
-            },
-            "returns": {
-              "_0": "The restricion code or REJECTED_CODE_BASE.TRANSFER_OK*"
-            }
-          },
-          "detectTransferRestrictionValidation(address,address,uint256)": {
-            "params": {
-              "_amount": "to transfer",
-              "_from": "the origin address",
-              "_to": "the destination address"
-            },
-            "returns": {
-              "_0": "The restricion code or REJECTED_CODE_BASE.TRANSFER_OK*"
-            }
-          },
-          "getRoleAdmin(bytes32)": {
-            "details": "Returns the admin role that controls `role`. See {grantRole} and {revokeRole}. To change a role's admin, use {_setRoleAdmin}."
-          },
-          "getRuleIndexOperation(address)": {
-            "returns": {
-              "index": "if the rule is found, _rulesOperation.length otherwise"
-            }
-          },
-          "getRuleIndexValidation(address)": {
-            "returns": {
-              "index": "if the rule is found, _rulesValidation.length otherwise"
-            }
-          },
-          "grantRole(bytes32,address)": {
-            "details": "Grants `role` to `account`. If `account` had not been already granted `role`, emits a {RoleGranted} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleGranted} event."
-          },
-          "hasRole(bytes32,address)": {
-            "details": "Returns `true` if `account` has been granted `role`."
-          },
-          "isTrustedForwarder(address)": {
-            "details": "Indicates whether any particular address is the trusted forwarder."
-          },
-          "messageForTransferRestriction(uint8)": {
-            "params": { "_restrictionCode": "The target restriction code" },
-            "returns": {
-              "_0": "True if the transfer is valid, false otherwise*"
-            }
-          },
-          "removeRuleOperation(address,uint256)": {
-            "details": "To reduce the array size, the last rule is moved to the location occupied by the rule to remove",
-            "params": {
-              "index": "the position inside the array of rule",
-              "rule_": "address of the target rule"
-            }
-          },
-          "removeRuleValidation(address,uint256)": {
-            "details": "To reduce the array size, the last rule is moved to the location occupied by the rule to remove",
-            "params": {
-              "index": "the position inside the array of rule",
-              "rule_": "address of the target rule"
-            }
-          },
-          "renounceRole(bytes32,address)": {
-            "details": "Revokes `role` from the calling account. Roles are often managed via {grantRole} and {revokeRole}: this function's purpose is to provide a mechanism for accounts to lose their privileges if they are compromised (such as when a trusted device is misplaced). If the calling account had been revoked `role`, emits a {RoleRevoked} event. Requirements: - the caller must be `callerConfirmation`. May emit a {RoleRevoked} event."
-          },
-          "revokeRole(bytes32,address)": {
-            "details": "Revokes `role` from `account`. If `account` had been granted `role`, emits a {RoleRevoked} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleRevoked} event."
-          },
-          "ruleOperation(uint256)": {
-            "params": { "ruleId": "index of the rule" },
-            "returns": { "_0": "a rule address" }
-          },
-          "ruleValidation(uint256)": {
-            "params": { "ruleId": "index of the rule" },
-            "returns": { "_0": "a rule address" }
-          },
-          "rulesCountOperation()": {
-            "returns": { "_0": "The number of rules inside the array" }
-          },
-          "rulesCountValidation()": {
-            "returns": { "_0": "The number of rules inside the array" }
-          },
-          "rulesOperation()": { "returns": { "_0": "An array of rules" } },
-          "rulesValidation()": { "returns": { "_0": "An array of rules" } },
-          "setRulesValidation(address[])": {
-            "details": "take address[] instead of IRuleEngineValidation[] since it is not possible to cast IRuleEngineValidation[] -> address[]"
-          },
-          "supportsInterface(bytes4)": {
-            "details": "See {IERC165-supportsInterface}."
-          },
-          "trustedForwarder()": {
-            "details": "Returns the address of the trusted forwarder."
-          },
-          "validateTransfer(address,address,uint256)": {
-            "params": {
-              "_amount": "to transfer",
-              "_from": "the origin address",
-              "_to": "the destination address"
-            },
-            "returns": {
-              "_0": "True if the transfer is valid, false otherwise*"
-            }
-          },
-          "validateTransferValidation(address,address,uint256)": {
-            "params": {
-              "_amount": "to transfer",
-              "_from": "the origin address",
-              "_to": "the destination address"
-            },
-            "returns": {
-              "_0": "True if the transfer is valid, false otherwise*"
-            }
-          }
-        },
-        "version": 1
-      },
-      "userdoc": {
-        "kind": "user",
-        "methods": {
-          "RULE_ENGINE_OPERATOR_ROLE()": {
-            "notice": "Role to manage the ruleEngine"
-          },
-          "TOKEN_CONTRACT_ROLE()": { "notice": "token contract" },
-          "addRuleOperation(address)": {
-            "notice": "Add a rule to the array of rules Revert if one rule is a zero address or if the rule is already present"
-          },
-          "addRuleValidation(address)": {
-            "notice": "Add a rule to the array of rules Revert if one rule is a zero address or if the rule is already present"
-          },
-          "clearRulesOperation()": {
-            "notice": "Clear all the rules of the array of rules"
-          },
-          "clearRulesValidation()": {
-            "notice": "Clear all the rules of the array of rules"
-          },
-          "detectTransferRestriction(address,address,uint256)": {
-            "notice": "Go through all the rule to know if a restriction exists on the transfer"
-          },
-          "detectTransferRestrictionValidation(address,address,uint256)": {
-            "notice": "Go through all the rule to know if a restriction exists on the transfer"
-          },
-          "getRuleIndexOperation(address)": {
-            "notice": "Get the index of a rule inside the list"
-          },
-          "getRuleIndexValidation(address)": {
-            "notice": "Get the index of a rule inside the list"
-          },
-          "messageForTransferRestriction(uint8)": {
-            "notice": "Return the message corresponding to the code"
-          },
-          "removeRuleOperation(address,uint256)": {
-            "notice": "Remove a rule from the array of rules Revert if the rule found at the specified index does not match the rule in argument"
-          },
-          "removeRuleValidation(address,uint256)": {
-            "notice": "Remove a rule from the array of rules Revert if the rule found at the specified index does not match the rule in argument"
-          },
-          "ruleOperation(uint256)": {
-            "notice": "Get the rule at the position specified by ruleId"
-          },
-          "ruleValidation(uint256)": {
-            "notice": "Get the rule at the position specified by ruleId"
-          },
-          "rulesOperation()": { "notice": "Get all the rules" },
-          "rulesValidation()": { "notice": "Get all the rules" },
-          "setRulesOperation(address[])": {
-            "notice": "Set all the rules, will overwrite all the previous rules. \\n Revert if one rule is a zero address or if the rule is already present"
-          },
-          "setRulesValidation(address[])": {
-            "notice": "Set all the rules, will overwrite all the previous rules. \\n Revert if one rule is a zero address or if the rule is already present"
-          },
-          "validateTransfer(address,address,uint256)": {
-            "notice": "Validate a transfer"
-          },
-          "validateTransferValidation(address,address,uint256)": {
-            "notice": "Validate a transfer"
-          }
-        },
-        "version": 1
-      }
-    },
-    "settings": {
-      "remappings": [
-        "@openzeppelin/contracts/=lib/openzeppelin-contracts/contracts/",
-        "CMTAT/=lib/CMTAT/contracts/",
-        "OZ/=lib/openzeppelin-contracts/contracts/",
-        "ds-test/=lib/openzeppelin-contracts/lib/forge-std/lib/ds-test/src/",
-        "erc4626-tests/=lib/openzeppelin-contracts/lib/erc4626-tests/",
-        "forge-std/=lib/forge-std/src/",
-        "openzeppelin-contracts/=lib/openzeppelin-contracts/"
-      ],
-      "optimizer": { "enabled": true, "runs": 200 },
-      "metadata": { "bytecodeHash": "ipfs" },
-      "compilationTarget": { "src/RuleEngine.sol": "RuleEngine" },
-      "evmVersion": "london",
-      "libraries": {}
-    },
-    "sources": {
-      "lib/CMTAT/contracts/interfaces/draft-IERC1404/draft-IERC1404.sol": {
-        "keccak256": "0xfba123f04b693467a10bffcc3d30c8ee0a55a159d1a50a9e6ad7efa6a08ad9ad",
-        "urls": [
-          "bzz-raw://f0af9bead272c5af8153932efe6e464485aa27c82a2a5c79ed94e780ec373da0",
-          "dweb:/ipfs/QmZJj9B5sBDGY8b5qbFkadmQ377xugKwGoxkHPWW3BpnWg"
-        ],
-        "license": "MPL-2.0"
-      },
-      "lib/CMTAT/contracts/interfaces/draft-IERC1404/draft-IERC1404EnumCode.sol": {
-        "keccak256": "0x5162820d851ed01a9ce5e0b28b58b4dfa6262d010e0f112ca1dd1867b37600ed",
-        "urls": [
-          "bzz-raw://599cbb744369ec114f918eec3f462d0f2f0a33bab292683be34098bf98b31423",
-          "dweb:/ipfs/QmTSYGzsUDicQ5jCu88r2XnRqFyS5nJqfPGiz4q3aL35mx"
-        ],
-        "license": "MPL-2.0"
-      },
-      "lib/CMTAT/contracts/interfaces/draft-IERC1404/draft-IERC1404Wrapper.sol": {
-        "keccak256": "0xefa53aa4e697f2fd338b56888c9492392100a146ccd7a2c107cbd189f5c99ea3",
-        "urls": [
-          "bzz-raw://a7a5933297a01300d5eb8baa49cce9c98c5f3779e329f4ac41dae6e128bdf68e",
-          "dweb:/ipfs/QmcDMxLHuuc7n8dVw6PWtQaRrkqMrtQUoBt4XKeNHF69mF"
-        ],
-        "license": "MPL-2.0"
-      },
-      "lib/CMTAT/contracts/interfaces/engine/IRuleEngine.sol": {
-        "keccak256": "0x5db0b6db44e76f6b52541fdd68f5d534c035777c00df4f65e66a500e46d1049f",
-        "urls": [
-          "bzz-raw://a03b82a1cfcda98db1a52a0e6fb1a22cf4545604e59167a7c23439ef463b9607",
-          "dweb:/ipfs/QmPwqKgMSBmURhgmvXi2hMxM7FTLTtEsZMn6mXRjpbqxSc"
-        ],
-        "license": "MPL-2.0"
-      },
-      "lib/openzeppelin-contracts/contracts/access/AccessControl.sol": {
-        "keccak256": "0xa0e92d42942f4f57c5be50568dac11e9d00c93efcb458026e18d2d9b9b2e7308",
-        "urls": [
-          "bzz-raw://46326c0bb1e296b67185e81c918e0b40501b8b6386165855df0a3f3c634b6a80",
-          "dweb:/ipfs/QmTwyrDYtsxsk6pymJTK94PnEpzsmkpUxFuzEiakDopy4Z"
-        ],
-        "license": "MIT"
-      },
-      "lib/openzeppelin-contracts/contracts/access/IAccessControl.sol": {
-        "keccak256": "0xb6b36edd6a2999fd243ff226d6cbf84bd71af2432bbd0dfe19392996a1d9cb41",
-        "urls": [
-          "bzz-raw://1fd2f35495652e57e3f99bc6c510bc5f7dd398a176ea2e72d8ed730aebc6ca26",
-          "dweb:/ipfs/QmTQV6X4gkikTib49cho5iDX3JvSQbdsoEChoDwrk3CbbH"
-        ],
-        "license": "MIT"
-      },
-      "lib/openzeppelin-contracts/contracts/metatx/ERC2771Context.sol": {
-        "keccak256": "0x98256cf37b71a69b2f5a8a6fe975ea03590dff703102bd141a830f94e8adebf6",
-        "urls": [
-          "bzz-raw://6251fe1f6a1e45e6d619d150c123afc88b8646b38ee26a136efa9a6988a31d3f",
-          "dweb:/ipfs/QmeXDT85wSZdP31wkz3ah3KhponCiksJLP5o2LR5e1JxcK"
-        ],
-        "license": "MIT"
-      },
-      "lib/openzeppelin-contracts/contracts/utils/Context.sol": {
-        "keccak256": "0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2",
-        "urls": [
-          "bzz-raw://6a708e8a5bdb1011c2c381c9a5cfd8a9a956d7d0a9dc1bd8bcdaf52f76ef2f12",
-          "dweb:/ipfs/Qmax9WHBnVsZP46ZxEMNRQpLQnrdE4dK8LehML1Py8FowF"
-        ],
-        "license": "MIT"
-      },
-      "lib/openzeppelin-contracts/contracts/utils/introspection/ERC165.sol": {
-        "keccak256": "0x9e8778b14317ba9e256c30a76fd6c32b960af621987f56069e1e819c77c6a133",
-        "urls": [
-          "bzz-raw://1777404f1dcd0fac188e55a288724ec3c67b45288e49cc64723e95e702b49ab8",
-          "dweb:/ipfs/QmZFdC626GButBApwDUvvTnUzdinevC3B24d7yyh57XkiA"
-        ],
-        "license": "MIT"
-      },
-      "lib/openzeppelin-contracts/contracts/utils/introspection/IERC165.sol": {
-        "keccak256": "0x4296879f55019b23e135000eb36896057e7101fb7fb859c5ef690cf14643757b",
-        "urls": [
-          "bzz-raw://87b3541437c8c443ccd36795e56a338ed12855eec17f8da624511b8d1a7e14df",
-          "dweb:/ipfs/QmeJQCtZrQjtJLr6u7ZHWeH3pBnjtLWzvRrKViAi7UZqxL"
-        ],
-        "license": "MIT"
-      },
-      "src/RuleEngine.sol": {
-        "keccak256": "0x108df8613195e2df8429038ed65bdc4cf930bda8fa86ca2b13311ad5383727f5",
-        "urls": [
-          "bzz-raw://f81ea56c32b2c8e92d80cd3ed0cad80b5f2a3fac35f54532ce1dcd2b436a5f9b",
-          "dweb:/ipfs/QmW6GdVvEfyn47o9GkcpybmP8PYDfT6fvTFHAU1syMkdya"
-        ],
-        "license": "MPL-2.0"
-      },
-      "src/interfaces/IRuleEngineOperation.sol": {
-        "keccak256": "0x21f2fe8b4408853f65d5b9540426d93286c6be1a6e7424a243034453bb961809",
-        "urls": [
-          "bzz-raw://3c0fc26eb256d6e6a1e85a07ed83b50a16cf0a519abf8d405388505e21dd6b91",
-          "dweb:/ipfs/Qmamkpa5fBptqAa2kXZLAqKXJY4NMdFWw8ozwob9o8Ze76"
-        ],
-        "license": "MPL-2.0"
-      },
-      "src/interfaces/IRuleEngineValidation.sol": {
-        "keccak256": "0x19f9b71580dddb20a29570bff88f711abf0c8aec18bd563643764aa37355eac1",
-        "urls": [
-          "bzz-raw://4a48e1abaa9d740c88bb33958b2227b1d98723a357fe35a6cc3a2843b00cdc20",
-          "dweb:/ipfs/QmVaEQQhH522tKEJLizmFDuTeAyxb8bZP7byHpfNxwSmyT"
-        ],
-        "license": "MPL-2.0"
-      },
-      "src/interfaces/IRuleOperation.sol": {
-        "keccak256": "0x4960e62d6678d66d36d611f2e6819fbdeeed748c2d638965bf631b88c3beefb6",
-        "urls": [
-          "bzz-raw://b5509fccac80d4ab115d73281b22cc3877a7295ed39d901aba8fd73ce9275fce",
-          "dweb:/ipfs/QmZQHqPtv2K7Bv4no5gnqmpWX92Gq7ENTD7vvZNvj5bUZE"
-        ],
-        "license": "MPL-2.0"
-      },
-      "src/interfaces/IRuleValidation.sol": {
-        "keccak256": "0x6b23f8d7355937f0d304ceb498f661b004d1969f87782af7588a960273af38a1",
-        "urls": [
-          "bzz-raw://b9c92ca4ce23304474c8236dd37c60f2c98627ca2a6156eb2ce0767436f40fa9",
-          "dweb:/ipfs/QmZMkCu57MjUXjN5TtkhDGgM9RzGQpTX3uD79P1M9Vn2G8"
-        ],
-        "license": "MPL-2.0"
-      },
-      "src/modules/MetaTxModuleStandalone.sol": {
-        "keccak256": "0x32423330fbd140fb87b7f3c9f004db3eb7256f0f8c15b76be26ff14ba81edba0",
-        "urls": [
-          "bzz-raw://af6e6cfd9ccb587283b8379965a76143a27aaa38115191db1bbb1a5632eb4a25",
-          "dweb:/ipfs/QmTdaEc78NfG9wJRYErsCZajvNF8ozLaqEfNyzi7Fu1fMj"
-        ],
-        "license": "MPL-2.0"
-      },
-      "src/modules/RuleEngineInvariantStorage.sol": {
-        "keccak256": "0x09093b1b80c8fd27ef80aaec46522ec5525aebcdb0fe77231821197d6fe7a1a0",
-        "urls": [
-          "bzz-raw://4939364678439e43818b1efb114b662219629b5945ecd98b1e39eca64d46dc44",
-          "dweb:/ipfs/QmSikHEsDZy8hzyQ33N3AhiM25S7pCFEmqADZxK53FpCDq"
-        ],
-        "license": "MPL-2.0"
-      },
-      "src/modules/RuleEngineOperation.sol": {
-        "keccak256": "0xb8c4fa96bc94d612ee39003f13092611b2ecaaf668d566636026a20fab957e7a",
-        "urls": [
-          "bzz-raw://4249be172c68926880eb32292b9f4c917eb1b9e6ca14845b71757dd5c219b5bd",
-          "dweb:/ipfs/QmQYNUiQGSANNtUTmMg2H7PiN68mEvKJzgWin9QdZzgNrs"
-        ],
-        "license": "MPL-2.0"
-      },
-      "src/modules/RuleEngineValidation.sol": {
-        "keccak256": "0x9922d5d720fb23684e32a17ea6a99d40b7f516b6c2078eb94ebe7efdc5ead367",
-        "urls": [
-          "bzz-raw://0982786aeb0ce4e2a04a99cf306f67ce0d20f1a11c81070f070429d76117d26a",
-          "dweb:/ipfs/QmPfmFe5D5eWiMFj1VKWfDhomMmqiUgmpGC4LaqLfTKR9w"
-        ],
-        "license": "MPL-2.0"
-      },
-      "src/modules/RuleEngineValidationCommon.sol": {
-        "keccak256": "0xf1d0fdd62ba10b81918a6749e1fcf9f020b298a8179a1cf6c849fe0aaa5edddb",
-        "urls": [
-          "bzz-raw://57ae96630675750b371656a3e9ce3a5b1e2ce16327d3e292b934def1b85c8a1d",
-          "dweb:/ipfs/QmZm9obyXiMCJzLPNCvvtN9QogngmRnkZJmBke2bc79Jgk"
-        ],
-        "license": "MPL-2.0"
-      },
-      "src/modules/RuleInternal.sol": {
-        "keccak256": "0xa6d2f8844062b318c31cb97570b840ac2faa50111564c97b7190bcadcab4419c",
-        "urls": [
-          "bzz-raw://878b4ba012b1c46973bb50018973a90ea6b700706a2ae52b0bae7d240df510b3",
-          "dweb:/ipfs/QmdRjwxgoo4xc3JmyAirRbbLupKVZ51r67e1D93bTFSF6A"
-        ],
-        "license": "MPL-2.0"
-      }
-    },
-    "version": 1
-  },
-  "id": 84
-}
diff --git a/RuleWhitelistWrapper.json b/RuleWhitelistWrapper.json
deleted file mode 100644
index 73281c9..0000000
--- a/RuleWhitelistWrapper.json
+++ /dev/null
@@ -1 +0,0 @@
-{"abi":[{"type":"constructor","inputs":[{"name":"admin","type":"address","internalType":"address"},{"name":"forwarderIrrevocable","type":"address","internalType":"address"}],"stateMutability":"nonpayable"},{"type":"function","name":"CODE_ADDRESS_FROM_NOT_WHITELISTED","inputs":[],"outputs":[{"name":"","type":"uint8","internalType":"uint8"}],"stateMutability":"view"},{"type":"function","name":"CODE_ADDRESS_TO_NOT_WHITELISTED","inputs":[],"outputs":[{"name":"","type":"uint8","internalType":"uint8"}],"stateMutability":"view"},{"type":"function","name":"DEFAULT_ADMIN_ROLE","inputs":[],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"RULE_ENGINE_OPERATOR_ROLE","inputs":[],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"TOKEN_CONTRACT_ROLE","inputs":[],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"addRuleValidation","inputs":[{"name":"rule_","type":"address","internalType":"contract IRuleValidation"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"canReturnTransferRestrictionCode","inputs":[{"name":"_restrictionCode","type":"uint8","internalType":"uint8"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"pure"},{"type":"function","name":"clearRulesValidation","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"detectTransferRestriction","inputs":[{"name":"_from","type":"address","internalType":"address"},{"name":"_to","type":"address","internalType":"address"},{"name":"","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"uint8","internalType":"uint8"}],"stateMutability":"view"},{"type":"function","name":"getRoleAdmin","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"}],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"getRuleIndexValidation","inputs":[{"name":"rule_","type":"address","internalType":"contract IRuleValidation"}],"outputs":[{"name":"index","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"grantRole","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"},{"name":"account","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"hasRole","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"},{"name":"account","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"isTrustedForwarder","inputs":[{"name":"forwarder","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"messageForTransferRestriction","inputs":[{"name":"_restrictionCode","type":"uint8","internalType":"uint8"}],"outputs":[{"name":"","type":"string","internalType":"string"}],"stateMutability":"pure"},{"type":"function","name":"removeRuleValidation","inputs":[{"name":"rule_","type":"address","internalType":"contract IRuleValidation"},{"name":"index","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"renounceRole","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"},{"name":"callerConfirmation","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"revokeRole","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"},{"name":"account","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"ruleValidation","inputs":[{"name":"ruleId","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"rulesCountValidation","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"rulesValidation","inputs":[],"outputs":[{"name":"","type":"address[]","internalType":"address[]"}],"stateMutability":"view"},{"type":"function","name":"setRulesValidation","inputs":[{"name":"rules_","type":"address[]","internalType":"address[]"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"supportsInterface","inputs":[{"name":"interfaceId","type":"bytes4","internalType":"bytes4"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"trustedForwarder","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"validateTransfer","inputs":[{"name":"_from","type":"address","internalType":"address"},{"name":"_to","type":"address","internalType":"address"},{"name":"_amount","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"isValid","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"event","name":"AddRule","inputs":[{"name":"rule","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"event","name":"ClearRules","inputs":[{"name":"rulesRemoved","type":"address[]","indexed":false,"internalType":"address[]"}],"anonymous":false},{"type":"event","name":"RemoveRule","inputs":[{"name":"rule","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"event","name":"RoleAdminChanged","inputs":[{"name":"role","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"previousAdminRole","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"newAdminRole","type":"bytes32","indexed":true,"internalType":"bytes32"}],"anonymous":false},{"type":"event","name":"RoleGranted","inputs":[{"name":"role","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"account","type":"address","indexed":true,"internalType":"address"},{"name":"sender","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"event","name":"RoleRevoked","inputs":[{"name":"role","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"account","type":"address","indexed":true,"internalType":"address"},{"name":"sender","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"error","name":"AccessControlBadConfirmation","inputs":[]},{"type":"error","name":"AccessControlUnauthorizedAccount","inputs":[{"name":"account","type":"address","internalType":"address"},{"name":"neededRole","type":"bytes32","internalType":"bytes32"}]},{"type":"error","name":"RuleEngine_AdminWithAddressZeroNotAllowed","inputs":[]},{"type":"error","name":"RuleEngine_ArrayIsEmpty","inputs":[]},{"type":"error","name":"RuleEngine_RuleAddressZeroNotAllowed","inputs":[]},{"type":"error","name":"RuleEngine_RuleAlreadyExists","inputs":[]},{"type":"error","name":"RuleEngine_RuleDoNotMatch","inputs":[]}],"bytecode":{"object":"0x60a06040523480156200001157600080fd5b506040516200197138038062001971833981016040819052620000349162000207565b6001600160a01b0380821660805282166200006257604051630872273360e21b815260040160405180910390fd5b6200006f600083620000a5565b506200009c7fb3c151d85eb431da97012a1682e6ab41bddc7db1012e7c40bd326c24bf56f99983620000a5565b505050620002be565b6000828152602081815260408083206001600160a01b038516845290915281205460ff166200014c576000838152602081815260408083206001600160a01b03861684529091529020805460ff191660011790556200010362000156565b6001600160a01b0316826001600160a01b0316847f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a450600162000150565b5060005b92915050565b60006200016262000167565b905090565b60003660146200017733620001c3565b8015620001845750808210155b15620001bb576000366200019983856200023f565b620001a692829062000261565b620001b1916200028d565b60601c9250505090565b339250505090565b6000620001cf60805190565b6001600160a01b0316826001600160a01b0316149050919050565b80516001600160a01b03811681146200020257600080fd5b919050565b600080604083850312156200021b57600080fd5b6200022683620001ea565b91506200023660208401620001ea565b90509250929050565b818103818111156200015057634e487b7160e01b600052601160045260246000fd5b600080858511156200027257600080fd5b838611156200028057600080fd5b5050820193919092039150565b6001600160601b03198135818116916014851015620002b65780818660140360031b1b83161692505b505092915050565b608051611689620002e860003960008181610281015281816102f50152610f4701526116896000f3fe608060405234801561001057600080fd5b50600436106101735760003560e01c80637da0a877116100de578063a217fddf11610097578063cd1d4dc711610071578063cd1d4dc71461039f578063d4ce1415146103b2578063d547741f146103c5578063db136dad146103d857600080fd5b8063a217fddf1461036f578063c57086a114610377578063c6946a121461038c57600080fd5b80637da0a877146102f35780637f4ab1dd1461031957806383304df0146103395780638a1b6c8e1461034c5780638a2021b11461035457806391d148541461035c57600080fd5b8063397a7d3c11610130578063397a7d3c146102335780634d53374e1461025e578063572b6c05146102715780635b119c0a146102b15780636728f545146102cb5780637d045df6146102e057600080fd5b806301ffc9a7146101785780630fbbfb55146101a0578063248a9ca3146101d55780632f2ff15d146101f8578063334a29cc1461020d57806336568abe14610220575b600080fd5b61018b610186366004611186565b6103e0565b60405190151581526020015b60405180910390f35b6101c77fd32fd1ee5f4f111da6f27444787e5200ec57a8849509c00ef2998467052b32a381565b604051908152602001610197565b6101c76101e33660046111b0565b60009081526020819052604090206001015490565b61020b6102063660046111de565b610417565b005b61020b61021b36600461120e565b610442565b61020b61022e3660046111de565b610480565b6102466102413660046111b0565b6104c8565b6040516001600160a01b039091168152602001610197565b61020b61026c366004611283565b6104f8565b61018b61027f3660046112af565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0390811691161490565b6102b9601581565b60405160ff9091168152602001610197565b6101c76000805160206115ed83398151915281565b61018b6102ee3660046112db565b61051a565b7f0000000000000000000000000000000000000000000000000000000000000000610246565b61032c6103273660046112db565b610536565b60405161019791906112f8565b6101c76103473660046112af565b6105cc565b61020b6105d9565b6002546101c7565b61018b61036a3660046111de565b6105fc565b6101c7600081565b61037f610625565b6040516101979190611347565b61018b61039a366004611394565b610687565b61020b6103ad3660046112af565b610711565b6102b96103c0366004611394565b61076c565b61020b6103d33660046111de565b610a1c565b6102b9601681565b60006001600160e01b03198216637965db0b60e01b148061041157506301ffc9a760e01b6001600160e01b03198316145b92915050565b60008281526020819052604090206001015461043281610a41565b61043c8383610a52565b50505050565b6000805160206115ed83398151915261045a81610a41565b6002541561046a5761046a610ae5565b6104748383610b75565b61043c6002848461110e565b610488610d10565b6001600160a01b0316816001600160a01b0316146104b95760405163334bd91960e11b815260040160405180910390fd5b6104c38282610d1f565b505050565b6000600282815481106104dd576104dd6113d5565b6000918252602090912001546001600160a01b031692915050565b6000805160206115ed83398151915261051081610a41565b6104c38383610da8565b600060ff821660151480610411575060ff821660161492915050565b606060141960ff831601610563576040518060600160405280602281526020016116326022913992915050565b60151960ff83160161058e5760405180606001604052806025815260200161160d6025913992915050565b505060408051808201909152601881527f556e6b6e6f776e207265737472696374696f6e20636f64650000000000000000602082015290565b919050565b6000610411600283610dec565b6000805160206115ed8339815191526105f181610a41565b6105f9610ae5565b50565b6000918252602082815260408084206001600160a01b0393909316845291905290205460ff1690565b6060600280548060200260200160405190810160405280929190818152602001828054801561067d57602002820191906000526020600020905b81546001600160a01b0316815260019091019060200180831161065f575b5050505050905090565b60405163d4ce141560e01b81526001600160a01b03848116600483015283166024820152604481018290526000908190309063d4ce141590606401602060405180830381865afa1580156106df573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061070391906113eb565b60ff161490505b9392505050565b6000805160206115ed83398151915261072981610a41565b610734600283610e4a565b6040516001600160a01b038316907f60305ce6c9104acd0969d358f926bf391174340660aaf5e6215261fd6847bf4690600090a25050565b6040805160028082526060820183526000928392919060208301908036833750506040805160028082526060820183529394506000939092509060208301908036833750506040805160028082526060820183529394506000939092509060208301908036833701905050905086836000815181106107ed576107ed6113d5565b60200260200101906001600160a01b031690816001600160a01b0316815250508583600181518110610821576108216113d5565b6001600160a01b039092166020928302919091019091015260025460005b818110156109b6576002818154811061085a5761085a6113d5565b60009182526020909120015460405163051b206960e11b81526001600160a01b0390911690630a3640d290610893908890600401611347565b600060405180830381865afa1580156108b0573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526108d8919081019061142e565b9350836000815181106108ed576108ed6113d5565b6020026020010151801561091957508260008151811061090f5761090f6113d5565b6020026020010151155b1561094457600183600081518110610933576109336113d5565b911515602092830291909101909101525b83600181518110610957576109576113d5565b60200260200101518015610983575082600181518110610979576109796113d5565b6020026020010151155b156109ae5760018360018151811061099d5761099d6113d5565b911515602092830291909101909101525b60010161083f565b50816000815181106109ca576109ca6113d5565b60200260200101516109e357601594505050505061070a565b816001815181106109f6576109f66113d5565b6020026020010151610a0f57601694505050505061070a565b600094505050505061070a565b600082815260208190526040902060010154610a3781610a41565b61043c8383610d1f565b6105f981610a4d610d10565b610ef6565b6000610a5e83836105fc565b610add576000838152602081815260408083206001600160a01b03861684529091529020805460ff19166001179055610a95610d10565b6001600160a01b0316826001600160a01b0316847f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a4506001610411565b506000610411565b6002546000905b8015610b3957600181039150610b2960028381548110610b0e57610b0e6113d5565b6000918252602090912001546001600160a01b031683610da8565b610b3281611509565b9050610aec565b507f93dd3e43e4773b52a627c0ce6a20183638a2d2a264cfc9b6b7da0cccc95ea4b26002604051610b6a9190611520565b60405180910390a150565b6000819003610b9757604051630b9b3e5960e21b815260040160405180910390fd5b60005b818110156104c3576000838383818110610bb657610bb66113d5565b9050602002016020810190610bcb91906112af565b6001600160a01b031603610bf2576040516350092f7560e11b815260040160405180910390fd5b60016000848484818110610c0857610c086113d5565b9050602002016020810190610c1d91906112af565b6001600160a01b0316815260208101919091526040016000205460ff1615610c585760405163860d015160e01b815260040160405180910390fd5b6001806000858585818110610c6f57610c6f6113d5565b9050602002016020810190610c8491906112af565b6001600160a01b031681526020810191909152604001600020805460ff1916911515919091179055828282818110610cbe57610cbe6113d5565b9050602002016020810190610cd391906112af565b6001600160a01b03167f60305ce6c9104acd0969d358f926bf391174340660aaf5e6215261fd6847bf4660405160405180910390a2600101610b9a565b6000610d1a610f37565b905090565b6000610d2b83836105fc565b15610add576000838152602081815260408083206001600160a01b03861684529091529020805460ff19169055610d60610d10565b6001600160a01b0316826001600160a01b0316847ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a4506001610411565b610db460028383610fac565b6040516001600160a01b038316907f6d83315c9718799346b67584ec64301b1457e989c8e35a8e2982a7776c04bfc490600090a25050565b81546000905b80821015610e4157826001600160a01b0316848381548110610e1657610e166113d5565b6000918252602090912001546001600160a01b031603610e365750610411565b816001019150610df2565b50509054919050565b6001600160a01b038116610e71576040516350092f7560e11b815260040160405180910390fd5b6001600160a01b03811660009081526001602052604090205460ff1615610eab5760405163860d015160e01b815260040160405180910390fd5b8154600181810184556000938452602080852090920180546001600160a01b039094166001600160a01b0319909416841790559183528190526040909120805460ff19169091179055565b610f0082826105fc565b610f335760405163e2517d3f60e01b81526001600160a01b03821660048201526024810183905260440160405180910390fd5b5050565b6000366014336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148015610f745750808210155b15610fa457600036610f868385611564565b610f91928290611577565b610f9a916115a1565b60601c9250505090565b339250505090565b816001600160a01b0316838281548110610fc857610fc86113d5565b6000918252602090912001546001600160a01b031614610ffb57604051632f64842d60e11b815260040160405180910390fd5b825461100990600190611564565b811461108e578254839061101f90600190611564565b8154811061102f5761102f6113d5565b9060005260206000200160009054906101000a90046001600160a01b031683828154811061105f5761105f6113d5565b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b031602179055505b8280548061109e5761109e6115d6565b60008281526020808220830160001990810180546001600160a01b03191690559092019092556001600160a01b03841680835260019091526040808320805460ff191690555190917f6d83315c9718799346b67584ec64301b1457e989c8e35a8e2982a7776c04bfc491a2505050565b828054828255906000526020600020908101928215611161579160200282015b828111156111615781546001600160a01b0319166001600160a01b0384351617825560209092019160019091019061112e565b5061116d929150611171565b5090565b5b8082111561116d5760008155600101611172565b60006020828403121561119857600080fd5b81356001600160e01b03198116811461070a57600080fd5b6000602082840312156111c257600080fd5b5035919050565b6001600160a01b03811681146105f957600080fd5b600080604083850312156111f157600080fd5b823591506020830135611203816111c9565b809150509250929050565b6000806020838503121561122157600080fd5b823567ffffffffffffffff8082111561123957600080fd5b818501915085601f83011261124d57600080fd5b81358181111561125c57600080fd5b8660208260051b850101111561127157600080fd5b60209290920196919550909350505050565b6000806040838503121561129657600080fd5b82356112a1816111c9565b946020939093013593505050565b6000602082840312156112c157600080fd5b813561070a816111c9565b60ff811681146105f957600080fd5b6000602082840312156112ed57600080fd5b813561070a816112cc565b60006020808352835180602085015260005b818110156113265785810183015185820160400152820161130a565b506000604082860101526040601f19601f8301168501019250505092915050565b6020808252825182820181905260009190848201906040850190845b818110156113885783516001600160a01b031683529284019291840191600101611363565b50909695505050505050565b6000806000606084860312156113a957600080fd5b83356113b4816111c9565b925060208401356113c4816111c9565b929592945050506040919091013590565b634e487b7160e01b600052603260045260246000fd5b6000602082840312156113fd57600080fd5b815161070a816112cc565b634e487b7160e01b600052604160045260246000fd5b805180151581146105c757600080fd5b6000602080838503121561144157600080fd5b825167ffffffffffffffff8082111561145957600080fd5b818501915085601f83011261146d57600080fd5b81518181111561147f5761147f611408565b8060051b604051601f19603f830116810181811085821117156114a4576114a4611408565b6040529182528482019250838101850191888311156114c257600080fd5b938501935b828510156114e7576114d88561141e565b845293850193928501926114c7565b98975050505050505050565b634e487b7160e01b600052601160045260246000fd5b600081611518576115186114f3565b506000190190565b6020808252825482820181905260008481528281209092916040850190845b818110156113885783546001600160a01b03168352600193840193928501920161153f565b81810381811115610411576104116114f3565b6000808585111561158757600080fd5b8386111561159457600080fd5b5050820193919092039150565b6bffffffffffffffffffffffff1981358181169160148510156115ce5780818660140360031b1b83161692505b505092915050565b634e487b7160e01b600052603160045260246000fdfeb3c151d85eb431da97012a1682e6ab41bddc7db1012e7c40bd326c24bf56f99954686520726563697069656e74206973206e6f7420696e207468652077686974656c6973745468652073656e646572206973206e6f7420696e207468652077686974656c697374a2646970667358221220c9bcc22ff72080e0282cf07f741b675b81145f982e8e2d2edd186a14334e038e64736f6c63430008160033","sourceMap":"378:3013:101:-:0;;;672:341;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;1498:37:66;;;;;810:19:101;::::1;806:100;;852:43;;-1:-1:-1::0;;;852:43:101::1;;;;;;;;;;;806:100;915:37;2232:4:62;946:5:101::0;915:10:::1;:37::i;:::-;-1:-1:-1::0;962:44:101::1;726:38:90;1000:5:101::0;962:10:::1;:44::i;:::-;;672:341:::0;;378:3013;;6179:316:62;6256:4;2954:12;;;;;;;;;;;-1:-1:-1;;;;;2954:29:62;;;;;;;;;;;;6272:217;;6315:6;:12;;;;;;;;;;;-1:-1:-1;;;;;6315:29:62;;;;;;;;;:36;;-1:-1:-1;;6315:36:62;6347:4;6315:36;;;6397:12;:10;:12::i;:::-;-1:-1:-1;;;;;6370:40:62;6388:7;-1:-1:-1;;;;;6370:40:62;6382:4;6370:40;;;;;;;;;;-1:-1:-1;6431:4:62;6424:11;;6272:217;-1:-1:-1;6473:5:62;6272:217;6179:316;;;;:::o;2632:182:101:-;2743:14;2780:27;:25;:27::i;:::-;2773:34;;2632:182;:::o;2204:429:66:-;2266:7;2310:8;3481:2;2401:30;2420:10;2401:18;:30::i;:::-;:71;;;;;2453:19;2435:14;:37;;2401:71;2397:230;;;2511:8;;2520:36;2537:19;2520:14;:36;:::i;:::-;2511:47;;;;;:::i;:::-;2503:56;;;:::i;:::-;2495:65;;2488:72;;;;2204:429;:::o;2397:230::-;735:10:73;2591:25:66;;;;2204:429;:::o;1830:137::-;1906:4;1942:18;1705:17;;;1622:107;1942:18;-1:-1:-1;;;;;1929:31:66;:9;-1:-1:-1;;;;;1929:31:66;;1922:38;;1830:137;;;:::o;14:177:139:-;93:13;;-1:-1:-1;;;;;135:31:139;;125:42;;115:70;;181:1;178;171:12;115:70;14:177;;;:::o;196:293::-;275:6;283;336:2;324:9;315:7;311:23;307:32;304:52;;;352:1;349;342:12;304:52;375:40;405:9;375:40;:::i;:::-;365:50;;434:49;479:2;468:9;464:18;434:49;:::i;:::-;424:59;;196:293;;;;;:::o;494:225::-;561:9;;;582:11;;;579:134;;;635:10;630:3;626:20;623:1;616:31;670:4;667:1;660:15;698:4;695:1;688:15;724:331;829:9;840;882:8;870:10;867:24;864:44;;;904:1;901;894:12;864:44;933:6;923:8;920:20;917:40;;;953:1;950;943:12;917:40;-1:-1:-1;;979:23:139;;;1024:25;;;;;-1:-1:-1;724:331:139:o;1060:329::-;-1:-1:-1;;;;;;1181:19:139;;1260:11;;;;1291:2;1283:11;;1280:103;;;1370:2;1364;1357:3;1353:2;1349:12;1346:1;1342:20;1338:29;1334:2;1330:38;1326:47;1317:56;;1280:103;;;1060:329;;;;:::o;:::-;378:3013:101;;;;;;;;;;;;;;;;;;;;;;","linkReferences":{}},"deployedBytecode":{"object":"0x608060405234801561001057600080fd5b50600436106101735760003560e01c80637da0a877116100de578063a217fddf11610097578063cd1d4dc711610071578063cd1d4dc71461039f578063d4ce1415146103b2578063d547741f146103c5578063db136dad146103d857600080fd5b8063a217fddf1461036f578063c57086a114610377578063c6946a121461038c57600080fd5b80637da0a877146102f35780637f4ab1dd1461031957806383304df0146103395780638a1b6c8e1461034c5780638a2021b11461035457806391d148541461035c57600080fd5b8063397a7d3c11610130578063397a7d3c146102335780634d53374e1461025e578063572b6c05146102715780635b119c0a146102b15780636728f545146102cb5780637d045df6146102e057600080fd5b806301ffc9a7146101785780630fbbfb55146101a0578063248a9ca3146101d55780632f2ff15d146101f8578063334a29cc1461020d57806336568abe14610220575b600080fd5b61018b610186366004611186565b6103e0565b60405190151581526020015b60405180910390f35b6101c77fd32fd1ee5f4f111da6f27444787e5200ec57a8849509c00ef2998467052b32a381565b604051908152602001610197565b6101c76101e33660046111b0565b60009081526020819052604090206001015490565b61020b6102063660046111de565b610417565b005b61020b61021b36600461120e565b610442565b61020b61022e3660046111de565b610480565b6102466102413660046111b0565b6104c8565b6040516001600160a01b039091168152602001610197565b61020b61026c366004611283565b6104f8565b61018b61027f3660046112af565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0390811691161490565b6102b9601581565b60405160ff9091168152602001610197565b6101c76000805160206115ed83398151915281565b61018b6102ee3660046112db565b61051a565b7f0000000000000000000000000000000000000000000000000000000000000000610246565b61032c6103273660046112db565b610536565b60405161019791906112f8565b6101c76103473660046112af565b6105cc565b61020b6105d9565b6002546101c7565b61018b61036a3660046111de565b6105fc565b6101c7600081565b61037f610625565b6040516101979190611347565b61018b61039a366004611394565b610687565b61020b6103ad3660046112af565b610711565b6102b96103c0366004611394565b61076c565b61020b6103d33660046111de565b610a1c565b6102b9601681565b60006001600160e01b03198216637965db0b60e01b148061041157506301ffc9a760e01b6001600160e01b03198316145b92915050565b60008281526020819052604090206001015461043281610a41565b61043c8383610a52565b50505050565b6000805160206115ed83398151915261045a81610a41565b6002541561046a5761046a610ae5565b6104748383610b75565b61043c6002848461110e565b610488610d10565b6001600160a01b0316816001600160a01b0316146104b95760405163334bd91960e11b815260040160405180910390fd5b6104c38282610d1f565b505050565b6000600282815481106104dd576104dd6113d5565b6000918252602090912001546001600160a01b031692915050565b6000805160206115ed83398151915261051081610a41565b6104c38383610da8565b600060ff821660151480610411575060ff821660161492915050565b606060141960ff831601610563576040518060600160405280602281526020016116326022913992915050565b60151960ff83160161058e5760405180606001604052806025815260200161160d6025913992915050565b505060408051808201909152601881527f556e6b6e6f776e207265737472696374696f6e20636f64650000000000000000602082015290565b919050565b6000610411600283610dec565b6000805160206115ed8339815191526105f181610a41565b6105f9610ae5565b50565b6000918252602082815260408084206001600160a01b0393909316845291905290205460ff1690565b6060600280548060200260200160405190810160405280929190818152602001828054801561067d57602002820191906000526020600020905b81546001600160a01b0316815260019091019060200180831161065f575b5050505050905090565b60405163d4ce141560e01b81526001600160a01b03848116600483015283166024820152604481018290526000908190309063d4ce141590606401602060405180830381865afa1580156106df573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061070391906113eb565b60ff161490505b9392505050565b6000805160206115ed83398151915261072981610a41565b610734600283610e4a565b6040516001600160a01b038316907f60305ce6c9104acd0969d358f926bf391174340660aaf5e6215261fd6847bf4690600090a25050565b6040805160028082526060820183526000928392919060208301908036833750506040805160028082526060820183529394506000939092509060208301908036833750506040805160028082526060820183529394506000939092509060208301908036833701905050905086836000815181106107ed576107ed6113d5565b60200260200101906001600160a01b031690816001600160a01b0316815250508583600181518110610821576108216113d5565b6001600160a01b039092166020928302919091019091015260025460005b818110156109b6576002818154811061085a5761085a6113d5565b60009182526020909120015460405163051b206960e11b81526001600160a01b0390911690630a3640d290610893908890600401611347565b600060405180830381865afa1580156108b0573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526108d8919081019061142e565b9350836000815181106108ed576108ed6113d5565b6020026020010151801561091957508260008151811061090f5761090f6113d5565b6020026020010151155b1561094457600183600081518110610933576109336113d5565b911515602092830291909101909101525b83600181518110610957576109576113d5565b60200260200101518015610983575082600181518110610979576109796113d5565b6020026020010151155b156109ae5760018360018151811061099d5761099d6113d5565b911515602092830291909101909101525b60010161083f565b50816000815181106109ca576109ca6113d5565b60200260200101516109e357601594505050505061070a565b816001815181106109f6576109f66113d5565b6020026020010151610a0f57601694505050505061070a565b600094505050505061070a565b600082815260208190526040902060010154610a3781610a41565b61043c8383610d1f565b6105f981610a4d610d10565b610ef6565b6000610a5e83836105fc565b610add576000838152602081815260408083206001600160a01b03861684529091529020805460ff19166001179055610a95610d10565b6001600160a01b0316826001600160a01b0316847f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a4506001610411565b506000610411565b6002546000905b8015610b3957600181039150610b2960028381548110610b0e57610b0e6113d5565b6000918252602090912001546001600160a01b031683610da8565b610b3281611509565b9050610aec565b507f93dd3e43e4773b52a627c0ce6a20183638a2d2a264cfc9b6b7da0cccc95ea4b26002604051610b6a9190611520565b60405180910390a150565b6000819003610b9757604051630b9b3e5960e21b815260040160405180910390fd5b60005b818110156104c3576000838383818110610bb657610bb66113d5565b9050602002016020810190610bcb91906112af565b6001600160a01b031603610bf2576040516350092f7560e11b815260040160405180910390fd5b60016000848484818110610c0857610c086113d5565b9050602002016020810190610c1d91906112af565b6001600160a01b0316815260208101919091526040016000205460ff1615610c585760405163860d015160e01b815260040160405180910390fd5b6001806000858585818110610c6f57610c6f6113d5565b9050602002016020810190610c8491906112af565b6001600160a01b031681526020810191909152604001600020805460ff1916911515919091179055828282818110610cbe57610cbe6113d5565b9050602002016020810190610cd391906112af565b6001600160a01b03167f60305ce6c9104acd0969d358f926bf391174340660aaf5e6215261fd6847bf4660405160405180910390a2600101610b9a565b6000610d1a610f37565b905090565b6000610d2b83836105fc565b15610add576000838152602081815260408083206001600160a01b03861684529091529020805460ff19169055610d60610d10565b6001600160a01b0316826001600160a01b0316847ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a4506001610411565b610db460028383610fac565b6040516001600160a01b038316907f6d83315c9718799346b67584ec64301b1457e989c8e35a8e2982a7776c04bfc490600090a25050565b81546000905b80821015610e4157826001600160a01b0316848381548110610e1657610e166113d5565b6000918252602090912001546001600160a01b031603610e365750610411565b816001019150610df2565b50509054919050565b6001600160a01b038116610e71576040516350092f7560e11b815260040160405180910390fd5b6001600160a01b03811660009081526001602052604090205460ff1615610eab5760405163860d015160e01b815260040160405180910390fd5b8154600181810184556000938452602080852090920180546001600160a01b039094166001600160a01b0319909416841790559183528190526040909120805460ff19169091179055565b610f0082826105fc565b610f335760405163e2517d3f60e01b81526001600160a01b03821660048201526024810183905260440160405180910390fd5b5050565b6000366014336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148015610f745750808210155b15610fa457600036610f868385611564565b610f91928290611577565b610f9a916115a1565b60601c9250505090565b339250505090565b816001600160a01b0316838281548110610fc857610fc86113d5565b6000918252602090912001546001600160a01b031614610ffb57604051632f64842d60e11b815260040160405180910390fd5b825461100990600190611564565b811461108e578254839061101f90600190611564565b8154811061102f5761102f6113d5565b9060005260206000200160009054906101000a90046001600160a01b031683828154811061105f5761105f6113d5565b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b031602179055505b8280548061109e5761109e6115d6565b60008281526020808220830160001990810180546001600160a01b03191690559092019092556001600160a01b03841680835260019091526040808320805460ff191690555190917f6d83315c9718799346b67584ec64301b1457e989c8e35a8e2982a7776c04bfc491a2505050565b828054828255906000526020600020908101928215611161579160200282015b828111156111615781546001600160a01b0319166001600160a01b0384351617825560209092019160019091019061112e565b5061116d929150611171565b5090565b5b8082111561116d5760008155600101611172565b60006020828403121561119857600080fd5b81356001600160e01b03198116811461070a57600080fd5b6000602082840312156111c257600080fd5b5035919050565b6001600160a01b03811681146105f957600080fd5b600080604083850312156111f157600080fd5b823591506020830135611203816111c9565b809150509250929050565b6000806020838503121561122157600080fd5b823567ffffffffffffffff8082111561123957600080fd5b818501915085601f83011261124d57600080fd5b81358181111561125c57600080fd5b8660208260051b850101111561127157600080fd5b60209290920196919550909350505050565b6000806040838503121561129657600080fd5b82356112a1816111c9565b946020939093013593505050565b6000602082840312156112c157600080fd5b813561070a816111c9565b60ff811681146105f957600080fd5b6000602082840312156112ed57600080fd5b813561070a816112cc565b60006020808352835180602085015260005b818110156113265785810183015185820160400152820161130a565b506000604082860101526040601f19601f8301168501019250505092915050565b6020808252825182820181905260009190848201906040850190845b818110156113885783516001600160a01b031683529284019291840191600101611363565b50909695505050505050565b6000806000606084860312156113a957600080fd5b83356113b4816111c9565b925060208401356113c4816111c9565b929592945050506040919091013590565b634e487b7160e01b600052603260045260246000fd5b6000602082840312156113fd57600080fd5b815161070a816112cc565b634e487b7160e01b600052604160045260246000fd5b805180151581146105c757600080fd5b6000602080838503121561144157600080fd5b825167ffffffffffffffff8082111561145957600080fd5b818501915085601f83011261146d57600080fd5b81518181111561147f5761147f611408565b8060051b604051601f19603f830116810181811085821117156114a4576114a4611408565b6040529182528482019250838101850191888311156114c257600080fd5b938501935b828510156114e7576114d88561141e565b845293850193928501926114c7565b98975050505050505050565b634e487b7160e01b600052601160045260246000fd5b600081611518576115186114f3565b506000190190565b6020808252825482820181905260008481528281209092916040850190845b818110156113885783546001600160a01b03168352600193840193928501920161153f565b81810381811115610411576104116114f3565b6000808585111561158757600080fd5b8386111561159457600080fd5b5050820193919092039150565b6bffffffffffffffffffffffff1981358181169160148510156115ce5780818660140360031b1b83161692505b505092915050565b634e487b7160e01b600052603160045260246000fdfeb3c151d85eb431da97012a1682e6ab41bddc7db1012e7c40bd326c24bf56f99954686520726563697069656e74206973206e6f7420696e207468652077686974656c6973745468652073656e646572206973206e6f7420696e207468652077686974656c697374a2646970667358221220c9bcc22ff72080e0282cf07f741b675b81145f982e8e2d2edd186a14334e038e64736f6c63430008160033","sourceMap":"378:3013:101:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2565:202:62;;;;;;:::i;:::-;;:::i;:::-;;;470:14:139;;463:22;445:41;;433:2;418:18;2565:202:62;;;;;;;;802:86:90;;856:32;802:86;;;;;643:25:139;;;631:2;616:18;802:86:90;497:177:139;3810:120:62;;;;;;:::i;:::-;3875:7;3901:12;;;;;;;;;;:22;;;;3810:120;4226:136;;;;;;:::i;:::-;;:::i;:::-;;797:280:93;;;;;;:::i;:::-;;:::i;5328:245:62:-;;;;;;:::i;:::-;;:::i;4051:143:93:-;;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;2289:32:139;;;2271:51;;2259:2;2244:18;4051:143:93;2125:203:139;2580:194:93;;;;;;:::i;:::-;;:::i;1830:137:66:-;;;;;;:::i;:::-;1705:17;-1:-1:-1;;;;;1929:31:66;;;;;;;1830:137;490:60:106;;548:2;490:60;;;;;3102:4:139;3090:17;;;3072:36;;3060:2;3045:18;490:60:106;2930:184:139;666:98:90;;-1:-1:-1;;;;;;;;;;;666:98:90;;511:274:110;;;;;;:::i;:::-;;:::i;1622:107:66:-;1705:17;1622:107;;977:447:110;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;3706:190:93:-;;;;;;:::i;:::-;;:::i;1163:115::-;;;:::i;3432:120::-;3522:16;:23;3432:120;;2854:136:62;;;;;;:::i;:::-;;:::i;2187:49::-;;2232:4;2187:49;;4282:153:93;;;:::i;:::-;;;;;;;:::i;418:355:109:-;;;;;;:::i;:::-;;:::i;1963:217:93:-;;;;;;:::i;:::-;;:::i;1284:1247:101:-;;;;;;:::i;:::-;;:::i;4642:138:62:-;;;;;;:::i;:::-;;:::i;556:58:106:-;;612:2;556:58;;2565:202:62;2650:4;-1:-1:-1;;;;;;2673:47:62;;-1:-1:-1;;;2673:47:62;;:87;;-1:-1:-1;;;;;;;;;;861:40:78;;;2724:36:62;2666:94;2565:202;-1:-1:-1;;2565:202:62:o;4226:136::-;3875:7;3901:12;;;;;;;;;;:22;;;2464:16;2475:4;2464:10;:16::i;:::-;4330:25:::1;4341:4;4347:7;4330:10;:25::i;:::-;;4226:136:::0;;;:::o;797:280:93:-;-1:-1:-1;;;;;;;;;;;2464:16:62;2475:4;2464:10;:16::i;:::-;932::93::1;:23:::0;:27;928:81:::1;;975:23;:21;:23::i;:::-;1018:17;1028:6;;1018:9;:17::i;:::-;1045:25;:16;1064:6:::0;;1045:25:::1;:::i;5328:245:62:-:0;5443:12;:10;:12::i;:::-;-1:-1:-1;;;;;5421:34:62;:18;-1:-1:-1;;;;;5421:34:62;;5417:102;;5478:30;;-1:-1:-1;;;5478:30:62;;;;;;;;;;;5417:102;5529:37;5541:4;5547:18;5529:11;:37::i;:::-;;5328:245;;:::o;4051:143:93:-;4137:7;4163:16;4180:6;4163:24;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;4163:24:93;;4051:143;-1:-1:-1;;4051:143:93:o;2580:194::-;-1:-1:-1;;;;;;;;;;;2464:16:62;2475:4;2464:10;:16::i;:::-;2723:44:93::1;2753:5;2761;2723:21;:44::i;511:274:110:-:0;623:4;658:53;;;548:2:106;658:53:110;;:120;;-1:-1:-1;727:51:110;;;612:2:106;727:51:110;639:139;511:274;-1:-1:-1;;511:274:110:o;977:447::-;1086:13;-1:-1:-1;;1115:53:110;;;;1111:307;;1191:33;;;;;;;;;;;;;;;;;1184:40;977:447;-1:-1:-1;;977:447:110:o;1111:307::-;-1:-1:-1;;1245:51:110;;;;1241:177;;1319:31;;;;;;;;;;;;;;;;;1312:38;977:447;-1:-1:-1;;977:447:110:o;1241:177::-;-1:-1:-1;;1388:19:110;;;;;;;;;;;;;;;;;;977:447::o;1241:177::-;977:447;;;:::o;3706:190:93:-;3798:13;3830:59;3856:16;3882:5;3830:25;:59::i;1163:115::-;-1:-1:-1;;;;;;;;;;;2464:16:62;2475:4;2464:10;:16::i;:::-;1248:23:93::1;:21;:23::i;:::-;1163:115:::0;:::o;2854:136:62:-;2931:4;2954:12;;;;;;;;;;;-1:-1:-1;;;;;2954:29:62;;;;;;;;;;;;;;;2854:136::o;4282:153:93:-;4373:16;4412;4405:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;4405:23:93;;;;;;;;;;;;;;;;;;;;;;;4282:153;:::o;418:355:109:-;662:51;;-1:-1:-1;;;662:51:109;;-1:-1:-1;;;;;6144:15:139;;;662:51:109;;;6126:34:139;6196:15;;6176:18;;;6169:43;6228:18;;;6221:34;;;549:12:109;;;;662:4;;:30;;6061:18:139;;662:51:109;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:104;;;643:123;;418:355;;;;;;:::o;1963:217:93:-;-1:-1:-1;;;;;;;;;;;2464:16:62;2475:4;2464:10;:16::i;:::-;2080:55:93::1;2102:16;2128:5;2080:21;:55::i;:::-;2150:23;::::0;-1:-1:-1;;;;;2150:23:93;::::1;::::0;::::1;::::0;;;::::1;1963:217:::0;;:::o;1284:1247:101:-;1478:16;;;1492:1;1478:16;;;;;;;;1428:5;;;;1478:16;1492:1;1478:16;;;;;;;;-1:-1:-1;;1529:13:101;;;1540:1;1529:13;;;;;;;;1445:49;;-1:-1:-1;1504:22:101;;1529:13;;-1:-1:-1;1540:1:101;1529:13;;;;;;;;-1:-1:-1;;1575:13:101;;;1586:1;1575:13;;;;;;;;1504:38;;-1:-1:-1;1552:20:101;;1575:13;;-1:-1:-1;1586:1:101;1575:13;;;;;;;;;;-1:-1:-1;1575:13:101;1552:36;;1617:5;1598:13;1612:1;1598:16;;;;;;;;:::i;:::-;;;;;;:24;-1:-1:-1;;;;;1598:24:101;;;-1:-1:-1;;;;;1598:24:101;;;;;1651:3;1632:13;1646:1;1632:16;;;;;;;;:::i;:::-;-1:-1:-1;;;;;1632:22:101;;;:16;;;;;;;;;;;:22;1686:16;:23;1664:19;1797:478;1821:11;1817:1;:15;1797:478;;;1909:16;1926:1;1909:19;;;;;;;;:::i;:::-;;;;;;;;;;;1893:89;;-1:-1:-1;;;1893:89:101;;-1:-1:-1;;;;;1909:19:101;;;;1893:74;;:89;;1968:13;;1893:89;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;1893:89:101;;;;;;;;;;;;:::i;:::-;1882:100;;2000:8;2009:1;2000:11;;;;;;;;:::i;:::-;;;;;;;:25;;;;;2016:6;2023:1;2016:9;;;;;;;;:::i;:::-;;;;;;;2015:10;2000:25;1996:129;;;2106:4;2094:6;2101:1;2094:9;;;;;;;;:::i;:::-;:16;;;:9;;;;;;;;;;;:16;1996:129;2142:8;2151:1;2142:11;;;;;;;;:::i;:::-;;;;;;;:25;;;;;2158:6;2165:1;2158:9;;;;;;;;:::i;:::-;;;;;;;2157:10;2142:25;2138:127;;;2246:4;2234:6;2241:1;2234:9;;;;;;;;:::i;:::-;:16;;;:9;;;;;;;;;;;:16;2138:127;1834:3;;1797:478;;;;2289:6;2296:1;2289:9;;;;;;;;:::i;:::-;;;;;;;2284:241;;548:2:106;2314:40:101;;;;;;;;2284:241;2376:6;2383:1;2376:9;;;;;;;;:::i;:::-;;;;;;;2371:154;;612:2:106;2401:38:101;;;;;;;;2371:154;2483:30;2470:44;;;;;;;;4642:138:62;3875:7;3901:12;;;;;;;;;;:22;;;2464:16;2475:4;2464:10;:16::i;:::-;4747:26:::1;4759:4;4765:7;4747:11;:26::i;3199:103::-:0;3265:30;3276:4;3282:12;:10;:12::i;:::-;3265:10;:30::i;6179:316::-;6256:4;6277:22;6285:4;6291:7;6277;:22::i;:::-;6272:217;;6315:6;:12;;;;;;;;;;;-1:-1:-1;;;;;6315:29:62;;;;;;;;;:36;;-1:-1:-1;;6315:36:62;6347:4;6315:36;;;6397:12;:10;:12::i;:::-;-1:-1:-1;;;;;6370:40:62;6388:7;-1:-1:-1;;;;;6370:40:62;6382:4;6370:40;;;;;;;;;;-1:-1:-1;6431:4:62;6424:11;;6272:217;-1:-1:-1;6473:5:62;6466:12;;1364:444:93;1528:16;:23;1416:13;;1511:248;1553:5;;1511:248;;1666:1;1662;:5;1654:13;;1695:53;1717:16;1734:5;1717:23;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;1717:23:93;1742:5;1695:21;:53::i;:::-;1560:3;;;:::i;:::-;;;1511:248;;;;1773:28;1784:16;1773:28;;;;;;:::i;:::-;;;;;;;;1406:402;1364:444::o;596:600:94:-;682:1;665:18;;;661:81;;706:25;;-1:-1:-1;;;706:25:94;;;;;;;;;;;661:81;756:9;751:439;771:17;;;751:439;;;840:3;818:6;;825:1;818:9;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;810:34:94;;806:118;;871:38;;-1:-1:-1;;;871:38:94;;;;;;;;;;;806:118;941:14;:25;956:6;;963:1;956:9;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;941:25:94;;;;;;;;;;;;-1:-1:-1;941:25:94;;;;937:101;;;993:30;;-1:-1:-1;;;993:30:94;;;;;;;;;;;937:101;1079:4;1051:14;:25;1066:6;;1073:1;1066:9;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;1051:25:94;;;;;;;;;;;;-1:-1:-1;1051:25:94;:32;;-1:-1:-1;;1051:32:94;;;;;;;;;;1110:6;;1117:1;1110:9;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;1102:18:94;;;;;;;;;;;1162:3;;751:439;;2632:182:101;2743:14;2780:27;:25;:27::i;:::-;2773:34;;2632:182;:::o;6730:317:62:-;6808:4;6828:22;6836:4;6842:7;6828;:22::i;:::-;6824:217;;;6898:5;6866:12;;;;;;;;;;;-1:-1:-1;;;;;6866:29:62;;;;;;;;;:37;;-1:-1:-1;;6866:37:62;;;6949:12;:10;:12::i;:::-;-1:-1:-1;;;;;6922:40:62;6940:7;-1:-1:-1;;;;;6922:40:62;6934:4;6922:40;;;;;;;;;;-1:-1:-1;6983:4:62;6976:11;;3174:184:93;3254:56;3279:16;3297:5;3304;3254:24;:56::i;:::-;3325:26;;-1:-1:-1;;;;;3325:26:93;;;;;;;;3174:184;;:::o;2668:413:94:-;2823:13;;2776;;2846:199;2870:11;2862:5;:19;2846:199;;;2920:5;-1:-1:-1;;;;;2903:22:94;:6;2910:5;2903:13;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;2903:13:94;:22;2899:73;;2945:12;;;2899:73;3013:7;;;;;2846:199;;;-1:-1:-1;;3061:13:94;;;2668:413;-1:-1:-1;2668:413:94:o;1351:354::-;-1:-1:-1;;;;;1433:30:94;;1429:106;;1486:38;;-1:-1:-1;;;1486:38:94;;;;;;;;;;;1429:106;-1:-1:-1;;;;;1548:21:94;;;;;;:14;:21;;;;;;;;1544:89;;;1592:30;;-1:-1:-1;;;1592:30:94;;;;;;;;;;;1544:89;1642:18;;;;;;;;-1:-1:-1;1642:18:94;;;;;;;;;;;;-1:-1:-1;;;;;1642:18:94;;;-1:-1:-1;;;;;;1642:18:94;;;;;;;1670:21;;;;;;;;;;:28;;-1:-1:-1;;1670:28:94;;;;;;1351:354::o;3432:197:62:-;3520:22;3528:4;3534:7;3520;:22::i;:::-;3515:108;;3565:47;;-1:-1:-1;;;3565:47:62;;-1:-1:-1;;;;;9098:32:139;;3565:47:62;;;9080:51:139;9147:18;;;9140:34;;;9053:18;;3565:47:62;;;;;;;3515:108;3432:197;;:::o;2204:429:66:-;2266:7;2310:8;3481:2;2420:10;-1:-1:-1;;;;;1705:17:66;1929:31;;2401:71;;;;;2453:19;2435:14;:37;;2401:71;2397:230;;;2511:8;;2520:36;2537:19;2520:14;:36;:::i;:::-;2511:47;;;;;:::i;:::-;2503:56;;;:::i;:::-;2495:65;;2488:72;;;;2204:429;:::o;2397:230::-;735:10:73;2591:25:66;;;;2204:429;:::o;2105:419:94:-;2252:5;-1:-1:-1;;;;;2235:22:94;:6;2242:5;2235:13;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;2235:13:94;:22;2231:87;;2280:27;;-1:-1:-1;;;2280:27:94;;;;;;;;;;;2231:87;2340:13;;:17;;2356:1;;2340:17;:::i;:::-;2331:5;:26;2327:98;;2396:13;;2389:6;;2396:17;;2412:1;;2396:17;:::i;:::-;2389:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;2389:25:94;2373:6;2380:5;2373:13;;;;;;;;:::i;:::-;;;;;;;;;:41;;;;;-1:-1:-1;;;;;2373:41:94;;;;;-1:-1:-1;;;;;2373:41:94;;;;;;2327:98;2434:6;:12;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;2434:12:94;;;;;-1:-1:-1;;;;;;2434:12:94;;;;;;;;;-1:-1:-1;;;;;2456:21:94;;;;;2434:12;2456:21;;;;;;;:29;;-1:-1:-1;;2456:29:94;;;2500:17;2456:21;;2500:17;;;2105:419;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:286:139;72:6;125:2;113:9;104:7;100:23;96:32;93:52;;;141:1;138;131:12;93:52;167:23;;-1:-1:-1;;;;;;219:32:139;;209:43;;199:71;;266:1;263;256:12;679:180;738:6;791:2;779:9;770:7;766:23;762:32;759:52;;;807:1;804;797:12;759:52;-1:-1:-1;830:23:139;;679:180;-1:-1:-1;679:180:139:o;864:131::-;-1:-1:-1;;;;;939:31:139;;929:42;;919:70;;985:1;982;975:12;1000:315;1068:6;1076;1129:2;1117:9;1108:7;1104:23;1100:32;1097:52;;;1145:1;1142;1135:12;1097:52;1181:9;1168:23;1158:33;;1241:2;1230:9;1226:18;1213:32;1254:31;1279:5;1254:31;:::i;:::-;1304:5;1294:15;;;1000:315;;;;;:::o;1320:615::-;1406:6;1414;1467:2;1455:9;1446:7;1442:23;1438:32;1435:52;;;1483:1;1480;1473:12;1435:52;1523:9;1510:23;1552:18;1593:2;1585:6;1582:14;1579:34;;;1609:1;1606;1599:12;1579:34;1647:6;1636:9;1632:22;1622:32;;1692:7;1685:4;1681:2;1677:13;1673:27;1663:55;;1714:1;1711;1704:12;1663:55;1754:2;1741:16;1780:2;1772:6;1769:14;1766:34;;;1796:1;1793;1786:12;1766:34;1849:7;1844:2;1834:6;1831:1;1827:14;1823:2;1819:23;1815:32;1812:45;1809:65;;;1870:1;1867;1860:12;1809:65;1901:2;1893:11;;;;;1923:6;;-1:-1:-1;1320:615:139;;-1:-1:-1;;;;1320:615:139:o;2333:340::-;2426:6;2434;2487:2;2475:9;2466:7;2462:23;2458:32;2455:52;;;2503:1;2500;2493:12;2455:52;2542:9;2529:23;2561:31;2586:5;2561:31;:::i;:::-;2611:5;2663:2;2648:18;;;;2635:32;;-1:-1:-1;;;2333:340:139:o;2678:247::-;2737:6;2790:2;2778:9;2769:7;2765:23;2761:32;2758:52;;;2806:1;2803;2796:12;2758:52;2845:9;2832:23;2864:31;2889:5;2864:31;:::i;3119:114::-;3203:4;3196:5;3192:16;3185:5;3182:27;3172:55;;3223:1;3220;3213:12;3238:243;3295:6;3348:2;3336:9;3327:7;3323:23;3319:32;3316:52;;;3364:1;3361;3354:12;3316:52;3403:9;3390:23;3422:29;3445:5;3422:29;:::i;3486:548::-;3598:4;3627:2;3656;3645:9;3638:21;3688:6;3682:13;3731:6;3726:2;3715:9;3711:18;3704:34;3756:1;3766:140;3780:6;3777:1;3774:13;3766:140;;;3875:14;;;3871:23;;3865:30;3841:17;;;3860:2;3837:26;3830:66;3795:10;;3766:140;;;3770:3;3955:1;3950:2;3941:6;3930:9;3926:22;3922:31;3915:42;4025:2;4018;4014:7;4009:2;4001:6;3997:15;3993:29;3982:9;3978:45;3974:54;3966:62;;;;3486:548;;;;:::o;4498:658::-;4669:2;4721:21;;;4791:13;;4694:18;;;4813:22;;;4640:4;;4669:2;4892:15;;;;4866:2;4851:18;;;4640:4;4935:195;4949:6;4946:1;4943:13;4935:195;;;5014:13;;-1:-1:-1;;;;;5010:39:139;4998:52;;5105:15;;;;5070:12;;;;5046:1;4964:9;4935:195;;;-1:-1:-1;5147:3:139;;4498:658;-1:-1:-1;;;;;;4498:658:139:o;5161:456::-;5238:6;5246;5254;5307:2;5295:9;5286:7;5282:23;5278:32;5275:52;;;5323:1;5320;5313:12;5275:52;5362:9;5349:23;5381:31;5406:5;5381:31;:::i;:::-;5431:5;-1:-1:-1;5488:2:139;5473:18;;5460:32;5501:33;5460:32;5501:33;:::i;:::-;5161:456;;5553:7;;-1:-1:-1;;;5607:2:139;5592:18;;;;5579:32;;5161:456::o;5622:127::-;5683:10;5678:3;5674:20;5671:1;5664:31;5714:4;5711:1;5704:15;5738:4;5735:1;5728:15;6266:247;6334:6;6387:2;6375:9;6366:7;6362:23;6358:32;6355:52;;;6403:1;6400;6393:12;6355:52;6435:9;6429:16;6454:29;6477:5;6454:29;:::i;6518:127::-;6579:10;6574:3;6570:20;6567:1;6560:31;6610:4;6607:1;6600:15;6634:4;6631:1;6624:15;6650:164;6726:13;;6775;;6768:21;6758:32;;6748:60;;6804:1;6801;6794:12;6819:1123;6911:6;6942:2;6985;6973:9;6964:7;6960:23;6956:32;6953:52;;;7001:1;6998;6991:12;6953:52;7034:9;7028:16;7063:18;7104:2;7096:6;7093:14;7090:34;;;7120:1;7117;7110:12;7090:34;7158:6;7147:9;7143:22;7133:32;;7203:7;7196:4;7192:2;7188:13;7184:27;7174:55;;7225:1;7222;7215:12;7174:55;7254:2;7248:9;7276:2;7272;7269:10;7266:36;;;7282:18;;:::i;:::-;7328:2;7325:1;7321:10;7360:2;7354:9;7423:2;7419:7;7414:2;7410;7406:11;7402:25;7394:6;7390:38;7478:6;7466:10;7463:22;7458:2;7446:10;7443:18;7440:46;7437:72;;;7489:18;;:::i;:::-;7525:2;7518:22;7575:18;;;7609:15;;;;-1:-1:-1;7651:11:139;;;7647:20;;;7679:19;;;7676:39;;;7711:1;7708;7701:12;7676:39;7735:11;;;;7755:156;7771:6;7766:3;7763:15;7755:156;;;7837:31;7864:3;7837:31;:::i;:::-;7825:44;;7788:12;;;;7889;;;;7755:156;;;7930:6;6819:1123;-1:-1:-1;;;;;;;;6819:1123:139:o;7947:127::-;8008:10;8003:3;7999:20;7996:1;7989:31;8039:4;8036:1;8029:15;8063:4;8060:1;8053:15;8079:136;8118:3;8146:5;8136:39;;8155:18;;:::i;:::-;-1:-1:-1;;;8191:18:139;;8079:136::o;8220:681::-;8388:2;8440:21;;;8510:13;;8413:18;;;8532:22;;;8359:4;8597:17;;;8637:16;;;8359:4;;8388:2;8585;8570:18;;;8359:4;8681:194;8695:6;8692:1;8689:13;8681:194;;;8760:13;;-1:-1:-1;;;;;8756:39:139;8744:52;;8792:1;8851:14;;;;8816:12;;;;8710:9;8681:194;;9185:128;9252:9;;;9273:11;;;9270:37;;;9287:18;;:::i;9318:331::-;9423:9;9434;9476:8;9464:10;9461:24;9458:44;;;9498:1;9495;9488:12;9458:44;9527:6;9517:8;9514:20;9511:40;;;9547:1;9544;9537:12;9511:40;-1:-1:-1;;9573:23:139;;;9618:25;;;;;-1:-1:-1;9318:331:139:o;9654:337::-;-1:-1:-1;;9775:19:139;;9862:11;;;;9893:2;9885:11;;9882:103;;;9972:2;9966;9959:3;9955:2;9951:12;9948:1;9944:20;9940:29;9936:2;9932:38;9928:47;9919:56;;9882:103;;;9654:337;;;;:::o;9996:127::-;10057:10;10052:3;10048:20;10045:1;10038:31;10088:4;10085:1;10078:15;10112:4;10109:1;10102:15","linkReferences":{},"immutableReferences":{"54247":[{"start":641,"length":32},{"start":757,"length":32},{"start":3911,"length":32}]}},"methodIdentifiers":{"CODE_ADDRESS_FROM_NOT_WHITELISTED()":"5b119c0a","CODE_ADDRESS_TO_NOT_WHITELISTED()":"db136dad","DEFAULT_ADMIN_ROLE()":"a217fddf","RULE_ENGINE_OPERATOR_ROLE()":"6728f545","TOKEN_CONTRACT_ROLE()":"0fbbfb55","addRuleValidation(address)":"cd1d4dc7","canReturnTransferRestrictionCode(uint8)":"7d045df6","clearRulesValidation()":"8a1b6c8e","detectTransferRestriction(address,address,uint256)":"d4ce1415","getRoleAdmin(bytes32)":"248a9ca3","getRuleIndexValidation(address)":"83304df0","grantRole(bytes32,address)":"2f2ff15d","hasRole(bytes32,address)":"91d14854","isTrustedForwarder(address)":"572b6c05","messageForTransferRestriction(uint8)":"7f4ab1dd","removeRuleValidation(address,uint256)":"4d53374e","renounceRole(bytes32,address)":"36568abe","revokeRole(bytes32,address)":"d547741f","ruleValidation(uint256)":"397a7d3c","rulesCountValidation()":"8a2021b1","rulesValidation()":"c57086a1","setRulesValidation(address[])":"334a29cc","supportsInterface(bytes4)":"01ffc9a7","trustedForwarder()":"7da0a877","validateTransfer(address,address,uint256)":"c6946a12"},"rawMetadata":"{\"compiler\":{\"version\":\"0.8.22+commit.4fc1097e\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"admin\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"forwarderIrrevocable\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"AccessControlBadConfirmation\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"bytes32\",\"name\":\"neededRole\",\"type\":\"bytes32\"}],\"name\":\"AccessControlUnauthorizedAccount\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"RuleEngine_AdminWithAddressZeroNotAllowed\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"RuleEngine_ArrayIsEmpty\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"RuleEngine_RuleAddressZeroNotAllowed\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"RuleEngine_RuleAlreadyExists\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"RuleEngine_RuleDoNotMatch\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"rule\",\"type\":\"address\"}],\"name\":\"AddRule\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address[]\",\"name\":\"rulesRemoved\",\"type\":\"address[]\"}],\"name\":\"ClearRules\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"rule\",\"type\":\"address\"}],\"name\":\"RemoveRule\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"previousAdminRole\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"newAdminRole\",\"type\":\"bytes32\"}],\"name\":\"RoleAdminChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"RoleGranted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"RoleRevoked\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"CODE_ADDRESS_FROM_NOT_WHITELISTED\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"CODE_ADDRESS_TO_NOT_WHITELISTED\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"DEFAULT_ADMIN_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"RULE_ENGINE_OPERATOR_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"TOKEN_CONTRACT_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract IRuleValidation\",\"name\":\"rule_\",\"type\":\"address\"}],\"name\":\"addRuleValidation\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint8\",\"name\":\"_restrictionCode\",\"type\":\"uint8\"}],\"name\":\"canReturnTransferRestrictionCode\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"clearRulesValidation\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"detectTransferRestriction\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"}],\"name\":\"getRoleAdmin\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract IRuleValidation\",\"name\":\"rule_\",\"type\":\"address\"}],\"name\":\"getRuleIndexValidation\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"grantRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"hasRole\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"forwarder\",\"type\":\"address\"}],\"name\":\"isTrustedForwarder\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint8\",\"name\":\"_restrictionCode\",\"type\":\"uint8\"}],\"name\":\"messageForTransferRestriction\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract IRuleValidation\",\"name\":\"rule_\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"}],\"name\":\"removeRuleValidation\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"callerConfirmation\",\"type\":\"address\"}],\"name\":\"renounceRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"revokeRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"ruleId\",\"type\":\"uint256\"}],\"name\":\"ruleValidation\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"rulesCountValidation\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"rulesValidation\",\"outputs\":[{\"internalType\":\"address[]\",\"name\":\"\",\"type\":\"address[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"rules_\",\"type\":\"address[]\"}],\"name\":\"setRulesValidation\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"supportsInterface\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"trustedForwarder\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_amount\",\"type\":\"uint256\"}],\"name\":\"validateTransfer\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"isValid\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"errors\":{\"AccessControlBadConfirmation()\":[{\"details\":\"The caller of a function is not the expected one. NOTE: Don't confuse with {AccessControlUnauthorizedAccount}.\"}],\"AccessControlUnauthorizedAccount(address,bytes32)\":[{\"details\":\"The `account` is missing a role.\"}]},\"events\":{\"RoleAdminChanged(bytes32,bytes32,bytes32)\":{\"details\":\"Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite {RoleAdminChanged} not being emitted signaling this.\"},\"RoleGranted(bytes32,address,address)\":{\"details\":\"Emitted when `account` is granted `role`. `sender` is the account that originated the contract call, an admin role bearer except when using {AccessControl-_setupRole}.\"},\"RoleRevoked(bytes32,address,address)\":{\"details\":\"Emitted when `account` is revoked `role`. `sender` is the account that originated the contract call:   - if using `revokeRole`, it is the admin role bearer   - if using `renounceRole`, it is the role bearer (i.e. `account`)\"}},\"kind\":\"dev\",\"methods\":{\"canReturnTransferRestrictionCode(uint8)\":{\"params\":{\"_restrictionCode\":\"The target restriction code\"},\"returns\":{\"_0\":\"true if the restriction code is known, false otherwise*\"}},\"constructor\":{\"params\":{\"admin\":\"Address of the contract (Access Control)\",\"forwarderIrrevocable\":\"Address of the forwarder, required for the gasless support\"}},\"detectTransferRestriction(address,address,uint256)\":{\"params\":{\"_from\":\"the origin address\",\"_to\":\"the destination address\"},\"returns\":{\"_0\":\"The restricion code or REJECTED_CODE_BASE.TRANSFER_OK*\"}},\"getRoleAdmin(bytes32)\":{\"details\":\"Returns the admin role that controls `role`. See {grantRole} and {revokeRole}. To change a role's admin, use {_setRoleAdmin}.\"},\"getRuleIndexValidation(address)\":{\"returns\":{\"index\":\"if the rule is found, _rulesValidation.length otherwise\"}},\"grantRole(bytes32,address)\":{\"details\":\"Grants `role` to `account`. If `account` had not been already granted `role`, emits a {RoleGranted} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleGranted} event.\"},\"hasRole(bytes32,address)\":{\"details\":\"Returns `true` if `account` has been granted `role`.\"},\"isTrustedForwarder(address)\":{\"details\":\"Indicates whether any particular address is the trusted forwarder.\"},\"messageForTransferRestriction(uint8)\":{\"params\":{\"_restrictionCode\":\"The target restriction code\"},\"returns\":{\"_0\":\"true if the transfer is valid, false otherwise*\"}},\"removeRuleValidation(address,uint256)\":{\"details\":\"To reduce the array size, the last rule is moved to the location occupied by the rule to remove\",\"params\":{\"index\":\"the position inside the array of rule\",\"rule_\":\"address of the target rule\"}},\"renounceRole(bytes32,address)\":{\"details\":\"Revokes `role` from the calling account. Roles are often managed via {grantRole} and {revokeRole}: this function's purpose is to provide a mechanism for accounts to lose their privileges if they are compromised (such as when a trusted device is misplaced). If the calling account had been revoked `role`, emits a {RoleRevoked} event. Requirements: - the caller must be `callerConfirmation`. May emit a {RoleRevoked} event.\"},\"revokeRole(bytes32,address)\":{\"details\":\"Revokes `role` from `account`. If `account` had been granted `role`, emits a {RoleRevoked} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleRevoked} event.\"},\"ruleValidation(uint256)\":{\"params\":{\"ruleId\":\"index of the rule\"},\"returns\":{\"_0\":\"a rule address\"}},\"rulesCountValidation()\":{\"returns\":{\"_0\":\"The number of rules inside the array\"}},\"rulesValidation()\":{\"returns\":{\"_0\":\"An array of rules\"}},\"setRulesValidation(address[])\":{\"details\":\"take address[] instead of IRuleEngineValidation[] since it is not possible to cast IRuleEngineValidation[] -> address[]\"},\"supportsInterface(bytes4)\":{\"details\":\"See {IERC165-supportsInterface}.\"},\"trustedForwarder()\":{\"details\":\"Returns the address of the trusted forwarder.\"},\"validateTransfer(address,address,uint256)\":{\"params\":{\"_amount\":\"to transfer\",\"_from\":\"the origin address\",\"_to\":\"the destination address\"},\"returns\":{\"isValid\":\"=> true if the transfer is valid, false otherwise*\"}}},\"title\":\"Wrapper to call several different whitelist rules\",\"version\":1},\"userdoc\":{\"events\":{\"AddRule(address)\":{\"notice\":\"Generate when a rule is added\"},\"ClearRules(address[])\":{\"notice\":\"Generate when all the rules are cleared\"},\"RemoveRule(address)\":{\"notice\":\"Generate when a rule is removed\"}},\"kind\":\"user\",\"methods\":{\"RULE_ENGINE_OPERATOR_ROLE()\":{\"notice\":\"Role to manage the ruleEngine\"},\"TOKEN_CONTRACT_ROLE()\":{\"notice\":\"token contract\"},\"addRuleValidation(address)\":{\"notice\":\"Add a rule to the array of rules Revert if one rule is a zero address or if the rule is already present\"},\"canReturnTransferRestrictionCode(uint8)\":{\"notice\":\"To know if the restriction code is valid for this rule or not\"},\"clearRulesValidation()\":{\"notice\":\"Clear all the rules of the array of rules\"},\"detectTransferRestriction(address,address,uint256)\":{\"notice\":\"Go through all the whitelist rules to know if a restriction exists on the transfer\"},\"getRuleIndexValidation(address)\":{\"notice\":\"Get the index of a rule inside the list\"},\"messageForTransferRestriction(uint8)\":{\"notice\":\"Return the corresponding message\"},\"removeRuleValidation(address,uint256)\":{\"notice\":\"Remove a rule from the array of rules Revert if the rule found at the specified index does not match the rule in argument\"},\"ruleValidation(uint256)\":{\"notice\":\"Get the rule at the position specified by ruleId\"},\"rulesValidation()\":{\"notice\":\"Get all the rules\"},\"setRulesValidation(address[])\":{\"notice\":\"Set all the rules, will overwrite all the previous rules. \\\\n Revert if one rule is a zero address or if the rule is already present\"},\"validateTransfer(address,address,uint256)\":{\"notice\":\"Validate a transfer\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"src/rules/validation/RuleWhitelistWrapper.sol\":\"RuleWhitelistWrapper\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[\":@openzeppelin/contracts/=lib/openzeppelin-contracts/contracts/\",\":CMTAT/=lib/CMTAT/contracts/\",\":OZ/=lib/openzeppelin-contracts/contracts/\",\":ds-test/=lib/openzeppelin-contracts/lib/forge-std/lib/ds-test/src/\",\":erc4626-tests/=lib/openzeppelin-contracts/lib/erc4626-tests/\",\":forge-std/=lib/forge-std/src/\",\":openzeppelin-contracts/=lib/openzeppelin-contracts/\"]},\"sources\":{\"lib/CMTAT/contracts/interfaces/draft-IERC1404/draft-IERC1404.sol\":{\"keccak256\":\"0xfba123f04b693467a10bffcc3d30c8ee0a55a159d1a50a9e6ad7efa6a08ad9ad\",\"license\":\"MPL-2.0\",\"urls\":[\"bzz-raw://f0af9bead272c5af8153932efe6e464485aa27c82a2a5c79ed94e780ec373da0\",\"dweb:/ipfs/QmZJj9B5sBDGY8b5qbFkadmQ377xugKwGoxkHPWW3BpnWg\"]},\"lib/CMTAT/contracts/interfaces/draft-IERC1404/draft-IERC1404EnumCode.sol\":{\"keccak256\":\"0x5162820d851ed01a9ce5e0b28b58b4dfa6262d010e0f112ca1dd1867b37600ed\",\"license\":\"MPL-2.0\",\"urls\":[\"bzz-raw://599cbb744369ec114f918eec3f462d0f2f0a33bab292683be34098bf98b31423\",\"dweb:/ipfs/QmTSYGzsUDicQ5jCu88r2XnRqFyS5nJqfPGiz4q3aL35mx\"]},\"lib/CMTAT/contracts/interfaces/draft-IERC1404/draft-IERC1404Wrapper.sol\":{\"keccak256\":\"0xefa53aa4e697f2fd338b56888c9492392100a146ccd7a2c107cbd189f5c99ea3\",\"license\":\"MPL-2.0\",\"urls\":[\"bzz-raw://a7a5933297a01300d5eb8baa49cce9c98c5f3779e329f4ac41dae6e128bdf68e\",\"dweb:/ipfs/QmcDMxLHuuc7n8dVw6PWtQaRrkqMrtQUoBt4XKeNHF69mF\"]},\"lib/openzeppelin-contracts/contracts/access/AccessControl.sol\":{\"keccak256\":\"0xa0e92d42942f4f57c5be50568dac11e9d00c93efcb458026e18d2d9b9b2e7308\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://46326c0bb1e296b67185e81c918e0b40501b8b6386165855df0a3f3c634b6a80\",\"dweb:/ipfs/QmTwyrDYtsxsk6pymJTK94PnEpzsmkpUxFuzEiakDopy4Z\"]},\"lib/openzeppelin-contracts/contracts/access/IAccessControl.sol\":{\"keccak256\":\"0xb6b36edd6a2999fd243ff226d6cbf84bd71af2432bbd0dfe19392996a1d9cb41\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://1fd2f35495652e57e3f99bc6c510bc5f7dd398a176ea2e72d8ed730aebc6ca26\",\"dweb:/ipfs/QmTQV6X4gkikTib49cho5iDX3JvSQbdsoEChoDwrk3CbbH\"]},\"lib/openzeppelin-contracts/contracts/metatx/ERC2771Context.sol\":{\"keccak256\":\"0x98256cf37b71a69b2f5a8a6fe975ea03590dff703102bd141a830f94e8adebf6\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://6251fe1f6a1e45e6d619d150c123afc88b8646b38ee26a136efa9a6988a31d3f\",\"dweb:/ipfs/QmeXDT85wSZdP31wkz3ah3KhponCiksJLP5o2LR5e1JxcK\"]},\"lib/openzeppelin-contracts/contracts/utils/Context.sol\":{\"keccak256\":\"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://6a708e8a5bdb1011c2c381c9a5cfd8a9a956d7d0a9dc1bd8bcdaf52f76ef2f12\",\"dweb:/ipfs/Qmax9WHBnVsZP46ZxEMNRQpLQnrdE4dK8LehML1Py8FowF\"]},\"lib/openzeppelin-contracts/contracts/utils/introspection/ERC165.sol\":{\"keccak256\":\"0x9e8778b14317ba9e256c30a76fd6c32b960af621987f56069e1e819c77c6a133\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://1777404f1dcd0fac188e55a288724ec3c67b45288e49cc64723e95e702b49ab8\",\"dweb:/ipfs/QmZFdC626GButBApwDUvvTnUzdinevC3B24d7yyh57XkiA\"]},\"lib/openzeppelin-contracts/contracts/utils/introspection/IERC165.sol\":{\"keccak256\":\"0x4296879f55019b23e135000eb36896057e7101fb7fb859c5ef690cf14643757b\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://87b3541437c8c443ccd36795e56a338ed12855eec17f8da624511b8d1a7e14df\",\"dweb:/ipfs/QmeJQCtZrQjtJLr6u7ZHWeH3pBnjtLWzvRrKViAi7UZqxL\"]},\"src/interfaces/IRuleEngineValidation.sol\":{\"keccak256\":\"0x19f9b71580dddb20a29570bff88f711abf0c8aec18bd563643764aa37355eac1\",\"license\":\"MPL-2.0\",\"urls\":[\"bzz-raw://4a48e1abaa9d740c88bb33958b2227b1d98723a357fe35a6cc3a2843b00cdc20\",\"dweb:/ipfs/QmVaEQQhH522tKEJLizmFDuTeAyxb8bZP7byHpfNxwSmyT\"]},\"src/interfaces/IRuleValidation.sol\":{\"keccak256\":\"0x6b23f8d7355937f0d304ceb498f661b004d1969f87782af7588a960273af38a1\",\"license\":\"MPL-2.0\",\"urls\":[\"bzz-raw://b9c92ca4ce23304474c8236dd37c60f2c98627ca2a6156eb2ce0767436f40fa9\",\"dweb:/ipfs/QmZMkCu57MjUXjN5TtkhDGgM9RzGQpTX3uD79P1M9Vn2G8\"]},\"src/modules/MetaTxModuleStandalone.sol\":{\"keccak256\":\"0x32423330fbd140fb87b7f3c9f004db3eb7256f0f8c15b76be26ff14ba81edba0\",\"license\":\"MPL-2.0\",\"urls\":[\"bzz-raw://af6e6cfd9ccb587283b8379965a76143a27aaa38115191db1bbb1a5632eb4a25\",\"dweb:/ipfs/QmTdaEc78NfG9wJRYErsCZajvNF8ozLaqEfNyzi7Fu1fMj\"]},\"src/modules/RuleEngineInvariantStorage.sol\":{\"keccak256\":\"0x09093b1b80c8fd27ef80aaec46522ec5525aebcdb0fe77231821197d6fe7a1a0\",\"license\":\"MPL-2.0\",\"urls\":[\"bzz-raw://4939364678439e43818b1efb114b662219629b5945ecd98b1e39eca64d46dc44\",\"dweb:/ipfs/QmSikHEsDZy8hzyQ33N3AhiM25S7pCFEmqADZxK53FpCDq\"]},\"src/modules/RuleEngineValidationCommon.sol\":{\"keccak256\":\"0xf1d0fdd62ba10b81918a6749e1fcf9f020b298a8179a1cf6c849fe0aaa5edddb\",\"license\":\"MPL-2.0\",\"urls\":[\"bzz-raw://57ae96630675750b371656a3e9ce3a5b1e2ce16327d3e292b934def1b85c8a1d\",\"dweb:/ipfs/QmZm9obyXiMCJzLPNCvvtN9QogngmRnkZJmBke2bc79Jgk\"]},\"src/modules/RuleInternal.sol\":{\"keccak256\":\"0xa6d2f8844062b318c31cb97570b840ac2faa50111564c97b7190bcadcab4419c\",\"license\":\"MPL-2.0\",\"urls\":[\"bzz-raw://878b4ba012b1c46973bb50018973a90ea6b700706a2ae52b0bae7d240df510b3\",\"dweb:/ipfs/QmdRjwxgoo4xc3JmyAirRbbLupKVZ51r67e1D93bTFSF6A\"]},\"src/rules/validation/RuleWhitelistWrapper.sol\":{\"keccak256\":\"0x98dea2f3986bd3490f2ba10dc027cdcb8fe7b5f0f4b21ab47f72fb5eb1bad785\",\"license\":\"MPL-2.0\",\"urls\":[\"bzz-raw://e777ea68de9b49e8193d94d0255de3949cfd237507016ced64870431eef36644\",\"dweb:/ipfs/QmawDNARGnscDspWEdN7nLKVGVwFpNwa13vCKVXdrUGxpc\"]},\"src/rules/validation/abstract/RuleAddressList/RuleAddressList.sol\":{\"keccak256\":\"0x062f188bd35d2e2ca224c7a5b576c5720275e5175d3fa3ffd9ab896dcf21c400\",\"license\":\"MPL-2.0\",\"urls\":[\"bzz-raw://fa847c271016bae89e056f66898f4fba411b348bb312face86c94758f8a378ac\",\"dweb:/ipfs/QmPGHHbsmxVgL7tcc77qNVMfxtESgnYqrvdLqxGXdXw2bM\"]},\"src/rules/validation/abstract/RuleAddressList/RuleAddressListInternal.sol\":{\"keccak256\":\"0x4fe41635bb8060e980ed5d9847afd0f2bb89c64501254bea619e65a727ba67b6\",\"license\":\"MPL-2.0\",\"urls\":[\"bzz-raw://e0e417e96caa101c0a8a6a25944c89d9690cd166680dd298918e4819f415c531\",\"dweb:/ipfs/QmPJeFJW8g4dzfHU81Kt5kfLBgVWevChUzArFSjh5iDVR8\"]},\"src/rules/validation/abstract/RuleAddressList/invariantStorage/RuleAddressListInvariantStorage.sol\":{\"keccak256\":\"0x56c9ca1310dccae89d1019b5a9041fcd11f8344656221995fe2fbc4d095b37c3\",\"license\":\"MPL-2.0\",\"urls\":[\"bzz-raw://ce143c19d8c1d192e4fddabb32be213caef4c6bfa19dcf79f3ae6a6cc518a1b7\",\"dweb:/ipfs/Qmbn9wRsiRybULTaKqBkPWe6SEbbfKVRttD1mi2cb8RznB\"]},\"src/rules/validation/abstract/RuleAddressList/invariantStorage/RuleWhitelistInvariantStorage.sol\":{\"keccak256\":\"0x39a4b0b5ef4d03b32e826c67c0244bd0bdc803656e6f7d2301c395b7a3bd5bb2\",\"license\":\"MPL-2.0\",\"urls\":[\"bzz-raw://5c6222cc7a6e87d1bd11c5989c83ee6bf09dca003c3002845dbf41a4b694246e\",\"dweb:/ipfs/QmXQy7odhSupb6BjG1T1KjbmaLs7mcBrag7Sn3cp2JGUyb\"]},\"src/rules/validation/abstract/RuleCommonInvariantStorage.sol\":{\"keccak256\":\"0xea52693dfabf31d5b94201b78ba04cd4e7f9985b616965530317dcb25c59b678\",\"license\":\"MPL-2.0\",\"urls\":[\"bzz-raw://c6a24a2b31405e5511548afd5dca62ea8670a71ebb7fce8604637609ff320749\",\"dweb:/ipfs/QmUDXyeySu8nBRyTWGxdrTs4NC813F5w9PyBTgMs9Y7N7u\"]},\"src/rules/validation/abstract/RuleValidateTransfer.sol\":{\"keccak256\":\"0xd843208b93b04efb86fc20e5f0f8b1a725a6402fcbe5836aadf652c9804b749b\",\"license\":\"MPL-2.0\",\"urls\":[\"bzz-raw://2ce6f485b6d7c43e823fe0add5b894c252dbc36e61143df6e4a00c1bd12dc1cd\",\"dweb:/ipfs/QmQaKkmwo8UacTADjRh9ebj1B8CCjpLRfHoUt3xMcDYhAt\"]},\"src/rules/validation/abstract/RuleWhitelistCommon.sol\":{\"keccak256\":\"0xbab37a174342a2a1d3343bb575b5e85450f662973f8c06cba6103f4071480c7c\",\"license\":\"MPL-2.0\",\"urls\":[\"bzz-raw://a45604ae07b94bec85e15b9d79d24b3ba98d8fed9eebee4e3769da215be1022c\",\"dweb:/ipfs/QmNsESHhPwpHpJiuYiFRADLXGyUuKZmXrGVMcVvt8XyALZ\"]}},\"version\":1}","metadata":{"compiler":{"version":"0.8.22+commit.4fc1097e"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"address","name":"admin","type":"address"},{"internalType":"address","name":"forwarderIrrevocable","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"type":"error","name":"AccessControlBadConfirmation"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bytes32","name":"neededRole","type":"bytes32"}],"type":"error","name":"AccessControlUnauthorizedAccount"},{"inputs":[],"type":"error","name":"RuleEngine_AdminWithAddressZeroNotAllowed"},{"inputs":[],"type":"error","name":"RuleEngine_ArrayIsEmpty"},{"inputs":[],"type":"error","name":"RuleEngine_RuleAddressZeroNotAllowed"},{"inputs":[],"type":"error","name":"RuleEngine_RuleAlreadyExists"},{"inputs":[],"type":"error","name":"RuleEngine_RuleDoNotMatch"},{"inputs":[{"internalType":"address","name":"rule","type":"address","indexed":true}],"type":"event","name":"AddRule","anonymous":false},{"inputs":[{"internalType":"address[]","name":"rulesRemoved","type":"address[]","indexed":false}],"type":"event","name":"ClearRules","anonymous":false},{"inputs":[{"internalType":"address","name":"rule","type":"address","indexed":true}],"type":"event","name":"RemoveRule","anonymous":false},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32","indexed":true},{"internalType":"bytes32","name":"previousAdminRole","type":"bytes32","indexed":true},{"internalType":"bytes32","name":"newAdminRole","type":"bytes32","indexed":true}],"type":"event","name":"RoleAdminChanged","anonymous":false},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32","indexed":true},{"internalType":"address","name":"account","type":"address","indexed":true},{"internalType":"address","name":"sender","type":"address","indexed":true}],"type":"event","name":"RoleGranted","anonymous":false},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32","indexed":true},{"internalType":"address","name":"account","type":"address","indexed":true},{"internalType":"address","name":"sender","type":"address","indexed":true}],"type":"event","name":"RoleRevoked","anonymous":false},{"inputs":[],"stateMutability":"view","type":"function","name":"CODE_ADDRESS_FROM_NOT_WHITELISTED","outputs":[{"internalType":"uint8","name":"","type":"uint8"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"CODE_ADDRESS_TO_NOT_WHITELISTED","outputs":[{"internalType":"uint8","name":"","type":"uint8"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"RULE_ENGINE_OPERATOR_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"TOKEN_CONTRACT_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}]},{"inputs":[{"internalType":"contract IRuleValidation","name":"rule_","type":"address"}],"stateMutability":"nonpayable","type":"function","name":"addRuleValidation"},{"inputs":[{"internalType":"uint8","name":"_restrictionCode","type":"uint8"}],"stateMutability":"pure","type":"function","name":"canReturnTransferRestrictionCode","outputs":[{"internalType":"bool","name":"","type":"bool"}]},{"inputs":[],"stateMutability":"nonpayable","type":"function","name":"clearRulesValidation"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function","name":"detectTransferRestriction","outputs":[{"internalType":"uint8","name":"","type":"uint8"}]},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"stateMutability":"view","type":"function","name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}]},{"inputs":[{"internalType":"contract IRuleValidation","name":"rule_","type":"address"}],"stateMutability":"view","type":"function","name":"getRuleIndexValidation","outputs":[{"internalType":"uint256","name":"index","type":"uint256"}]},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"stateMutability":"nonpayable","type":"function","name":"grantRole"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"stateMutability":"view","type":"function","name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}]},{"inputs":[{"internalType":"address","name":"forwarder","type":"address"}],"stateMutability":"view","type":"function","name":"isTrustedForwarder","outputs":[{"internalType":"bool","name":"","type":"bool"}]},{"inputs":[{"internalType":"uint8","name":"_restrictionCode","type":"uint8"}],"stateMutability":"pure","type":"function","name":"messageForTransferRestriction","outputs":[{"internalType":"string","name":"","type":"string"}]},{"inputs":[{"internalType":"contract IRuleValidation","name":"rule_","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"stateMutability":"nonpayable","type":"function","name":"removeRuleValidation"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"callerConfirmation","type":"address"}],"stateMutability":"nonpayable","type":"function","name":"renounceRole"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"stateMutability":"nonpayable","type":"function","name":"revokeRole"},{"inputs":[{"internalType":"uint256","name":"ruleId","type":"uint256"}],"stateMutability":"view","type":"function","name":"ruleValidation","outputs":[{"internalType":"address","name":"","type":"address"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"rulesCountValidation","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"rulesValidation","outputs":[{"internalType":"address[]","name":"","type":"address[]"}]},{"inputs":[{"internalType":"address[]","name":"rules_","type":"address[]"}],"stateMutability":"nonpayable","type":"function","name":"setRulesValidation"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"stateMutability":"view","type":"function","name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"trustedForwarder","outputs":[{"internalType":"address","name":"","type":"address"}]},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"stateMutability":"view","type":"function","name":"validateTransfer","outputs":[{"internalType":"bool","name":"isValid","type":"bool"}]}],"devdoc":{"kind":"dev","methods":{"canReturnTransferRestrictionCode(uint8)":{"params":{"_restrictionCode":"The target restriction code"},"returns":{"_0":"true if the restriction code is known, false otherwise*"}},"constructor":{"params":{"admin":"Address of the contract (Access Control)","forwarderIrrevocable":"Address of the forwarder, required for the gasless support"}},"detectTransferRestriction(address,address,uint256)":{"params":{"_from":"the origin address","_to":"the destination address"},"returns":{"_0":"The restricion code or REJECTED_CODE_BASE.TRANSFER_OK*"}},"getRoleAdmin(bytes32)":{"details":"Returns the admin role that controls `role`. See {grantRole} and {revokeRole}. To change a role's admin, use {_setRoleAdmin}."},"getRuleIndexValidation(address)":{"returns":{"index":"if the rule is found, _rulesValidation.length otherwise"}},"grantRole(bytes32,address)":{"details":"Grants `role` to `account`. If `account` had not been already granted `role`, emits a {RoleGranted} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleGranted} event."},"hasRole(bytes32,address)":{"details":"Returns `true` if `account` has been granted `role`."},"isTrustedForwarder(address)":{"details":"Indicates whether any particular address is the trusted forwarder."},"messageForTransferRestriction(uint8)":{"params":{"_restrictionCode":"The target restriction code"},"returns":{"_0":"true if the transfer is valid, false otherwise*"}},"removeRuleValidation(address,uint256)":{"details":"To reduce the array size, the last rule is moved to the location occupied by the rule to remove","params":{"index":"the position inside the array of rule","rule_":"address of the target rule"}},"renounceRole(bytes32,address)":{"details":"Revokes `role` from the calling account. Roles are often managed via {grantRole} and {revokeRole}: this function's purpose is to provide a mechanism for accounts to lose their privileges if they are compromised (such as when a trusted device is misplaced). If the calling account had been revoked `role`, emits a {RoleRevoked} event. Requirements: - the caller must be `callerConfirmation`. May emit a {RoleRevoked} event."},"revokeRole(bytes32,address)":{"details":"Revokes `role` from `account`. If `account` had been granted `role`, emits a {RoleRevoked} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleRevoked} event."},"ruleValidation(uint256)":{"params":{"ruleId":"index of the rule"},"returns":{"_0":"a rule address"}},"rulesCountValidation()":{"returns":{"_0":"The number of rules inside the array"}},"rulesValidation()":{"returns":{"_0":"An array of rules"}},"setRulesValidation(address[])":{"details":"take address[] instead of IRuleEngineValidation[] since it is not possible to cast IRuleEngineValidation[] -> address[]"},"supportsInterface(bytes4)":{"details":"See {IERC165-supportsInterface}."},"trustedForwarder()":{"details":"Returns the address of the trusted forwarder."},"validateTransfer(address,address,uint256)":{"params":{"_amount":"to transfer","_from":"the origin address","_to":"the destination address"},"returns":{"isValid":"=> true if the transfer is valid, false otherwise*"}}},"version":1},"userdoc":{"kind":"user","methods":{"RULE_ENGINE_OPERATOR_ROLE()":{"notice":"Role to manage the ruleEngine"},"TOKEN_CONTRACT_ROLE()":{"notice":"token contract"},"addRuleValidation(address)":{"notice":"Add a rule to the array of rules Revert if one rule is a zero address or if the rule is already present"},"canReturnTransferRestrictionCode(uint8)":{"notice":"To know if the restriction code is valid for this rule or not"},"clearRulesValidation()":{"notice":"Clear all the rules of the array of rules"},"detectTransferRestriction(address,address,uint256)":{"notice":"Go through all the whitelist rules to know if a restriction exists on the transfer"},"getRuleIndexValidation(address)":{"notice":"Get the index of a rule inside the list"},"messageForTransferRestriction(uint8)":{"notice":"Return the corresponding message"},"removeRuleValidation(address,uint256)":{"notice":"Remove a rule from the array of rules Revert if the rule found at the specified index does not match the rule in argument"},"ruleValidation(uint256)":{"notice":"Get the rule at the position specified by ruleId"},"rulesValidation()":{"notice":"Get all the rules"},"setRulesValidation(address[])":{"notice":"Set all the rules, will overwrite all the previous rules. \\n Revert if one rule is a zero address or if the rule is already present"},"validateTransfer(address,address,uint256)":{"notice":"Validate a transfer"}},"version":1}},"settings":{"remappings":["@openzeppelin/contracts/=lib/openzeppelin-contracts/contracts/","CMTAT/=lib/CMTAT/contracts/","OZ/=lib/openzeppelin-contracts/contracts/","ds-test/=lib/openzeppelin-contracts/lib/forge-std/lib/ds-test/src/","erc4626-tests/=lib/openzeppelin-contracts/lib/erc4626-tests/","forge-std/=lib/forge-std/src/","openzeppelin-contracts/=lib/openzeppelin-contracts/"],"optimizer":{"enabled":true,"runs":200},"metadata":{"bytecodeHash":"ipfs"},"compilationTarget":{"src/rules/validation/RuleWhitelistWrapper.sol":"RuleWhitelistWrapper"},"evmVersion":"london","libraries":{}},"sources":{"lib/CMTAT/contracts/interfaces/draft-IERC1404/draft-IERC1404.sol":{"keccak256":"0xfba123f04b693467a10bffcc3d30c8ee0a55a159d1a50a9e6ad7efa6a08ad9ad","urls":["bzz-raw://f0af9bead272c5af8153932efe6e464485aa27c82a2a5c79ed94e780ec373da0","dweb:/ipfs/QmZJj9B5sBDGY8b5qbFkadmQ377xugKwGoxkHPWW3BpnWg"],"license":"MPL-2.0"},"lib/CMTAT/contracts/interfaces/draft-IERC1404/draft-IERC1404EnumCode.sol":{"keccak256":"0x5162820d851ed01a9ce5e0b28b58b4dfa6262d010e0f112ca1dd1867b37600ed","urls":["bzz-raw://599cbb744369ec114f918eec3f462d0f2f0a33bab292683be34098bf98b31423","dweb:/ipfs/QmTSYGzsUDicQ5jCu88r2XnRqFyS5nJqfPGiz4q3aL35mx"],"license":"MPL-2.0"},"lib/CMTAT/contracts/interfaces/draft-IERC1404/draft-IERC1404Wrapper.sol":{"keccak256":"0xefa53aa4e697f2fd338b56888c9492392100a146ccd7a2c107cbd189f5c99ea3","urls":["bzz-raw://a7a5933297a01300d5eb8baa49cce9c98c5f3779e329f4ac41dae6e128bdf68e","dweb:/ipfs/QmcDMxLHuuc7n8dVw6PWtQaRrkqMrtQUoBt4XKeNHF69mF"],"license":"MPL-2.0"},"lib/openzeppelin-contracts/contracts/access/AccessControl.sol":{"keccak256":"0xa0e92d42942f4f57c5be50568dac11e9d00c93efcb458026e18d2d9b9b2e7308","urls":["bzz-raw://46326c0bb1e296b67185e81c918e0b40501b8b6386165855df0a3f3c634b6a80","dweb:/ipfs/QmTwyrDYtsxsk6pymJTK94PnEpzsmkpUxFuzEiakDopy4Z"],"license":"MIT"},"lib/openzeppelin-contracts/contracts/access/IAccessControl.sol":{"keccak256":"0xb6b36edd6a2999fd243ff226d6cbf84bd71af2432bbd0dfe19392996a1d9cb41","urls":["bzz-raw://1fd2f35495652e57e3f99bc6c510bc5f7dd398a176ea2e72d8ed730aebc6ca26","dweb:/ipfs/QmTQV6X4gkikTib49cho5iDX3JvSQbdsoEChoDwrk3CbbH"],"license":"MIT"},"lib/openzeppelin-contracts/contracts/metatx/ERC2771Context.sol":{"keccak256":"0x98256cf37b71a69b2f5a8a6fe975ea03590dff703102bd141a830f94e8adebf6","urls":["bzz-raw://6251fe1f6a1e45e6d619d150c123afc88b8646b38ee26a136efa9a6988a31d3f","dweb:/ipfs/QmeXDT85wSZdP31wkz3ah3KhponCiksJLP5o2LR5e1JxcK"],"license":"MIT"},"lib/openzeppelin-contracts/contracts/utils/Context.sol":{"keccak256":"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2","urls":["bzz-raw://6a708e8a5bdb1011c2c381c9a5cfd8a9a956d7d0a9dc1bd8bcdaf52f76ef2f12","dweb:/ipfs/Qmax9WHBnVsZP46ZxEMNRQpLQnrdE4dK8LehML1Py8FowF"],"license":"MIT"},"lib/openzeppelin-contracts/contracts/utils/introspection/ERC165.sol":{"keccak256":"0x9e8778b14317ba9e256c30a76fd6c32b960af621987f56069e1e819c77c6a133","urls":["bzz-raw://1777404f1dcd0fac188e55a288724ec3c67b45288e49cc64723e95e702b49ab8","dweb:/ipfs/QmZFdC626GButBApwDUvvTnUzdinevC3B24d7yyh57XkiA"],"license":"MIT"},"lib/openzeppelin-contracts/contracts/utils/introspection/IERC165.sol":{"keccak256":"0x4296879f55019b23e135000eb36896057e7101fb7fb859c5ef690cf14643757b","urls":["bzz-raw://87b3541437c8c443ccd36795e56a338ed12855eec17f8da624511b8d1a7e14df","dweb:/ipfs/QmeJQCtZrQjtJLr6u7ZHWeH3pBnjtLWzvRrKViAi7UZqxL"],"license":"MIT"},"src/interfaces/IRuleEngineValidation.sol":{"keccak256":"0x19f9b71580dddb20a29570bff88f711abf0c8aec18bd563643764aa37355eac1","urls":["bzz-raw://4a48e1abaa9d740c88bb33958b2227b1d98723a357fe35a6cc3a2843b00cdc20","dweb:/ipfs/QmVaEQQhH522tKEJLizmFDuTeAyxb8bZP7byHpfNxwSmyT"],"license":"MPL-2.0"},"src/interfaces/IRuleValidation.sol":{"keccak256":"0x6b23f8d7355937f0d304ceb498f661b004d1969f87782af7588a960273af38a1","urls":["bzz-raw://b9c92ca4ce23304474c8236dd37c60f2c98627ca2a6156eb2ce0767436f40fa9","dweb:/ipfs/QmZMkCu57MjUXjN5TtkhDGgM9RzGQpTX3uD79P1M9Vn2G8"],"license":"MPL-2.0"},"src/modules/MetaTxModuleStandalone.sol":{"keccak256":"0x32423330fbd140fb87b7f3c9f004db3eb7256f0f8c15b76be26ff14ba81edba0","urls":["bzz-raw://af6e6cfd9ccb587283b8379965a76143a27aaa38115191db1bbb1a5632eb4a25","dweb:/ipfs/QmTdaEc78NfG9wJRYErsCZajvNF8ozLaqEfNyzi7Fu1fMj"],"license":"MPL-2.0"},"src/modules/RuleEngineInvariantStorage.sol":{"keccak256":"0x09093b1b80c8fd27ef80aaec46522ec5525aebcdb0fe77231821197d6fe7a1a0","urls":["bzz-raw://4939364678439e43818b1efb114b662219629b5945ecd98b1e39eca64d46dc44","dweb:/ipfs/QmSikHEsDZy8hzyQ33N3AhiM25S7pCFEmqADZxK53FpCDq"],"license":"MPL-2.0"},"src/modules/RuleEngineValidationCommon.sol":{"keccak256":"0xf1d0fdd62ba10b81918a6749e1fcf9f020b298a8179a1cf6c849fe0aaa5edddb","urls":["bzz-raw://57ae96630675750b371656a3e9ce3a5b1e2ce16327d3e292b934def1b85c8a1d","dweb:/ipfs/QmZm9obyXiMCJzLPNCvvtN9QogngmRnkZJmBke2bc79Jgk"],"license":"MPL-2.0"},"src/modules/RuleInternal.sol":{"keccak256":"0xa6d2f8844062b318c31cb97570b840ac2faa50111564c97b7190bcadcab4419c","urls":["bzz-raw://878b4ba012b1c46973bb50018973a90ea6b700706a2ae52b0bae7d240df510b3","dweb:/ipfs/QmdRjwxgoo4xc3JmyAirRbbLupKVZ51r67e1D93bTFSF6A"],"license":"MPL-2.0"},"src/rules/validation/RuleWhitelistWrapper.sol":{"keccak256":"0x98dea2f3986bd3490f2ba10dc027cdcb8fe7b5f0f4b21ab47f72fb5eb1bad785","urls":["bzz-raw://e777ea68de9b49e8193d94d0255de3949cfd237507016ced64870431eef36644","dweb:/ipfs/QmawDNARGnscDspWEdN7nLKVGVwFpNwa13vCKVXdrUGxpc"],"license":"MPL-2.0"},"src/rules/validation/abstract/RuleAddressList/RuleAddressList.sol":{"keccak256":"0x062f188bd35d2e2ca224c7a5b576c5720275e5175d3fa3ffd9ab896dcf21c400","urls":["bzz-raw://fa847c271016bae89e056f66898f4fba411b348bb312face86c94758f8a378ac","dweb:/ipfs/QmPGHHbsmxVgL7tcc77qNVMfxtESgnYqrvdLqxGXdXw2bM"],"license":"MPL-2.0"},"src/rules/validation/abstract/RuleAddressList/RuleAddressListInternal.sol":{"keccak256":"0x4fe41635bb8060e980ed5d9847afd0f2bb89c64501254bea619e65a727ba67b6","urls":["bzz-raw://e0e417e96caa101c0a8a6a25944c89d9690cd166680dd298918e4819f415c531","dweb:/ipfs/QmPJeFJW8g4dzfHU81Kt5kfLBgVWevChUzArFSjh5iDVR8"],"license":"MPL-2.0"},"src/rules/validation/abstract/RuleAddressList/invariantStorage/RuleAddressListInvariantStorage.sol":{"keccak256":"0x56c9ca1310dccae89d1019b5a9041fcd11f8344656221995fe2fbc4d095b37c3","urls":["bzz-raw://ce143c19d8c1d192e4fddabb32be213caef4c6bfa19dcf79f3ae6a6cc518a1b7","dweb:/ipfs/Qmbn9wRsiRybULTaKqBkPWe6SEbbfKVRttD1mi2cb8RznB"],"license":"MPL-2.0"},"src/rules/validation/abstract/RuleAddressList/invariantStorage/RuleWhitelistInvariantStorage.sol":{"keccak256":"0x39a4b0b5ef4d03b32e826c67c0244bd0bdc803656e6f7d2301c395b7a3bd5bb2","urls":["bzz-raw://5c6222cc7a6e87d1bd11c5989c83ee6bf09dca003c3002845dbf41a4b694246e","dweb:/ipfs/QmXQy7odhSupb6BjG1T1KjbmaLs7mcBrag7Sn3cp2JGUyb"],"license":"MPL-2.0"},"src/rules/validation/abstract/RuleCommonInvariantStorage.sol":{"keccak256":"0xea52693dfabf31d5b94201b78ba04cd4e7f9985b616965530317dcb25c59b678","urls":["bzz-raw://c6a24a2b31405e5511548afd5dca62ea8670a71ebb7fce8604637609ff320749","dweb:/ipfs/QmUDXyeySu8nBRyTWGxdrTs4NC813F5w9PyBTgMs9Y7N7u"],"license":"MPL-2.0"},"src/rules/validation/abstract/RuleValidateTransfer.sol":{"keccak256":"0xd843208b93b04efb86fc20e5f0f8b1a725a6402fcbe5836aadf652c9804b749b","urls":["bzz-raw://2ce6f485b6d7c43e823fe0add5b894c252dbc36e61143df6e4a00c1bd12dc1cd","dweb:/ipfs/QmQaKkmwo8UacTADjRh9ebj1B8CCjpLRfHoUt3xMcDYhAt"],"license":"MPL-2.0"},"src/rules/validation/abstract/RuleWhitelistCommon.sol":{"keccak256":"0xbab37a174342a2a1d3343bb575b5e85450f662973f8c06cba6103f4071480c7c","urls":["bzz-raw://a45604ae07b94bec85e15b9d79d24b3ba98d8fed9eebee4e3769da215be1022c","dweb:/ipfs/QmNsESHhPwpHpJiuYiFRADLXGyUuKZmXrGVMcVvt8XyALZ"],"license":"MPL-2.0"}},"version":1},"id":101}
\ No newline at end of file
diff --git a/RuleWhitelistv2.0.2.json b/RuleWhitelistv2.0.2.json
deleted file mode 100644
index 21cfa2a..0000000
--- a/RuleWhitelistv2.0.2.json
+++ /dev/null
@@ -1,1081 +0,0 @@
-{
-  "contractName": "RuleWhitelist",
-  "abi": [
-    {
-      "type": "constructor",
-      "inputs": [
-        { "name": "admin", "type": "address", "internalType": "address" },
-        {
-          "name": "forwarderIrrevocable",
-          "type": "address",
-          "internalType": "address"
-        }
-      ],
-      "stateMutability": "nonpayable"
-    },
-    {
-      "type": "function",
-      "name": "ADDRESS_LIST_ADD_ROLE",
-      "inputs": [],
-      "outputs": [{ "name": "", "type": "bytes32", "internalType": "bytes32" }],
-      "stateMutability": "view"
-    },
-    {
-      "type": "function",
-      "name": "ADDRESS_LIST_REMOVE_ROLE",
-      "inputs": [],
-      "outputs": [{ "name": "", "type": "bytes32", "internalType": "bytes32" }],
-      "stateMutability": "view"
-    },
-    {
-      "type": "function",
-      "name": "CODE_ADDRESS_FROM_NOT_WHITELISTED",
-      "inputs": [],
-      "outputs": [{ "name": "", "type": "uint8", "internalType": "uint8" }],
-      "stateMutability": "view"
-    },
-    {
-      "type": "function",
-      "name": "CODE_ADDRESS_TO_NOT_WHITELISTED",
-      "inputs": [],
-      "outputs": [{ "name": "", "type": "uint8", "internalType": "uint8" }],
-      "stateMutability": "view"
-    },
-    {
-      "type": "function",
-      "name": "DEFAULT_ADMIN_ROLE",
-      "inputs": [],
-      "outputs": [{ "name": "", "type": "bytes32", "internalType": "bytes32" }],
-      "stateMutability": "view"
-    },
-    {
-      "type": "function",
-      "name": "addAddressToTheList",
-      "inputs": [
-        {
-          "name": "_newWhitelistAddress",
-          "type": "address",
-          "internalType": "address"
-        }
-      ],
-      "outputs": [],
-      "stateMutability": "nonpayable"
-    },
-    {
-      "type": "function",
-      "name": "addAddressesToTheList",
-      "inputs": [
-        {
-          "name": "listWhitelistedAddress",
-          "type": "address[]",
-          "internalType": "address[]"
-        }
-      ],
-      "outputs": [],
-      "stateMutability": "nonpayable"
-    },
-    {
-      "type": "function",
-      "name": "addressIsListed",
-      "inputs": [
-        {
-          "name": "_targetAddress",
-          "type": "address",
-          "internalType": "address"
-        }
-      ],
-      "outputs": [{ "name": "", "type": "bool", "internalType": "bool" }],
-      "stateMutability": "view"
-    },
-    {
-      "type": "function",
-      "name": "addressIsListedBatch",
-      "inputs": [
-        {
-          "name": "_targetAddresses",
-          "type": "address[]",
-          "internalType": "address[]"
-        }
-      ],
-      "outputs": [{ "name": "", "type": "bool[]", "internalType": "bool[]" }],
-      "stateMutability": "view"
-    },
-    {
-      "type": "function",
-      "name": "canReturnTransferRestrictionCode",
-      "inputs": [
-        { "name": "_restrictionCode", "type": "uint8", "internalType": "uint8" }
-      ],
-      "outputs": [{ "name": "", "type": "bool", "internalType": "bool" }],
-      "stateMutability": "pure"
-    },
-    {
-      "type": "function",
-      "name": "detectTransferRestriction",
-      "inputs": [
-        { "name": "_from", "type": "address", "internalType": "address" },
-        { "name": "_to", "type": "address", "internalType": "address" },
-        { "name": "", "type": "uint256", "internalType": "uint256" }
-      ],
-      "outputs": [{ "name": "", "type": "uint8", "internalType": "uint8" }],
-      "stateMutability": "view"
-    },
-    {
-      "type": "function",
-      "name": "getRoleAdmin",
-      "inputs": [
-        { "name": "role", "type": "bytes32", "internalType": "bytes32" }
-      ],
-      "outputs": [{ "name": "", "type": "bytes32", "internalType": "bytes32" }],
-      "stateMutability": "view"
-    },
-    {
-      "type": "function",
-      "name": "grantRole",
-      "inputs": [
-        { "name": "role", "type": "bytes32", "internalType": "bytes32" },
-        { "name": "account", "type": "address", "internalType": "address" }
-      ],
-      "outputs": [],
-      "stateMutability": "nonpayable"
-    },
-    {
-      "type": "function",
-      "name": "hasRole",
-      "inputs": [
-        { "name": "role", "type": "bytes32", "internalType": "bytes32" },
-        { "name": "account", "type": "address", "internalType": "address" }
-      ],
-      "outputs": [{ "name": "", "type": "bool", "internalType": "bool" }],
-      "stateMutability": "view"
-    },
-    {
-      "type": "function",
-      "name": "isTrustedForwarder",
-      "inputs": [
-        { "name": "forwarder", "type": "address", "internalType": "address" }
-      ],
-      "outputs": [{ "name": "", "type": "bool", "internalType": "bool" }],
-      "stateMutability": "view"
-    },
-    {
-      "type": "function",
-      "name": "messageForTransferRestriction",
-      "inputs": [
-        { "name": "_restrictionCode", "type": "uint8", "internalType": "uint8" }
-      ],
-      "outputs": [{ "name": "", "type": "string", "internalType": "string" }],
-      "stateMutability": "pure"
-    },
-    {
-      "type": "function",
-      "name": "numberListedAddress",
-      "inputs": [],
-      "outputs": [{ "name": "", "type": "uint256", "internalType": "uint256" }],
-      "stateMutability": "view"
-    },
-    {
-      "type": "function",
-      "name": "removeAddressFromTheList",
-      "inputs": [
-        {
-          "name": "_removeWhitelistAddress",
-          "type": "address",
-          "internalType": "address"
-        }
-      ],
-      "outputs": [],
-      "stateMutability": "nonpayable"
-    },
-    {
-      "type": "function",
-      "name": "removeAddressesFromTheList",
-      "inputs": [
-        {
-          "name": "listWhitelistedAddress",
-          "type": "address[]",
-          "internalType": "address[]"
-        }
-      ],
-      "outputs": [],
-      "stateMutability": "nonpayable"
-    },
-    {
-      "type": "function",
-      "name": "renounceRole",
-      "inputs": [
-        { "name": "role", "type": "bytes32", "internalType": "bytes32" },
-        {
-          "name": "callerConfirmation",
-          "type": "address",
-          "internalType": "address"
-        }
-      ],
-      "outputs": [],
-      "stateMutability": "nonpayable"
-    },
-    {
-      "type": "function",
-      "name": "revokeRole",
-      "inputs": [
-        { "name": "role", "type": "bytes32", "internalType": "bytes32" },
-        { "name": "account", "type": "address", "internalType": "address" }
-      ],
-      "outputs": [],
-      "stateMutability": "nonpayable"
-    },
-    {
-      "type": "function",
-      "name": "supportsInterface",
-      "inputs": [
-        { "name": "interfaceId", "type": "bytes4", "internalType": "bytes4" }
-      ],
-      "outputs": [{ "name": "", "type": "bool", "internalType": "bool" }],
-      "stateMutability": "view"
-    },
-    {
-      "type": "function",
-      "name": "trustedForwarder",
-      "inputs": [],
-      "outputs": [{ "name": "", "type": "address", "internalType": "address" }],
-      "stateMutability": "view"
-    },
-    {
-      "type": "function",
-      "name": "validateTransfer",
-      "inputs": [
-        { "name": "_from", "type": "address", "internalType": "address" },
-        { "name": "_to", "type": "address", "internalType": "address" },
-        { "name": "_amount", "type": "uint256", "internalType": "uint256" }
-      ],
-      "outputs": [
-        { "name": "isValid", "type": "bool", "internalType": "bool" }
-      ],
-      "stateMutability": "view"
-    },
-    {
-      "type": "event",
-      "name": "RoleAdminChanged",
-      "inputs": [
-        {
-          "name": "role",
-          "type": "bytes32",
-          "indexed": true,
-          "internalType": "bytes32"
-        },
-        {
-          "name": "previousAdminRole",
-          "type": "bytes32",
-          "indexed": true,
-          "internalType": "bytes32"
-        },
-        {
-          "name": "newAdminRole",
-          "type": "bytes32",
-          "indexed": true,
-          "internalType": "bytes32"
-        }
-      ],
-      "anonymous": false
-    },
-    {
-      "type": "event",
-      "name": "RoleGranted",
-      "inputs": [
-        {
-          "name": "role",
-          "type": "bytes32",
-          "indexed": true,
-          "internalType": "bytes32"
-        },
-        {
-          "name": "account",
-          "type": "address",
-          "indexed": true,
-          "internalType": "address"
-        },
-        {
-          "name": "sender",
-          "type": "address",
-          "indexed": true,
-          "internalType": "address"
-        }
-      ],
-      "anonymous": false
-    },
-    {
-      "type": "event",
-      "name": "RoleRevoked",
-      "inputs": [
-        {
-          "name": "role",
-          "type": "bytes32",
-          "indexed": true,
-          "internalType": "bytes32"
-        },
-        {
-          "name": "account",
-          "type": "address",
-          "indexed": true,
-          "internalType": "address"
-        },
-        {
-          "name": "sender",
-          "type": "address",
-          "indexed": true,
-          "internalType": "address"
-        }
-      ],
-      "anonymous": false
-    },
-    { "type": "error", "name": "AccessControlBadConfirmation", "inputs": [] },
-    {
-      "type": "error",
-      "name": "AccessControlUnauthorizedAccount",
-      "inputs": [
-        { "name": "account", "type": "address", "internalType": "address" },
-        { "name": "neededRole", "type": "bytes32", "internalType": "bytes32" }
-      ]
-    },
-    {
-      "type": "error",
-      "name": "RuleAddressList_AdminWithAddressZeroNotAllowed",
-      "inputs": []
-    },
-    { "type": "error", "name": "Rulelist_AddressAlreadylisted", "inputs": [] },
-    { "type": "error", "name": "Rulelist_AddressNotPresent", "inputs": [] }
-  ],
-  "bytecode":"0x60a06040523480156200001157600080fd5b50604051620013ca380380620013ca83398101604081905262000034916200023a565b6001600160a01b0380821660805282908290821662000066576040516317c69b0360e21b815260040160405180910390fd5b62000073600083620000d8565b50620000a07f1b03c849816e077359373cf0a8d6d8f741d643bc1e95273ffe11515f83bebf6183620000d8565b50620000cd7f1b94c92b564251ed6b49246d9a82eb7a486b6490f3b3a3bf3b28d2e99801f3ec83620000d8565b5050505050620002f1565b6000828152602081815260408083206001600160a01b038516845290915281205460ff166200017f576000838152602081815260408083206001600160a01b03861684529091529020805460ff191660011790556200013662000189565b6001600160a01b0316826001600160a01b0316847f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a450600162000183565b5060005b92915050565b6000620001956200019a565b905090565b6000366014620001aa33620001f6565b8015620001b75750808210155b15620001ee57600036620001cc838562000272565b620001d992829062000294565b620001e491620002c0565b60601c9250505090565b339250505090565b60006200020260805190565b6001600160a01b0316826001600160a01b0316149050919050565b80516001600160a01b03811681146200023557600080fd5b919050565b600080604083850312156200024e57600080fd5b62000259836200021d565b915062000269602084016200021d565b90509250929050565b818103818111156200018357634e487b7160e01b600052601160045260246000fd5b60008085851115620002a557600080fd5b83861115620002b357600080fd5b5050820193919092039150565b6001600160601b03198135818116916014851015620002e95780818660140360031b1b83161692505b505092915050565b6080516110af6200031b6000396000818161023c015281816102b90152610bf401526110af6000f3fe608060405234801561001057600080fd5b50600436106101585760003560e01c80637da0a877116100c3578063c6946a121161007c578063c6946a1214610358578063d4ce14151461036b578063d547741f1461037e578063daafd1c714610391578063db136dad146103a4578063fa83a2da146103ac57600080fd5b80637da0a877146102ac5780637f4ab1dd146102e3578063893c14401461030357806391d1485414610316578063948b851e14610329578063a217fddf1461035057600080fd5b80633630e2ea116101155780633630e2ea1461020657806336568abe14610219578063572b6c051461022c5780635b119c0a1461026c5780635b577f66146102865780637d045df61461029957600080fd5b806301ffc9a71461015d5780630a3640d21461018557806311d1c5ca146101a557806313be3212146101ba578063248a9ca3146101d05780632f2ff15d146101f3575b600080fd5b61017061016b366004610c59565b6103d3565b60405190151581526020015b60405180910390f35b610198610193366004610cb0565b61040a565b60405161017c9190610d75565b6101b86101b3366004610dbb565b6104cc565b005b6101c2610505565b60405190815260200161017c565b6101c26101de366004610e30565b60009081526020819052604090206001015490565b6101b8610201366004610e49565b610515565b6101b8610214366004610dbb565b610540565b6101b8610227366004610e49565b610574565b61017061023a366004610e75565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0390811691161490565b610274601581565b60405160ff909116815260200161017c565b610170610294366004610e75565b6105b7565b6101706102a7366004610e9f565b6105d8565b6040516001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016815260200161017c565b6102f66102f1366004610e9f565b6105f4565b60405161017c9190610ebc565b6101b8610311366004610e75565b61068a565b610170610324366004610e49565b6106c1565b6101c27f1b03c849816e077359373cf0a8d6d8f741d643bc1e95273ffe11515f83bebf6181565b6101c2600081565b610170610366366004610f0b565b6106ea565b610274610379366004610f0b565b610774565b6101b861038c366004610e49565b6107a8565b6101b861039f366004610e75565b6107cd565b610274601681565b6101c27f1b94c92b564251ed6b49246d9a82eb7a486b6490f3b3a3bf3b28d2e99801f3ec81565b60006001600160e01b03198216637965db0b60e01b148061040457506301ffc9a760e01b6001600160e01b03198316145b92915050565b60606000825167ffffffffffffffff81111561042857610428610c83565b604051908082528060200260200182016040528015610451578160200160208202803683370190505b50905060005b83518110156104c55761049b84828151811061047557610475610f47565b60200260200101516001600160a01b031660009081526001602052604090205460ff1690565b8282815181106104ad576104ad610f47565b91151560209283029190910190910152600101610457565b5092915050565b7f1b03c849816e077359373cf0a8d6d8f741d643bc1e95273ffe11515f83bebf616104f681610800565b6105008383610814565b505050565b600061051060025490565b905090565b60008281526020819052604090206001015461053081610800565b61053a83836108de565b50505050565b7f1b94c92b564251ed6b49246d9a82eb7a486b6490f3b3a3bf3b28d2e99801f3ec61056a81610800565b6105008383610971565b61057c610a35565b6001600160a01b0316816001600160a01b0316146105ad5760405163334bd91960e11b815260040160405180910390fd5b6105008282610a3f565b6001600160a01b03811660009081526001602052604081205460ff16610404565b600060ff821660151480610404575060ff821660161492915050565b606060141960ff831601610621576040518060600160405280602281526020016110586022913992915050565b60151960ff83160161064c576040518060600160405280602581526020016110336025913992915050565b505060408051808201909152601881527f556e6b6e6f776e207265737472696374696f6e20636f64650000000000000000602082015290565b919050565b7f1b94c92b564251ed6b49246d9a82eb7a486b6490f3b3a3bf3b28d2e99801f3ec6106b481610800565b6106bd82610ac8565b5050565b6000918252602082815260408084206001600160a01b0393909316845291905290205460ff1690565b60405163d4ce141560e01b81526001600160a01b03848116600483015283166024820152604481018290526000908190309063d4ce141590606401602060405180830381865afa158015610742573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107669190610f5d565b60ff161490505b9392505050565b600061077f846105b7565b61078b5750601561076d565b610794836105b7565b6107a05750601661076d565b50600061076d565b6000828152602081905260409020600101546107c381610800565b61053a8383610a3f565b7f1b03c849816e077359373cf0a8d6d8f741d643bc1e95273ffe11515f83bebf616107f781610800565b6106bd82610b38565b6108118161080c610a35565b610ba7565b50565b60025460005b828110156108d6576001600085858481811061083857610838610f47565b905060200201602081019061084d9190610e75565b6001600160a01b0316815260208101919091526040016000205460ff166108ce57600180600086868581811061088557610885610f47565b905060200201602081019061089a9190610e75565b6001600160a01b031681526020810191909152604001600020805460ff19169115159190911790556108cb82610f90565b91505b60010161081a565b506002555050565b60006108ea83836106c1565b610969576000838152602081815260408083206001600160a01b03861684529091529020805460ff19166001179055610921610a35565b6001600160a01b0316826001600160a01b0316847f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a4506001610404565b506000610404565b60025460005b828110156108d6576001600085858481811061099557610995610f47565b90506020020160208101906109aa9190610e75565b6001600160a01b0316815260208101919091526040016000205460ff1615610a2d576000600160008686858181106109e4576109e4610f47565b90506020020160208101906109f99190610e75565b6001600160a01b031681526020810191909152604001600020805460ff1916911515919091179055610a2a82610fa9565b91505b600101610977565b6000610510610be4565b6000610a4b83836106c1565b15610969576000838152602081815260408083206001600160a01b03861684529091529020805460ff19169055610a80610a35565b6001600160a01b0316826001600160a01b0316847ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a4506001610404565b6001600160a01b03811660009081526001602052604090205460ff16610b015760405163cfc5cc9560e01b815260040160405180910390fd5b6001600160a01b0381166000908152600160205260408120805460ff1916905560028054909190610b3190610fa9565b9091555050565b6001600160a01b03811660009081526001602052604090205460ff1615610b72576040516357845b8b60e01b815260040160405180910390fd5b6001600160a01b03811660009081526001602081905260408220805460ff1916909117905560028054909190610b3190610f90565b610bb182826106c1565b6106bd5760405163e2517d3f60e01b81526001600160a01b03821660048201526024810183905260440160405180910390fd5b6000366014336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148015610c215750808210155b15610c5157600036610c338385610fc0565b610c3e928290610fd3565b610c4791610ffd565b60601c9250505090565b339250505090565b600060208284031215610c6b57600080fd5b81356001600160e01b03198116811461076d57600080fd5b634e487b7160e01b600052604160045260246000fd5b80356001600160a01b038116811461068557600080fd5b60006020808385031215610cc357600080fd5b823567ffffffffffffffff80821115610cdb57600080fd5b818501915085601f830112610cef57600080fd5b813581811115610d0157610d01610c83565b8060051b604051601f19603f83011681018181108582111715610d2657610d26610c83565b604052918252848201925083810185019188831115610d4457600080fd5b938501935b82851015610d6957610d5a85610c99565b84529385019392850192610d49565b98975050505050505050565b6020808252825182820181905260009190848201906040850190845b81811015610daf578351151583529284019291840191600101610d91565b50909695505050505050565b60008060208385031215610dce57600080fd5b823567ffffffffffffffff80821115610de657600080fd5b818501915085601f830112610dfa57600080fd5b813581811115610e0957600080fd5b8660208260051b8501011115610e1e57600080fd5b60209290920196919550909350505050565b600060208284031215610e4257600080fd5b5035919050565b60008060408385031215610e5c57600080fd5b82359150610e6c60208401610c99565b90509250929050565b600060208284031215610e8757600080fd5b61076d82610c99565b60ff8116811461081157600080fd5b600060208284031215610eb157600080fd5b813561076d81610e90565b60006020808352835180602085015260005b81811015610eea57858101830151858201604001528201610ece565b506000604082860101526040601f19601f8301168501019250505092915050565b600080600060608486031215610f2057600080fd5b610f2984610c99565b9250610f3760208501610c99565b9150604084013590509250925092565b634e487b7160e01b600052603260045260246000fd5b600060208284031215610f6f57600080fd5b815161076d81610e90565b634e487b7160e01b600052601160045260246000fd5b600060018201610fa257610fa2610f7a565b5060010190565b600081610fb857610fb8610f7a565b506000190190565b8181038181111561040457610404610f7a565b60008085851115610fe357600080fd5b83861115610ff057600080fd5b5050820193919092039150565b6bffffffffffffffffffffffff19813581811691601485101561102a5780818660140360031b1b83161692505b50509291505056fe54686520726563697069656e74206973206e6f7420696e207468652077686974656c6973745468652073656e646572206973206e6f7420696e207468652077686974656c697374a26469706673582212202f76450923b188395ecb3c568a17c231c8c077751daf86f1e09a79884d5888dc64736f6c63430008160033",
-  "deployedBytecode": {
-    "object": "0x608060405234801561001057600080fd5b50600436106101585760003560e01c80637da0a877116100c3578063c6946a121161007c578063c6946a1214610358578063d4ce14151461036b578063d547741f1461037e578063daafd1c714610391578063db136dad146103a4578063fa83a2da146103ac57600080fd5b80637da0a877146102ac5780637f4ab1dd146102e3578063893c14401461030357806391d1485414610316578063948b851e14610329578063a217fddf1461035057600080fd5b80633630e2ea116101155780633630e2ea1461020657806336568abe14610219578063572b6c051461022c5780635b119c0a1461026c5780635b577f66146102865780637d045df61461029957600080fd5b806301ffc9a71461015d5780630a3640d21461018557806311d1c5ca146101a557806313be3212146101ba578063248a9ca3146101d05780632f2ff15d146101f3575b600080fd5b61017061016b366004610c59565b6103d3565b60405190151581526020015b60405180910390f35b610198610193366004610cb0565b61040a565b60405161017c9190610d75565b6101b86101b3366004610dbb565b6104cc565b005b6101c2610505565b60405190815260200161017c565b6101c26101de366004610e30565b60009081526020819052604090206001015490565b6101b8610201366004610e49565b610515565b6101b8610214366004610dbb565b610540565b6101b8610227366004610e49565b610574565b61017061023a366004610e75565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0390811691161490565b610274601581565b60405160ff909116815260200161017c565b610170610294366004610e75565b6105b7565b6101706102a7366004610e9f565b6105d8565b6040516001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016815260200161017c565b6102f66102f1366004610e9f565b6105f4565b60405161017c9190610ebc565b6101b8610311366004610e75565b61068a565b610170610324366004610e49565b6106c1565b6101c27f1b03c849816e077359373cf0a8d6d8f741d643bc1e95273ffe11515f83bebf6181565b6101c2600081565b610170610366366004610f0b565b6106ea565b610274610379366004610f0b565b610774565b6101b861038c366004610e49565b6107a8565b6101b861039f366004610e75565b6107cd565b610274601681565b6101c27f1b94c92b564251ed6b49246d9a82eb7a486b6490f3b3a3bf3b28d2e99801f3ec81565b60006001600160e01b03198216637965db0b60e01b148061040457506301ffc9a760e01b6001600160e01b03198316145b92915050565b60606000825167ffffffffffffffff81111561042857610428610c83565b604051908082528060200260200182016040528015610451578160200160208202803683370190505b50905060005b83518110156104c55761049b84828151811061047557610475610f47565b60200260200101516001600160a01b031660009081526001602052604090205460ff1690565b8282815181106104ad576104ad610f47565b91151560209283029190910190910152600101610457565b5092915050565b7f1b03c849816e077359373cf0a8d6d8f741d643bc1e95273ffe11515f83bebf616104f681610800565b6105008383610814565b505050565b600061051060025490565b905090565b60008281526020819052604090206001015461053081610800565b61053a83836108de565b50505050565b7f1b94c92b564251ed6b49246d9a82eb7a486b6490f3b3a3bf3b28d2e99801f3ec61056a81610800565b6105008383610971565b61057c610a35565b6001600160a01b0316816001600160a01b0316146105ad5760405163334bd91960e11b815260040160405180910390fd5b6105008282610a3f565b6001600160a01b03811660009081526001602052604081205460ff16610404565b600060ff821660151480610404575060ff821660161492915050565b606060141960ff831601610621576040518060600160405280602281526020016110586022913992915050565b60151960ff83160161064c576040518060600160405280602581526020016110336025913992915050565b505060408051808201909152601881527f556e6b6e6f776e207265737472696374696f6e20636f64650000000000000000602082015290565b919050565b7f1b94c92b564251ed6b49246d9a82eb7a486b6490f3b3a3bf3b28d2e99801f3ec6106b481610800565b6106bd82610ac8565b5050565b6000918252602082815260408084206001600160a01b0393909316845291905290205460ff1690565b60405163d4ce141560e01b81526001600160a01b03848116600483015283166024820152604481018290526000908190309063d4ce141590606401602060405180830381865afa158015610742573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107669190610f5d565b60ff161490505b9392505050565b600061077f846105b7565b61078b5750601561076d565b610794836105b7565b6107a05750601661076d565b50600061076d565b6000828152602081905260409020600101546107c381610800565b61053a8383610a3f565b7f1b03c849816e077359373cf0a8d6d8f741d643bc1e95273ffe11515f83bebf616107f781610800565b6106bd82610b38565b6108118161080c610a35565b610ba7565b50565b60025460005b828110156108d6576001600085858481811061083857610838610f47565b905060200201602081019061084d9190610e75565b6001600160a01b0316815260208101919091526040016000205460ff166108ce57600180600086868581811061088557610885610f47565b905060200201602081019061089a9190610e75565b6001600160a01b031681526020810191909152604001600020805460ff19169115159190911790556108cb82610f90565b91505b60010161081a565b506002555050565b60006108ea83836106c1565b610969576000838152602081815260408083206001600160a01b03861684529091529020805460ff19166001179055610921610a35565b6001600160a01b0316826001600160a01b0316847f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a4506001610404565b506000610404565b60025460005b828110156108d6576001600085858481811061099557610995610f47565b90506020020160208101906109aa9190610e75565b6001600160a01b0316815260208101919091526040016000205460ff1615610a2d576000600160008686858181106109e4576109e4610f47565b90506020020160208101906109f99190610e75565b6001600160a01b031681526020810191909152604001600020805460ff1916911515919091179055610a2a82610fa9565b91505b600101610977565b6000610510610be4565b6000610a4b83836106c1565b15610969576000838152602081815260408083206001600160a01b03861684529091529020805460ff19169055610a80610a35565b6001600160a01b0316826001600160a01b0316847ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a4506001610404565b6001600160a01b03811660009081526001602052604090205460ff16610b015760405163cfc5cc9560e01b815260040160405180910390fd5b6001600160a01b0381166000908152600160205260408120805460ff1916905560028054909190610b3190610fa9565b9091555050565b6001600160a01b03811660009081526001602052604090205460ff1615610b72576040516357845b8b60e01b815260040160405180910390fd5b6001600160a01b03811660009081526001602081905260408220805460ff1916909117905560028054909190610b3190610f90565b610bb182826106c1565b6106bd5760405163e2517d3f60e01b81526001600160a01b03821660048201526024810183905260440160405180910390fd5b6000366014336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148015610c215750808210155b15610c5157600036610c338385610fc0565b610c3e928290610fd3565b610c4791610ffd565b60601c9250505090565b339250505090565b600060208284031215610c6b57600080fd5b81356001600160e01b03198116811461076d57600080fd5b634e487b7160e01b600052604160045260246000fd5b80356001600160a01b038116811461068557600080fd5b60006020808385031215610cc357600080fd5b823567ffffffffffffffff80821115610cdb57600080fd5b818501915085601f830112610cef57600080fd5b813581811115610d0157610d01610c83565b8060051b604051601f19603f83011681018181108582111715610d2657610d26610c83565b604052918252848201925083810185019188831115610d4457600080fd5b938501935b82851015610d6957610d5a85610c99565b84529385019392850192610d49565b98975050505050505050565b6020808252825182820181905260009190848201906040850190845b81811015610daf578351151583529284019291840191600101610d91565b50909695505050505050565b60008060208385031215610dce57600080fd5b823567ffffffffffffffff80821115610de657600080fd5b818501915085601f830112610dfa57600080fd5b813581811115610e0957600080fd5b8660208260051b8501011115610e1e57600080fd5b60209290920196919550909350505050565b600060208284031215610e4257600080fd5b5035919050565b60008060408385031215610e5c57600080fd5b82359150610e6c60208401610c99565b90509250929050565b600060208284031215610e8757600080fd5b61076d82610c99565b60ff8116811461081157600080fd5b600060208284031215610eb157600080fd5b813561076d81610e90565b60006020808352835180602085015260005b81811015610eea57858101830151858201604001528201610ece565b506000604082860101526040601f19601f8301168501019250505092915050565b600080600060608486031215610f2057600080fd5b610f2984610c99565b9250610f3760208501610c99565b9150604084013590509250925092565b634e487b7160e01b600052603260045260246000fd5b600060208284031215610f6f57600080fd5b815161076d81610e90565b634e487b7160e01b600052601160045260246000fd5b600060018201610fa257610fa2610f7a565b5060010190565b600081610fb857610fb8610f7a565b506000190190565b8181038181111561040457610404610f7a565b60008085851115610fe357600080fd5b83861115610ff057600080fd5b5050820193919092039150565b6bffffffffffffffffffffffff19813581811691601485101561102a5780818660140360031b1b83161692505b50509291505056fe54686520726563697069656e74206973206e6f7420696e207468652077686974656c6973745468652073656e646572206973206e6f7420696e207468652077686974656c697374a26469706673582212202f76450923b188395ecb3c568a17c231c8c077751daf86f1e09a79884d5888dc64736f6c63430008160033",
-    "sourceMap": "204:1035:100:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2565:202:62;;;;;;:::i;:::-;;:::i;:::-;;;470:14:139;;463:22;445:41;;433:2;418:18;2565:202:62;;;;;;;;3537:356:102;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;1400:190::-;;;;;;:::i;:::-;;:::i;:::-;;3012:107;;;:::i;:::-;;;3346:25:139;;;3334:2;3319:18;3012:107:102;3200:177:139;3810:120:62;;;;;;:::i;:::-;3875:7;3901:12;;;;;;;;;;:22;;;;3810:120;4226:136;;;;;;:::i;:::-;;:::i;1880:203:102:-;;;;;;:::i;:::-;;:::i;5328:245:62:-;;;;;;:::i;:::-;;:::i;1830:137:66:-;;;;;;:::i;:::-;1705:17;-1:-1:-1;;;;;1929:31:66;;;;;;;1830:137;490:60:106;;548:2;490:60;;;;;4371:4:139;4359:17;;;4341:36;;4329:2;4314:18;490:60:106;4199:184:139;3312:146:102;;;;;;:::i;:::-;;:::i;511:274:110:-;;;;;;:::i;:::-;;:::i;1622:107:66:-;;;-1:-1:-1;;;;;1705:17:66;4919:32:139;4901:51;;4889:2;4874:18;1622:107:66;4755:203:139;977:447:110;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;2701:190:102:-;;;;;;:::i;:::-;;:::i;2854:136:62:-;;;;;;:::i;:::-;;:::i;313:82:104:-;;361:34;313:82;;2187:49:62;;2232:4;2187:49;;418:355:109;;;;;;:::i;:::-;;:::i;804:433:100:-;;;;;;:::i;:::-;;:::i;4642:138:62:-;;;;;;:::i;:::-;;:::i;2292:171:102:-;;;;;;:::i;:::-;;:::i;556:58:106:-;;612:2;556:58;;219:88:104;;270:37;219:88;;2565:202:62;2650:4;-1:-1:-1;;;;;;2673:47:62;;-1:-1:-1;;;2673:47:62;;:87;;-1:-1:-1;;;;;;;;;;861:40:78;;;2724:36:62;2666:94;2565:202;-1:-1:-1;;2565:202:62:o;3537:356:102:-;3637:13;3662:22;3698:16;:23;3687:35;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;3687:35:102;;3662:60;;3737:9;3732:130;3756:16;:23;3752:1;:27;3732:130;;;3814:37;3831:16;3848:1;3831:19;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;;;;3139:20:103;3116:4;3139:20;;;:4;:20;;;;;;;;;3029:137;3814:37:102;3800:8;3809:1;3800:11;;;;;;;;:::i;:::-;:51;;;:11;;;;;;;;;;;:51;3781:3;;3732:130;;;-1:-1:-1;3878:8:102;3537:356;-1:-1:-1;;3537:356:102:o;1400:190::-;361:34:104;2464:16:62;2475:4;2464:10;:16::i;:::-;1537:46:102::1;1560:22;;1537;:46::i;:::-;1400:190:::0;;;:::o;3012:107::-;3064:7;3090:22;2813:16:103;;;2732:104;3090:22:102;3083:29;;3012:107;:::o;4226:136:62:-;3875:7;3901:12;;;;;;;;;;:22;;;2464:16;2475:4;2464:10;:16::i;:::-;4330:25:::1;4341:4;4347:7;4330:10;:25::i;:::-;;4226:136:::0;;;:::o;1880:203:102:-;270:37:104;2464:16:62;2475:4;2464:10;:16::i;:::-;2025:51:102::1;2053:22;;2025:27;:51::i;5328:245:62:-:0;5443:12;:10;:12::i;:::-;-1:-1:-1;;;;;5421:34:62;:18;-1:-1:-1;;;;;5421:34:62;;5417:102;;5478:30;;-1:-1:-1;;;5478:30:62;;;;;;;;;;;5417:102;5529:37;5541:4;5547:18;5529:11;:37::i;3312:146:102:-;-1:-1:-1;;;;;3139:20:103;;3396:4:102;3139:20:103;;;:4;:20;;;;;;;;3419:32:102;3029:137:103;511:274:110;623:4;658:53;;;548:2:106;658:53:110;;:120;;-1:-1:-1;727:51:110;;;612:2:106;727:51:110;639:139;511:274;-1:-1:-1;;511:274:110:o;977:447::-;1086:13;-1:-1:-1;;1115:53:110;;;;1111:307;;1191:33;;;;;;;;;;;;;;;;;1184:40;977:447;-1:-1:-1;;977:447:110:o;1111:307::-;-1:-1:-1;;1245:51:110;;;;1241:177;;1319:31;;;;;;;;;;;;;;;;;1312:38;977:447;-1:-1:-1;;977:447:110:o;1241:177::-;-1:-1:-1;;1388:19:110;;;;;;;;;;;;;;;;;;977:447::o;1241:177::-;977:447;;;:::o;2701:190:102:-;270:37:104;2464:16:62;2475:4;2464:10;:16::i;:::-;2834:50:102::1;2860:23;2834:25;:50::i;:::-;2701:190:::0;;:::o;2854:136:62:-;2931:4;2954:12;;;;;;;;;;;-1:-1:-1;;;;;2954:29:62;;;;;;;;;;;;;;;2854:136::o;418:355:109:-;662:51;;-1:-1:-1;;;662:51:109;;-1:-1:-1;;;;;6371:15:139;;;662:51:109;;;6353:34:139;6423:15;;6403:18;;;6396:43;6455:18;;;6448:34;;;549:12:109;;;;662:4;;:30;;6288:18:139;;662:51:109;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:104;;;643:123;;418:355;;;;;;:::o;804:433:100:-;949:5;971:22;987:5;971:15;:22::i;:::-;966:265;;-1:-1:-1;548:2:106;1009:40:100;;966:265;1071:20;1087:3;1071:15;:20::i;:::-;1066:165;;-1:-1:-1;612:2:106;1107:38:100;;1066:165;-1:-1:-1;1189:30:100;1176:44;;4642:138:62;3875:7;3901:12;;;;;;;;;;:22;;;2464:16;2475:4;2464:10;:16::i;:::-;4747:26:::1;4759:4;4765:7;4747:11;:26::i;2292:171:102:-:0;361:34:104;2464:16:62;2475:4;2464:10;:16::i;:::-;2414:42:102::1;2435:20;2414;:42::i;3199:103:62:-:0;3265:30;3276:4;3282:12;:10;:12::i;:::-;3265:10;:30::i;:::-;3199:103;:::o;607:406:103:-;724:16;;692:29;750:207;770:24;;;750:207;;;820:4;:22;825:13;;839:1;825:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;820:22:103;;;;;;;;;;;;-1:-1:-1;820:22:103;;;;815:132;;887:4;862;:22;867:13;;881:1;867:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;862:22:103;;;;;;;;;;;;-1:-1:-1;862:22:103;:29;;-1:-1:-1;;862:29:103;;;;;;;;;;909:23;;;:::i;:::-;;;815:132;796:3;;750:207;;;-1:-1:-1;966:16:103;:40;-1:-1:-1;;607:406:103:o;6179:316:62:-;6256:4;6277:22;6285:4;6291:7;6277;:22::i;:::-;6272:217;;6315:6;:12;;;;;;;;;;;-1:-1:-1;;;;;6315:29:62;;;;;;;;;:36;;-1:-1:-1;;6315:36:62;6347:4;6315:36;;;6397:12;:10;:12::i;:::-;-1:-1:-1;;;;;6370:40:62;6388:7;-1:-1:-1;;;;;6370:40:62;6382:4;6370:40;;;;;;;;;;-1:-1:-1;6431:4:62;6424:11;;6272:217;-1:-1:-1;6473:5:62;6466:12;;1284:425:103;1420:16;;1388:29;1446:207;1466:24;;;1446:207;;;1515:4;:22;1520:13;;1534:1;1520:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;1515:22:103;;;;;;;;;;;;-1:-1:-1;1515:22:103;;;;1511:132;;;1582:5;1557:4;:22;1562:13;;1576:1;1562:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;1557:22:103;;;;;;;;;;;;-1:-1:-1;1557:22:103;:30;;-1:-1:-1;;1557:30:103;;;;;;;;;;1605:23;;;:::i;:::-;;;1511:132;1492:3;;1446:207;;3994:182:102;4105:14;4142:27;:25;:27::i;6730:317:62:-;6808:4;6828:22;6836:4;6842:7;6828;:22::i;:::-;6824:217;;;6898:5;6866:12;;;;;;;;;;;-1:-1:-1;;;;;6866:29:62;;;;;;;;;:37;;-1:-1:-1;;6866:37:62;;;6949:12;:10;:12::i;:::-;-1:-1:-1;;;;;6922:40:62;6940:7;-1:-1:-1;;;;;6922:40:62;6934:4;6922:40;;;;;;;;;;-1:-1:-1;6983:4:62;6976:11;;2362:249:103;-1:-1:-1;;;;;2449:24:103;;;;;;:4;:24;;;;;;;;2444:91;;2496:28;;-1:-1:-1;;;2496:28:103;;;;;;;;;;;2444:91;-1:-1:-1;;;;;2544:24:103;;2571:5;2544:24;;;:4;:24;;;;;:32;;-1:-1:-1;;2544:32:103;;;2588:16;2586:18;;2588:16;;2571:5;2586:18;;;:::i;:::-;;;;-1:-1:-1;;2362:249:103:o;1903:236::-;-1:-1:-1;;;;;1981:21:103;;;;;;:4;:21;;;;;;;;1977:90;;;2025:31;;-1:-1:-1;;;2025:31:103;;;;;;;;;;;1977:90;-1:-1:-1;;;;;2076:21:103;;;;;;2100:4;2076:21;;;;;;;:28;;-1:-1:-1;;2076:28:103;;;;;;2116:16;2114:18;;2116:16;;2076:21;2114:18;;;:::i;3432:197:62:-;3520:22;3528:4;3534:7;3520;:22::i;:::-;3515:108;;3565:47;;-1:-1:-1;;;3565:47:62;;-1:-1:-1;;;;;7350:32:139;;3565:47:62;;;7332:51:139;7399:18;;;7392:34;;;7305:18;;3565:47:62;;;;;;;2204:429:66;2266:7;2310:8;3481:2;2420:10;-1:-1:-1;;;;;1705:17:66;1929:31;;2401:71;;;;;2453:19;2435:14;:37;;2401:71;2397:230;;;2511:8;;2520:36;2537:19;2520:14;:36;:::i;:::-;2511:47;;;;;:::i;:::-;2503:56;;;:::i;:::-;2495:65;;2488:72;;;;2204:429;:::o;2397:230::-;735:10:73;2591:25:66;;;;2204:429;:::o;14:286:139:-;72:6;125:2;113:9;104:7;100:23;96:32;93:52;;;141:1;138;131:12;93:52;167:23;;-1:-1:-1;;;;;;219:32:139;;209:43;;199:71;;266:1;263;256:12;497:127;558:10;553:3;549:20;546:1;539:31;589:4;586:1;579:15;613:4;610:1;603:15;629:173;697:20;;-1:-1:-1;;;;;746:31:139;;736:42;;726:70;;792:1;789;782:12;807:1121;891:6;922:2;965;953:9;944:7;940:23;936:32;933:52;;;981:1;978;971:12;933:52;1021:9;1008:23;1050:18;1091:2;1083:6;1080:14;1077:34;;;1107:1;1104;1097:12;1077:34;1145:6;1134:9;1130:22;1120:32;;1190:7;1183:4;1179:2;1175:13;1171:27;1161:55;;1212:1;1209;1202:12;1161:55;1248:2;1235:16;1270:2;1266;1263:10;1260:36;;;1276:18;;:::i;:::-;1322:2;1319:1;1315:10;1354:2;1348:9;1417:2;1413:7;1408:2;1404;1400:11;1396:25;1388:6;1384:38;1472:6;1460:10;1457:22;1452:2;1440:10;1437:18;1434:46;1431:72;;;1483:18;;:::i;:::-;1519:2;1512:22;1569:18;;;1603:15;;;;-1:-1:-1;1645:11:139;;;1641:20;;;1673:19;;;1670:39;;;1705:1;1702;1695:12;1670:39;1729:11;;;;1749:148;1765:6;1760:3;1757:15;1749:148;;;1831:23;1850:3;1831:23;:::i;:::-;1819:36;;1782:12;;;;1875;;;;1749:148;;;1916:6;807:1121;-1:-1:-1;;;;;;;;807:1121:139:o;1933:642::-;2098:2;2150:21;;;2220:13;;2123:18;;;2242:22;;;2069:4;;2098:2;2321:15;;;;2295:2;2280:18;;;2069:4;2364:185;2378:6;2375:1;2372:13;2364:185;;;2453:13;;2446:21;2439:29;2427:42;;2524:15;;;;2489:12;;;;2400:1;2393:9;2364:185;;;-1:-1:-1;2566:3:139;;1933:642;-1:-1:-1;;;;;;1933:642:139:o;2580:615::-;2666:6;2674;2727:2;2715:9;2706:7;2702:23;2698:32;2695:52;;;2743:1;2740;2733:12;2695:52;2783:9;2770:23;2812:18;2853:2;2845:6;2842:14;2839:34;;;2869:1;2866;2859:12;2839:34;2907:6;2896:9;2892:22;2882:32;;2952:7;2945:4;2941:2;2937:13;2933:27;2923:55;;2974:1;2971;2964:12;2923:55;3014:2;3001:16;3040:2;3032:6;3029:14;3026:34;;;3056:1;3053;3046:12;3026:34;3109:7;3104:2;3094:6;3091:1;3087:14;3083:2;3079:23;3075:32;3072:45;3069:65;;;3130:1;3127;3120:12;3069:65;3161:2;3153:11;;;;;3183:6;;-1:-1:-1;2580:615:139;;-1:-1:-1;;;;2580:615:139:o;3382:180::-;3441:6;3494:2;3482:9;3473:7;3469:23;3465:32;3462:52;;;3510:1;3507;3500:12;3462:52;-1:-1:-1;3533:23:139;;3382:180;-1:-1:-1;3382:180:139:o;3749:254::-;3817:6;3825;3878:2;3866:9;3857:7;3853:23;3849:32;3846:52;;;3894:1;3891;3884:12;3846:52;3930:9;3917:23;3907:33;;3959:38;3993:2;3982:9;3978:18;3959:38;:::i;:::-;3949:48;;3749:254;;;;;:::o;4008:186::-;4067:6;4120:2;4108:9;4099:7;4095:23;4091:32;4088:52;;;4136:1;4133;4126:12;4088:52;4159:29;4178:9;4159:29;:::i;4388:114::-;4472:4;4465:5;4461:16;4454:5;4451:27;4441:55;;4492:1;4489;4482:12;4507:243;4564:6;4617:2;4605:9;4596:7;4592:23;4588:32;4585:52;;;4633:1;4630;4623:12;4585:52;4672:9;4659:23;4691:29;4714:5;4691:29;:::i;4963:548::-;5075:4;5104:2;5133;5122:9;5115:21;5165:6;5159:13;5208:6;5203:2;5192:9;5188:18;5181:34;5233:1;5243:140;5257:6;5254:1;5251:13;5243:140;;;5352:14;;;5348:23;;5342:30;5318:17;;;5337:2;5314:26;5307:66;5272:10;;5243:140;;;5247:3;5432:1;5427:2;5418:6;5407:9;5403:22;5399:31;5392:42;5502:2;5495;5491:7;5486:2;5478:6;5474:15;5470:29;5459:9;5455:45;5451:54;5443:62;;;;4963:548;;;;:::o;5516:328::-;5593:6;5601;5609;5662:2;5650:9;5641:7;5637:23;5633:32;5630:52;;;5678:1;5675;5668:12;5630:52;5701:29;5720:9;5701:29;:::i;:::-;5691:39;;5749:38;5783:2;5772:9;5768:18;5749:38;:::i;:::-;5739:48;;5834:2;5823:9;5819:18;5806:32;5796:42;;5516:328;;;;;:::o;5849:127::-;5910:10;5905:3;5901:20;5898:1;5891:31;5941:4;5938:1;5931:15;5965:4;5962:1;5955:15;6493:247;6561:6;6614:2;6602:9;6593:7;6589:23;6585:32;6582:52;;;6630:1;6627;6620:12;6582:52;6662:9;6656:16;6681:29;6704:5;6681:29;:::i;6745:127::-;6806:10;6801:3;6797:20;6794:1;6787:31;6837:4;6834:1;6827:15;6861:4;6858:1;6851:15;6877:135;6916:3;6937:17;;;6934:43;;6957:18;;:::i;:::-;-1:-1:-1;7004:1:139;6993:13;;6877:135::o;7017:136::-;7056:3;7084:5;7074:39;;7093:18;;:::i;:::-;-1:-1:-1;;;7129:18:139;;7017:136::o;7437:128::-;7504:9;;;7525:11;;;7522:37;;;7539:18;;:::i;7570:331::-;7675:9;7686;7728:8;7716:10;7713:24;7710:44;;;7750:1;7747;7740:12;7710:44;7779:6;7769:8;7766:20;7763:40;;;7799:1;7796;7789:12;7763:40;-1:-1:-1;;7825:23:139;;;7870:25;;;;;-1:-1:-1;7570:331:139:o;7906:337::-;-1:-1:-1;;8027:19:139;;8114:11;;;;8145:2;8137:11;;8134:103;;;8224:2;8218;8211:3;8207:2;8203:12;8200:1;8196:20;8192:29;8188:2;8184:38;8180:47;8171:56;;8134:103;;;7906:337;;;;:::o",
-    "linkReferences": {},
-    "immutableReferences": {
-      "54247": [
-        { "start": 572, "length": 32 },
-        { "start": 697, "length": 32 },
-        { "start": 3060, "length": 32 }
-      ]
-    }
-  },
-  "methodIdentifiers": {
-    "ADDRESS_LIST_ADD_ROLE()": "948b851e",
-    "ADDRESS_LIST_REMOVE_ROLE()": "fa83a2da",
-    "CODE_ADDRESS_FROM_NOT_WHITELISTED()": "5b119c0a",
-    "CODE_ADDRESS_TO_NOT_WHITELISTED()": "db136dad",
-    "DEFAULT_ADMIN_ROLE()": "a217fddf",
-    "addAddressToTheList(address)": "daafd1c7",
-    "addAddressesToTheList(address[])": "11d1c5ca",
-    "addressIsListed(address)": "5b577f66",
-    "addressIsListedBatch(address[])": "0a3640d2",
-    "canReturnTransferRestrictionCode(uint8)": "7d045df6",
-    "detectTransferRestriction(address,address,uint256)": "d4ce1415",
-    "getRoleAdmin(bytes32)": "248a9ca3",
-    "grantRole(bytes32,address)": "2f2ff15d",
-    "hasRole(bytes32,address)": "91d14854",
-    "isTrustedForwarder(address)": "572b6c05",
-    "messageForTransferRestriction(uint8)": "7f4ab1dd",
-    "numberListedAddress()": "13be3212",
-    "removeAddressFromTheList(address)": "893c1440",
-    "removeAddressesFromTheList(address[])": "3630e2ea",
-    "renounceRole(bytes32,address)": "36568abe",
-    "revokeRole(bytes32,address)": "d547741f",
-    "supportsInterface(bytes4)": "01ffc9a7",
-    "trustedForwarder()": "7da0a877",
-    "validateTransfer(address,address,uint256)": "c6946a12"
-  },
-  "rawMetadata": "{\"compiler\":{\"version\":\"0.8.22+commit.4fc1097e\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"admin\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"forwarderIrrevocable\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"AccessControlBadConfirmation\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"bytes32\",\"name\":\"neededRole\",\"type\":\"bytes32\"}],\"name\":\"AccessControlUnauthorizedAccount\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"RuleAddressList_AdminWithAddressZeroNotAllowed\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Rulelist_AddressAlreadylisted\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Rulelist_AddressNotPresent\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"previousAdminRole\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"newAdminRole\",\"type\":\"bytes32\"}],\"name\":\"RoleAdminChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"RoleGranted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"RoleRevoked\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"ADDRESS_LIST_ADD_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"ADDRESS_LIST_REMOVE_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"CODE_ADDRESS_FROM_NOT_WHITELISTED\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"CODE_ADDRESS_TO_NOT_WHITELISTED\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"DEFAULT_ADMIN_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_newWhitelistAddress\",\"type\":\"address\"}],\"name\":\"addAddressToTheList\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"listWhitelistedAddress\",\"type\":\"address[]\"}],\"name\":\"addAddressesToTheList\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_targetAddress\",\"type\":\"address\"}],\"name\":\"addressIsListed\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"_targetAddresses\",\"type\":\"address[]\"}],\"name\":\"addressIsListedBatch\",\"outputs\":[{\"internalType\":\"bool[]\",\"name\":\"\",\"type\":\"bool[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint8\",\"name\":\"_restrictionCode\",\"type\":\"uint8\"}],\"name\":\"canReturnTransferRestrictionCode\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"detectTransferRestriction\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"}],\"name\":\"getRoleAdmin\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"grantRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"hasRole\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"forwarder\",\"type\":\"address\"}],\"name\":\"isTrustedForwarder\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint8\",\"name\":\"_restrictionCode\",\"type\":\"uint8\"}],\"name\":\"messageForTransferRestriction\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"numberListedAddress\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_removeWhitelistAddress\",\"type\":\"address\"}],\"name\":\"removeAddressFromTheList\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"listWhitelistedAddress\",\"type\":\"address[]\"}],\"name\":\"removeAddressesFromTheList\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"callerConfirmation\",\"type\":\"address\"}],\"name\":\"renounceRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"revokeRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"supportsInterface\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"trustedForwarder\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_amount\",\"type\":\"uint256\"}],\"name\":\"validateTransfer\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"isValid\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"errors\":{\"AccessControlBadConfirmation()\":[{\"details\":\"The caller of a function is not the expected one. NOTE: Don't confuse with {AccessControlUnauthorizedAccount}.\"}],\"AccessControlUnauthorizedAccount(address,bytes32)\":[{\"details\":\"The `account` is missing a role.\"}]},\"events\":{\"RoleAdminChanged(bytes32,bytes32,bytes32)\":{\"details\":\"Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite {RoleAdminChanged} not being emitted signaling this.\"},\"RoleGranted(bytes32,address,address)\":{\"details\":\"Emitted when `account` is granted `role`. `sender` is the account that originated the contract call, an admin role bearer except when using {AccessControl-_setupRole}.\"},\"RoleRevoked(bytes32,address,address)\":{\"details\":\"Emitted when `account` is revoked `role`. `sender` is the account that originated the contract call:   - if using `revokeRole`, it is the admin role bearer   - if using `renounceRole`, it is the role bearer (i.e. `account`)\"}},\"kind\":\"dev\",\"methods\":{\"addAddressToTheList(address)\":{\"params\":{\"_newWhitelistAddress\":\"The address to whitelist\"}},\"addAddressesToTheList(address[])\":{\"params\":{\"listWhitelistedAddress\":\"an array with the addresses to whitelist\"}},\"addressIsListed(address)\":{\"params\":{\"_targetAddress\":\"The concerned address\"},\"returns\":{\"_0\":\"True if the address is listed, false otherwise\"}},\"canReturnTransferRestrictionCode(uint8)\":{\"params\":{\"_restrictionCode\":\"The target restriction code\"},\"returns\":{\"_0\":\"true if the restriction code is known, false otherwise*\"}},\"constructor\":{\"params\":{\"admin\":\"Address of the contract (Access Control)\",\"forwarderIrrevocable\":\"Address of the forwarder, required for the gasless support\"}},\"detectTransferRestriction(address,address,uint256)\":{\"params\":{\"_from\":\"the origin address\",\"_to\":\"the destination address\"},\"returns\":{\"_0\":\"The restricion code or REJECTED_CODE_BASE.TRANSFER_OK*\"}},\"getRoleAdmin(bytes32)\":{\"details\":\"Returns the admin role that controls `role`. See {grantRole} and {revokeRole}. To change a role's admin, use {_setRoleAdmin}.\"},\"grantRole(bytes32,address)\":{\"details\":\"Grants `role` to `account`. If `account` had not been already granted `role`, emits a {RoleGranted} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleGranted} event.\"},\"hasRole(bytes32,address)\":{\"details\":\"Returns `true` if `account` has been granted `role`.\"},\"isTrustedForwarder(address)\":{\"details\":\"Indicates whether any particular address is the trusted forwarder.\"},\"messageForTransferRestriction(uint8)\":{\"params\":{\"_restrictionCode\":\"The target restriction code\"},\"returns\":{\"_0\":\"true if the transfer is valid, false otherwise*\"}},\"numberListedAddress()\":{\"returns\":{\"_0\":\"Number of listed addresses\"}},\"removeAddressFromTheList(address)\":{\"params\":{\"_removeWhitelistAddress\":\"The address to remove\"}},\"removeAddressesFromTheList(address[])\":{\"params\":{\"listWhitelistedAddress\":\"an array with the addresses to remove\"}},\"renounceRole(bytes32,address)\":{\"details\":\"Revokes `role` from the calling account. Roles are often managed via {grantRole} and {revokeRole}: this function's purpose is to provide a mechanism for accounts to lose their privileges if they are compromised (such as when a trusted device is misplaced). If the calling account had been revoked `role`, emits a {RoleRevoked} event. Requirements: - the caller must be `callerConfirmation`. May emit a {RoleRevoked} event.\"},\"revokeRole(bytes32,address)\":{\"details\":\"Revokes `role` from `account`. If `account` had been granted `role`, emits a {RoleRevoked} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleRevoked} event.\"},\"supportsInterface(bytes4)\":{\"details\":\"See {IERC165-supportsInterface}.\"},\"trustedForwarder()\":{\"details\":\"Returns the address of the trusted forwarder.\"},\"validateTransfer(address,address,uint256)\":{\"params\":{\"_amount\":\"to transfer\",\"_from\":\"the origin address\",\"_to\":\"the destination address\"},\"returns\":{\"isValid\":\"=> true if the transfer is valid, false otherwise*\"}}},\"title\":\"a whitelist manager\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"addAddressToTheList(address)\":{\"notice\":\"Add one address to the whitelist If the address already exists, the transaction is reverted to save gas.\"},\"addAddressesToTheList(address[])\":{\"notice\":\"Add addresses to the whitelist If one of addresses already exist, there is no change for this address. The transaction remains valid (no revert).\"},\"addressIsListed(address)\":{\"notice\":\"Know if an address is listed or not\"},\"addressIsListedBatch(address[])\":{\"notice\":\"batch version of {addressIsListed}\"},\"canReturnTransferRestrictionCode(uint8)\":{\"notice\":\"To know if the restriction code is valid for this rule or not\"},\"detectTransferRestriction(address,address,uint256)\":{\"notice\":\"Check if an addres is in the whitelist or not\"},\"messageForTransferRestriction(uint8)\":{\"notice\":\"Return the corresponding message\"},\"numberListedAddress()\":{\"notice\":\"Get the number of listed addresses\"},\"removeAddressFromTheList(address)\":{\"notice\":\"Remove one address from the whitelist If the address does not exist in the whitelist, the transaction is reverted to save gas.\"},\"removeAddressesFromTheList(address[])\":{\"notice\":\"Remove addresses from the whitelist If the address does not exist in the whitelist, there is no change for this address. The transaction remains valid (no revert).\"},\"validateTransfer(address,address,uint256)\":{\"notice\":\"Validate a transfer\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"src/rules/validation/RuleWhitelist.sol\":\"RuleWhitelist\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[\":@openzeppelin/contracts/=lib/openzeppelin-contracts/contracts/\",\":CMTAT/=lib/CMTAT/contracts/\",\":OZ/=lib/openzeppelin-contracts/contracts/\",\":ds-test/=lib/openzeppelin-contracts/lib/forge-std/lib/ds-test/src/\",\":erc4626-tests/=lib/openzeppelin-contracts/lib/erc4626-tests/\",\":forge-std/=lib/forge-std/src/\",\":openzeppelin-contracts/=lib/openzeppelin-contracts/\"]},\"sources\":{\"lib/CMTAT/contracts/interfaces/draft-IERC1404/draft-IERC1404.sol\":{\"keccak256\":\"0xfba123f04b693467a10bffcc3d30c8ee0a55a159d1a50a9e6ad7efa6a08ad9ad\",\"license\":\"MPL-2.0\",\"urls\":[\"bzz-raw://f0af9bead272c5af8153932efe6e464485aa27c82a2a5c79ed94e780ec373da0\",\"dweb:/ipfs/QmZJj9B5sBDGY8b5qbFkadmQ377xugKwGoxkHPWW3BpnWg\"]},\"lib/CMTAT/contracts/interfaces/draft-IERC1404/draft-IERC1404EnumCode.sol\":{\"keccak256\":\"0x5162820d851ed01a9ce5e0b28b58b4dfa6262d010e0f112ca1dd1867b37600ed\",\"license\":\"MPL-2.0\",\"urls\":[\"bzz-raw://599cbb744369ec114f918eec3f462d0f2f0a33bab292683be34098bf98b31423\",\"dweb:/ipfs/QmTSYGzsUDicQ5jCu88r2XnRqFyS5nJqfPGiz4q3aL35mx\"]},\"lib/CMTAT/contracts/interfaces/draft-IERC1404/draft-IERC1404Wrapper.sol\":{\"keccak256\":\"0xefa53aa4e697f2fd338b56888c9492392100a146ccd7a2c107cbd189f5c99ea3\",\"license\":\"MPL-2.0\",\"urls\":[\"bzz-raw://a7a5933297a01300d5eb8baa49cce9c98c5f3779e329f4ac41dae6e128bdf68e\",\"dweb:/ipfs/QmcDMxLHuuc7n8dVw6PWtQaRrkqMrtQUoBt4XKeNHF69mF\"]},\"lib/openzeppelin-contracts/contracts/access/AccessControl.sol\":{\"keccak256\":\"0xa0e92d42942f4f57c5be50568dac11e9d00c93efcb458026e18d2d9b9b2e7308\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://46326c0bb1e296b67185e81c918e0b40501b8b6386165855df0a3f3c634b6a80\",\"dweb:/ipfs/QmTwyrDYtsxsk6pymJTK94PnEpzsmkpUxFuzEiakDopy4Z\"]},\"lib/openzeppelin-contracts/contracts/access/IAccessControl.sol\":{\"keccak256\":\"0xb6b36edd6a2999fd243ff226d6cbf84bd71af2432bbd0dfe19392996a1d9cb41\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://1fd2f35495652e57e3f99bc6c510bc5f7dd398a176ea2e72d8ed730aebc6ca26\",\"dweb:/ipfs/QmTQV6X4gkikTib49cho5iDX3JvSQbdsoEChoDwrk3CbbH\"]},\"lib/openzeppelin-contracts/contracts/metatx/ERC2771Context.sol\":{\"keccak256\":\"0x98256cf37b71a69b2f5a8a6fe975ea03590dff703102bd141a830f94e8adebf6\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://6251fe1f6a1e45e6d619d150c123afc88b8646b38ee26a136efa9a6988a31d3f\",\"dweb:/ipfs/QmeXDT85wSZdP31wkz3ah3KhponCiksJLP5o2LR5e1JxcK\"]},\"lib/openzeppelin-contracts/contracts/utils/Context.sol\":{\"keccak256\":\"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://6a708e8a5bdb1011c2c381c9a5cfd8a9a956d7d0a9dc1bd8bcdaf52f76ef2f12\",\"dweb:/ipfs/Qmax9WHBnVsZP46ZxEMNRQpLQnrdE4dK8LehML1Py8FowF\"]},\"lib/openzeppelin-contracts/contracts/utils/introspection/ERC165.sol\":{\"keccak256\":\"0x9e8778b14317ba9e256c30a76fd6c32b960af621987f56069e1e819c77c6a133\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://1777404f1dcd0fac188e55a288724ec3c67b45288e49cc64723e95e702b49ab8\",\"dweb:/ipfs/QmZFdC626GButBApwDUvvTnUzdinevC3B24d7yyh57XkiA\"]},\"lib/openzeppelin-contracts/contracts/utils/introspection/IERC165.sol\":{\"keccak256\":\"0x4296879f55019b23e135000eb36896057e7101fb7fb859c5ef690cf14643757b\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://87b3541437c8c443ccd36795e56a338ed12855eec17f8da624511b8d1a7e14df\",\"dweb:/ipfs/QmeJQCtZrQjtJLr6u7ZHWeH3pBnjtLWzvRrKViAi7UZqxL\"]},\"src/interfaces/IRuleValidation.sol\":{\"keccak256\":\"0x6b23f8d7355937f0d304ceb498f661b004d1969f87782af7588a960273af38a1\",\"license\":\"MPL-2.0\",\"urls\":[\"bzz-raw://b9c92ca4ce23304474c8236dd37c60f2c98627ca2a6156eb2ce0767436f40fa9\",\"dweb:/ipfs/QmZMkCu57MjUXjN5TtkhDGgM9RzGQpTX3uD79P1M9Vn2G8\"]},\"src/modules/MetaTxModuleStandalone.sol\":{\"keccak256\":\"0x32423330fbd140fb87b7f3c9f004db3eb7256f0f8c15b76be26ff14ba81edba0\",\"license\":\"MPL-2.0\",\"urls\":[\"bzz-raw://af6e6cfd9ccb587283b8379965a76143a27aaa38115191db1bbb1a5632eb4a25\",\"dweb:/ipfs/QmTdaEc78NfG9wJRYErsCZajvNF8ozLaqEfNyzi7Fu1fMj\"]},\"src/rules/validation/RuleWhitelist.sol\":{\"keccak256\":\"0xf0e635201c41e836209c5b95410eee4f53917039e67d62e6d4b906f86fb6ef43\",\"license\":\"MPL-2.0\",\"urls\":[\"bzz-raw://a047917130bf5d3f6b64285f99bd9d5ff483b4b32753fa85d77d8858e2e2a690\",\"dweb:/ipfs/QmQpvEQXNWm1aitXH6fkDg7nirUzrKHCicmeuPNDXN3QBP\"]},\"src/rules/validation/abstract/RuleAddressList/RuleAddressList.sol\":{\"keccak256\":\"0x062f188bd35d2e2ca224c7a5b576c5720275e5175d3fa3ffd9ab896dcf21c400\",\"license\":\"MPL-2.0\",\"urls\":[\"bzz-raw://fa847c271016bae89e056f66898f4fba411b348bb312face86c94758f8a378ac\",\"dweb:/ipfs/QmPGHHbsmxVgL7tcc77qNVMfxtESgnYqrvdLqxGXdXw2bM\"]},\"src/rules/validation/abstract/RuleAddressList/RuleAddressListInternal.sol\":{\"keccak256\":\"0x4fe41635bb8060e980ed5d9847afd0f2bb89c64501254bea619e65a727ba67b6\",\"license\":\"MPL-2.0\",\"urls\":[\"bzz-raw://e0e417e96caa101c0a8a6a25944c89d9690cd166680dd298918e4819f415c531\",\"dweb:/ipfs/QmPJeFJW8g4dzfHU81Kt5kfLBgVWevChUzArFSjh5iDVR8\"]},\"src/rules/validation/abstract/RuleAddressList/invariantStorage/RuleAddressListInvariantStorage.sol\":{\"keccak256\":\"0x56c9ca1310dccae89d1019b5a9041fcd11f8344656221995fe2fbc4d095b37c3\",\"license\":\"MPL-2.0\",\"urls\":[\"bzz-raw://ce143c19d8c1d192e4fddabb32be213caef4c6bfa19dcf79f3ae6a6cc518a1b7\",\"dweb:/ipfs/Qmbn9wRsiRybULTaKqBkPWe6SEbbfKVRttD1mi2cb8RznB\"]},\"src/rules/validation/abstract/RuleAddressList/invariantStorage/RuleWhitelistInvariantStorage.sol\":{\"keccak256\":\"0x39a4b0b5ef4d03b32e826c67c0244bd0bdc803656e6f7d2301c395b7a3bd5bb2\",\"license\":\"MPL-2.0\",\"urls\":[\"bzz-raw://5c6222cc7a6e87d1bd11c5989c83ee6bf09dca003c3002845dbf41a4b694246e\",\"dweb:/ipfs/QmXQy7odhSupb6BjG1T1KjbmaLs7mcBrag7Sn3cp2JGUyb\"]},\"src/rules/validation/abstract/RuleCommonInvariantStorage.sol\":{\"keccak256\":\"0xea52693dfabf31d5b94201b78ba04cd4e7f9985b616965530317dcb25c59b678\",\"license\":\"MPL-2.0\",\"urls\":[\"bzz-raw://c6a24a2b31405e5511548afd5dca62ea8670a71ebb7fce8604637609ff320749\",\"dweb:/ipfs/QmUDXyeySu8nBRyTWGxdrTs4NC813F5w9PyBTgMs9Y7N7u\"]},\"src/rules/validation/abstract/RuleValidateTransfer.sol\":{\"keccak256\":\"0xd843208b93b04efb86fc20e5f0f8b1a725a6402fcbe5836aadf652c9804b749b\",\"license\":\"MPL-2.0\",\"urls\":[\"bzz-raw://2ce6f485b6d7c43e823fe0add5b894c252dbc36e61143df6e4a00c1bd12dc1cd\",\"dweb:/ipfs/QmQaKkmwo8UacTADjRh9ebj1B8CCjpLRfHoUt3xMcDYhAt\"]},\"src/rules/validation/abstract/RuleWhitelistCommon.sol\":{\"keccak256\":\"0xbab37a174342a2a1d3343bb575b5e85450f662973f8c06cba6103f4071480c7c\",\"license\":\"MPL-2.0\",\"urls\":[\"bzz-raw://a45604ae07b94bec85e15b9d79d24b3ba98d8fed9eebee4e3769da215be1022c\",\"dweb:/ipfs/QmNsESHhPwpHpJiuYiFRADLXGyUuKZmXrGVMcVvt8XyALZ\"]}},\"version\":1}",
-  "metadata": {
-    "compiler": { "version": "0.8.22+commit.4fc1097e" },
-    "language": "Solidity",
-    "output": {
-      "abi": [
-        {
-          "inputs": [
-            { "internalType": "address", "name": "admin", "type": "address" },
-            {
-              "internalType": "address",
-              "name": "forwarderIrrevocable",
-              "type": "address"
-            }
-          ],
-          "stateMutability": "nonpayable",
-          "type": "constructor"
-        },
-        {
-          "inputs": [],
-          "type": "error",
-          "name": "AccessControlBadConfirmation"
-        },
-        {
-          "inputs": [
-            { "internalType": "address", "name": "account", "type": "address" },
-            {
-              "internalType": "bytes32",
-              "name": "neededRole",
-              "type": "bytes32"
-            }
-          ],
-          "type": "error",
-          "name": "AccessControlUnauthorizedAccount"
-        },
-        {
-          "inputs": [],
-          "type": "error",
-          "name": "RuleAddressList_AdminWithAddressZeroNotAllowed"
-        },
-        {
-          "inputs": [],
-          "type": "error",
-          "name": "Rulelist_AddressAlreadylisted"
-        },
-        { "inputs": [], "type": "error", "name": "Rulelist_AddressNotPresent" },
-        {
-          "inputs": [
-            {
-              "internalType": "bytes32",
-              "name": "role",
-              "type": "bytes32",
-              "indexed": true
-            },
-            {
-              "internalType": "bytes32",
-              "name": "previousAdminRole",
-              "type": "bytes32",
-              "indexed": true
-            },
-            {
-              "internalType": "bytes32",
-              "name": "newAdminRole",
-              "type": "bytes32",
-              "indexed": true
-            }
-          ],
-          "type": "event",
-          "name": "RoleAdminChanged",
-          "anonymous": false
-        },
-        {
-          "inputs": [
-            {
-              "internalType": "bytes32",
-              "name": "role",
-              "type": "bytes32",
-              "indexed": true
-            },
-            {
-              "internalType": "address",
-              "name": "account",
-              "type": "address",
-              "indexed": true
-            },
-            {
-              "internalType": "address",
-              "name": "sender",
-              "type": "address",
-              "indexed": true
-            }
-          ],
-          "type": "event",
-          "name": "RoleGranted",
-          "anonymous": false
-        },
-        {
-          "inputs": [
-            {
-              "internalType": "bytes32",
-              "name": "role",
-              "type": "bytes32",
-              "indexed": true
-            },
-            {
-              "internalType": "address",
-              "name": "account",
-              "type": "address",
-              "indexed": true
-            },
-            {
-              "internalType": "address",
-              "name": "sender",
-              "type": "address",
-              "indexed": true
-            }
-          ],
-          "type": "event",
-          "name": "RoleRevoked",
-          "anonymous": false
-        },
-        {
-          "inputs": [],
-          "stateMutability": "view",
-          "type": "function",
-          "name": "ADDRESS_LIST_ADD_ROLE",
-          "outputs": [
-            { "internalType": "bytes32", "name": "", "type": "bytes32" }
-          ]
-        },
-        {
-          "inputs": [],
-          "stateMutability": "view",
-          "type": "function",
-          "name": "ADDRESS_LIST_REMOVE_ROLE",
-          "outputs": [
-            { "internalType": "bytes32", "name": "", "type": "bytes32" }
-          ]
-        },
-        {
-          "inputs": [],
-          "stateMutability": "view",
-          "type": "function",
-          "name": "CODE_ADDRESS_FROM_NOT_WHITELISTED",
-          "outputs": [{ "internalType": "uint8", "name": "", "type": "uint8" }]
-        },
-        {
-          "inputs": [],
-          "stateMutability": "view",
-          "type": "function",
-          "name": "CODE_ADDRESS_TO_NOT_WHITELISTED",
-          "outputs": [{ "internalType": "uint8", "name": "", "type": "uint8" }]
-        },
-        {
-          "inputs": [],
-          "stateMutability": "view",
-          "type": "function",
-          "name": "DEFAULT_ADMIN_ROLE",
-          "outputs": [
-            { "internalType": "bytes32", "name": "", "type": "bytes32" }
-          ]
-        },
-        {
-          "inputs": [
-            {
-              "internalType": "address",
-              "name": "_newWhitelistAddress",
-              "type": "address"
-            }
-          ],
-          "stateMutability": "nonpayable",
-          "type": "function",
-          "name": "addAddressToTheList"
-        },
-        {
-          "inputs": [
-            {
-              "internalType": "address[]",
-              "name": "listWhitelistedAddress",
-              "type": "address[]"
-            }
-          ],
-          "stateMutability": "nonpayable",
-          "type": "function",
-          "name": "addAddressesToTheList"
-        },
-        {
-          "inputs": [
-            {
-              "internalType": "address",
-              "name": "_targetAddress",
-              "type": "address"
-            }
-          ],
-          "stateMutability": "view",
-          "type": "function",
-          "name": "addressIsListed",
-          "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }]
-        },
-        {
-          "inputs": [
-            {
-              "internalType": "address[]",
-              "name": "_targetAddresses",
-              "type": "address[]"
-            }
-          ],
-          "stateMutability": "view",
-          "type": "function",
-          "name": "addressIsListedBatch",
-          "outputs": [
-            { "internalType": "bool[]", "name": "", "type": "bool[]" }
-          ]
-        },
-        {
-          "inputs": [
-            {
-              "internalType": "uint8",
-              "name": "_restrictionCode",
-              "type": "uint8"
-            }
-          ],
-          "stateMutability": "pure",
-          "type": "function",
-          "name": "canReturnTransferRestrictionCode",
-          "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }]
-        },
-        {
-          "inputs": [
-            { "internalType": "address", "name": "_from", "type": "address" },
-            { "internalType": "address", "name": "_to", "type": "address" },
-            { "internalType": "uint256", "name": "", "type": "uint256" }
-          ],
-          "stateMutability": "view",
-          "type": "function",
-          "name": "detectTransferRestriction",
-          "outputs": [{ "internalType": "uint8", "name": "", "type": "uint8" }]
-        },
-        {
-          "inputs": [
-            { "internalType": "bytes32", "name": "role", "type": "bytes32" }
-          ],
-          "stateMutability": "view",
-          "type": "function",
-          "name": "getRoleAdmin",
-          "outputs": [
-            { "internalType": "bytes32", "name": "", "type": "bytes32" }
-          ]
-        },
-        {
-          "inputs": [
-            { "internalType": "bytes32", "name": "role", "type": "bytes32" },
-            { "internalType": "address", "name": "account", "type": "address" }
-          ],
-          "stateMutability": "nonpayable",
-          "type": "function",
-          "name": "grantRole"
-        },
-        {
-          "inputs": [
-            { "internalType": "bytes32", "name": "role", "type": "bytes32" },
-            { "internalType": "address", "name": "account", "type": "address" }
-          ],
-          "stateMutability": "view",
-          "type": "function",
-          "name": "hasRole",
-          "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }]
-        },
-        {
-          "inputs": [
-            {
-              "internalType": "address",
-              "name": "forwarder",
-              "type": "address"
-            }
-          ],
-          "stateMutability": "view",
-          "type": "function",
-          "name": "isTrustedForwarder",
-          "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }]
-        },
-        {
-          "inputs": [
-            {
-              "internalType": "uint8",
-              "name": "_restrictionCode",
-              "type": "uint8"
-            }
-          ],
-          "stateMutability": "pure",
-          "type": "function",
-          "name": "messageForTransferRestriction",
-          "outputs": [
-            { "internalType": "string", "name": "", "type": "string" }
-          ]
-        },
-        {
-          "inputs": [],
-          "stateMutability": "view",
-          "type": "function",
-          "name": "numberListedAddress",
-          "outputs": [
-            { "internalType": "uint256", "name": "", "type": "uint256" }
-          ]
-        },
-        {
-          "inputs": [
-            {
-              "internalType": "address",
-              "name": "_removeWhitelistAddress",
-              "type": "address"
-            }
-          ],
-          "stateMutability": "nonpayable",
-          "type": "function",
-          "name": "removeAddressFromTheList"
-        },
-        {
-          "inputs": [
-            {
-              "internalType": "address[]",
-              "name": "listWhitelistedAddress",
-              "type": "address[]"
-            }
-          ],
-          "stateMutability": "nonpayable",
-          "type": "function",
-          "name": "removeAddressesFromTheList"
-        },
-        {
-          "inputs": [
-            { "internalType": "bytes32", "name": "role", "type": "bytes32" },
-            {
-              "internalType": "address",
-              "name": "callerConfirmation",
-              "type": "address"
-            }
-          ],
-          "stateMutability": "nonpayable",
-          "type": "function",
-          "name": "renounceRole"
-        },
-        {
-          "inputs": [
-            { "internalType": "bytes32", "name": "role", "type": "bytes32" },
-            { "internalType": "address", "name": "account", "type": "address" }
-          ],
-          "stateMutability": "nonpayable",
-          "type": "function",
-          "name": "revokeRole"
-        },
-        {
-          "inputs": [
-            {
-              "internalType": "bytes4",
-              "name": "interfaceId",
-              "type": "bytes4"
-            }
-          ],
-          "stateMutability": "view",
-          "type": "function",
-          "name": "supportsInterface",
-          "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }]
-        },
-        {
-          "inputs": [],
-          "stateMutability": "view",
-          "type": "function",
-          "name": "trustedForwarder",
-          "outputs": [
-            { "internalType": "address", "name": "", "type": "address" }
-          ]
-        },
-        {
-          "inputs": [
-            { "internalType": "address", "name": "_from", "type": "address" },
-            { "internalType": "address", "name": "_to", "type": "address" },
-            { "internalType": "uint256", "name": "_amount", "type": "uint256" }
-          ],
-          "stateMutability": "view",
-          "type": "function",
-          "name": "validateTransfer",
-          "outputs": [
-            { "internalType": "bool", "name": "isValid", "type": "bool" }
-          ]
-        }
-      ],
-      "devdoc": {
-        "kind": "dev",
-        "methods": {
-          "addAddressToTheList(address)": {
-            "params": { "_newWhitelistAddress": "The address to whitelist" }
-          },
-          "addAddressesToTheList(address[])": {
-            "params": {
-              "listWhitelistedAddress": "an array with the addresses to whitelist"
-            }
-          },
-          "addressIsListed(address)": {
-            "params": { "_targetAddress": "The concerned address" },
-            "returns": {
-              "_0": "True if the address is listed, false otherwise"
-            }
-          },
-          "canReturnTransferRestrictionCode(uint8)": {
-            "params": { "_restrictionCode": "The target restriction code" },
-            "returns": {
-              "_0": "true if the restriction code is known, false otherwise*"
-            }
-          },
-          "constructor": {
-            "params": {
-              "admin": "Address of the contract (Access Control)",
-              "forwarderIrrevocable": "Address of the forwarder, required for the gasless support"
-            }
-          },
-          "detectTransferRestriction(address,address,uint256)": {
-            "params": {
-              "_from": "the origin address",
-              "_to": "the destination address"
-            },
-            "returns": {
-              "_0": "The restricion code or REJECTED_CODE_BASE.TRANSFER_OK*"
-            }
-          },
-          "getRoleAdmin(bytes32)": {
-            "details": "Returns the admin role that controls `role`. See {grantRole} and {revokeRole}. To change a role's admin, use {_setRoleAdmin}."
-          },
-          "grantRole(bytes32,address)": {
-            "details": "Grants `role` to `account`. If `account` had not been already granted `role`, emits a {RoleGranted} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleGranted} event."
-          },
-          "hasRole(bytes32,address)": {
-            "details": "Returns `true` if `account` has been granted `role`."
-          },
-          "isTrustedForwarder(address)": {
-            "details": "Indicates whether any particular address is the trusted forwarder."
-          },
-          "messageForTransferRestriction(uint8)": {
-            "params": { "_restrictionCode": "The target restriction code" },
-            "returns": {
-              "_0": "true if the transfer is valid, false otherwise*"
-            }
-          },
-          "numberListedAddress()": {
-            "returns": { "_0": "Number of listed addresses" }
-          },
-          "removeAddressFromTheList(address)": {
-            "params": { "_removeWhitelistAddress": "The address to remove" }
-          },
-          "removeAddressesFromTheList(address[])": {
-            "params": {
-              "listWhitelistedAddress": "an array with the addresses to remove"
-            }
-          },
-          "renounceRole(bytes32,address)": {
-            "details": "Revokes `role` from the calling account. Roles are often managed via {grantRole} and {revokeRole}: this function's purpose is to provide a mechanism for accounts to lose their privileges if they are compromised (such as when a trusted device is misplaced). If the calling account had been revoked `role`, emits a {RoleRevoked} event. Requirements: - the caller must be `callerConfirmation`. May emit a {RoleRevoked} event."
-          },
-          "revokeRole(bytes32,address)": {
-            "details": "Revokes `role` from `account`. If `account` had been granted `role`, emits a {RoleRevoked} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleRevoked} event."
-          },
-          "supportsInterface(bytes4)": {
-            "details": "See {IERC165-supportsInterface}."
-          },
-          "trustedForwarder()": {
-            "details": "Returns the address of the trusted forwarder."
-          },
-          "validateTransfer(address,address,uint256)": {
-            "params": {
-              "_amount": "to transfer",
-              "_from": "the origin address",
-              "_to": "the destination address"
-            },
-            "returns": {
-              "isValid": "=> true if the transfer is valid, false otherwise*"
-            }
-          }
-        },
-        "version": 1
-      },
-      "userdoc": {
-        "kind": "user",
-        "methods": {
-          "addAddressToTheList(address)": {
-            "notice": "Add one address to the whitelist If the address already exists, the transaction is reverted to save gas."
-          },
-          "addAddressesToTheList(address[])": {
-            "notice": "Add addresses to the whitelist If one of addresses already exist, there is no change for this address. The transaction remains valid (no revert)."
-          },
-          "addressIsListed(address)": {
-            "notice": "Know if an address is listed or not"
-          },
-          "addressIsListedBatch(address[])": {
-            "notice": "batch version of {addressIsListed}"
-          },
-          "canReturnTransferRestrictionCode(uint8)": {
-            "notice": "To know if the restriction code is valid for this rule or not"
-          },
-          "detectTransferRestriction(address,address,uint256)": {
-            "notice": "Check if an addres is in the whitelist or not"
-          },
-          "messageForTransferRestriction(uint8)": {
-            "notice": "Return the corresponding message"
-          },
-          "numberListedAddress()": {
-            "notice": "Get the number of listed addresses"
-          },
-          "removeAddressFromTheList(address)": {
-            "notice": "Remove one address from the whitelist If the address does not exist in the whitelist, the transaction is reverted to save gas."
-          },
-          "removeAddressesFromTheList(address[])": {
-            "notice": "Remove addresses from the whitelist If the address does not exist in the whitelist, there is no change for this address. The transaction remains valid (no revert)."
-          },
-          "validateTransfer(address,address,uint256)": {
-            "notice": "Validate a transfer"
-          }
-        },
-        "version": 1
-      }
-    },
-    "settings": {
-      "remappings": [
-        "@openzeppelin/contracts/=lib/openzeppelin-contracts/contracts/",
-        "CMTAT/=lib/CMTAT/contracts/",
-        "OZ/=lib/openzeppelin-contracts/contracts/",
-        "ds-test/=lib/openzeppelin-contracts/lib/forge-std/lib/ds-test/src/",
-        "erc4626-tests/=lib/openzeppelin-contracts/lib/erc4626-tests/",
-        "forge-std/=lib/forge-std/src/",
-        "openzeppelin-contracts/=lib/openzeppelin-contracts/"
-      ],
-      "optimizer": { "enabled": true, "runs": 200 },
-      "metadata": { "bytecodeHash": "ipfs" },
-      "compilationTarget": {
-        "src/rules/validation/RuleWhitelist.sol": "RuleWhitelist"
-      },
-      "evmVersion": "london",
-      "libraries": {}
-    },
-    "sources": {
-      "lib/CMTAT/contracts/interfaces/draft-IERC1404/draft-IERC1404.sol": {
-        "keccak256": "0xfba123f04b693467a10bffcc3d30c8ee0a55a159d1a50a9e6ad7efa6a08ad9ad",
-        "urls": [
-          "bzz-raw://f0af9bead272c5af8153932efe6e464485aa27c82a2a5c79ed94e780ec373da0",
-          "dweb:/ipfs/QmZJj9B5sBDGY8b5qbFkadmQ377xugKwGoxkHPWW3BpnWg"
-        ],
-        "license": "MPL-2.0"
-      },
-      "lib/CMTAT/contracts/interfaces/draft-IERC1404/draft-IERC1404EnumCode.sol": {
-        "keccak256": "0x5162820d851ed01a9ce5e0b28b58b4dfa6262d010e0f112ca1dd1867b37600ed",
-        "urls": [
-          "bzz-raw://599cbb744369ec114f918eec3f462d0f2f0a33bab292683be34098bf98b31423",
-          "dweb:/ipfs/QmTSYGzsUDicQ5jCu88r2XnRqFyS5nJqfPGiz4q3aL35mx"
-        ],
-        "license": "MPL-2.0"
-      },
-      "lib/CMTAT/contracts/interfaces/draft-IERC1404/draft-IERC1404Wrapper.sol": {
-        "keccak256": "0xefa53aa4e697f2fd338b56888c9492392100a146ccd7a2c107cbd189f5c99ea3",
-        "urls": [
-          "bzz-raw://a7a5933297a01300d5eb8baa49cce9c98c5f3779e329f4ac41dae6e128bdf68e",
-          "dweb:/ipfs/QmcDMxLHuuc7n8dVw6PWtQaRrkqMrtQUoBt4XKeNHF69mF"
-        ],
-        "license": "MPL-2.0"
-      },
-      "lib/openzeppelin-contracts/contracts/access/AccessControl.sol": {
-        "keccak256": "0xa0e92d42942f4f57c5be50568dac11e9d00c93efcb458026e18d2d9b9b2e7308",
-        "urls": [
-          "bzz-raw://46326c0bb1e296b67185e81c918e0b40501b8b6386165855df0a3f3c634b6a80",
-          "dweb:/ipfs/QmTwyrDYtsxsk6pymJTK94PnEpzsmkpUxFuzEiakDopy4Z"
-        ],
-        "license": "MIT"
-      },
-      "lib/openzeppelin-contracts/contracts/access/IAccessControl.sol": {
-        "keccak256": "0xb6b36edd6a2999fd243ff226d6cbf84bd71af2432bbd0dfe19392996a1d9cb41",
-        "urls": [
-          "bzz-raw://1fd2f35495652e57e3f99bc6c510bc5f7dd398a176ea2e72d8ed730aebc6ca26",
-          "dweb:/ipfs/QmTQV6X4gkikTib49cho5iDX3JvSQbdsoEChoDwrk3CbbH"
-        ],
-        "license": "MIT"
-      },
-      "lib/openzeppelin-contracts/contracts/metatx/ERC2771Context.sol": {
-        "keccak256": "0x98256cf37b71a69b2f5a8a6fe975ea03590dff703102bd141a830f94e8adebf6",
-        "urls": [
-          "bzz-raw://6251fe1f6a1e45e6d619d150c123afc88b8646b38ee26a136efa9a6988a31d3f",
-          "dweb:/ipfs/QmeXDT85wSZdP31wkz3ah3KhponCiksJLP5o2LR5e1JxcK"
-        ],
-        "license": "MIT"
-      },
-      "lib/openzeppelin-contracts/contracts/utils/Context.sol": {
-        "keccak256": "0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2",
-        "urls": [
-          "bzz-raw://6a708e8a5bdb1011c2c381c9a5cfd8a9a956d7d0a9dc1bd8bcdaf52f76ef2f12",
-          "dweb:/ipfs/Qmax9WHBnVsZP46ZxEMNRQpLQnrdE4dK8LehML1Py8FowF"
-        ],
-        "license": "MIT"
-      },
-      "lib/openzeppelin-contracts/contracts/utils/introspection/ERC165.sol": {
-        "keccak256": "0x9e8778b14317ba9e256c30a76fd6c32b960af621987f56069e1e819c77c6a133",
-        "urls": [
-          "bzz-raw://1777404f1dcd0fac188e55a288724ec3c67b45288e49cc64723e95e702b49ab8",
-          "dweb:/ipfs/QmZFdC626GButBApwDUvvTnUzdinevC3B24d7yyh57XkiA"
-        ],
-        "license": "MIT"
-      },
-      "lib/openzeppelin-contracts/contracts/utils/introspection/IERC165.sol": {
-        "keccak256": "0x4296879f55019b23e135000eb36896057e7101fb7fb859c5ef690cf14643757b",
-        "urls": [
-          "bzz-raw://87b3541437c8c443ccd36795e56a338ed12855eec17f8da624511b8d1a7e14df",
-          "dweb:/ipfs/QmeJQCtZrQjtJLr6u7ZHWeH3pBnjtLWzvRrKViAi7UZqxL"
-        ],
-        "license": "MIT"
-      },
-      "src/interfaces/IRuleValidation.sol": {
-        "keccak256": "0x6b23f8d7355937f0d304ceb498f661b004d1969f87782af7588a960273af38a1",
-        "urls": [
-          "bzz-raw://b9c92ca4ce23304474c8236dd37c60f2c98627ca2a6156eb2ce0767436f40fa9",
-          "dweb:/ipfs/QmZMkCu57MjUXjN5TtkhDGgM9RzGQpTX3uD79P1M9Vn2G8"
-        ],
-        "license": "MPL-2.0"
-      },
-      "src/modules/MetaTxModuleStandalone.sol": {
-        "keccak256": "0x32423330fbd140fb87b7f3c9f004db3eb7256f0f8c15b76be26ff14ba81edba0",
-        "urls": [
-          "bzz-raw://af6e6cfd9ccb587283b8379965a76143a27aaa38115191db1bbb1a5632eb4a25",
-          "dweb:/ipfs/QmTdaEc78NfG9wJRYErsCZajvNF8ozLaqEfNyzi7Fu1fMj"
-        ],
-        "license": "MPL-2.0"
-      },
-      "src/rules/validation/RuleWhitelist.sol": {
-        "keccak256": "0xf0e635201c41e836209c5b95410eee4f53917039e67d62e6d4b906f86fb6ef43",
-        "urls": [
-          "bzz-raw://a047917130bf5d3f6b64285f99bd9d5ff483b4b32753fa85d77d8858e2e2a690",
-          "dweb:/ipfs/QmQpvEQXNWm1aitXH6fkDg7nirUzrKHCicmeuPNDXN3QBP"
-        ],
-        "license": "MPL-2.0"
-      },
-      "src/rules/validation/abstract/RuleAddressList/RuleAddressList.sol": {
-        "keccak256": "0x062f188bd35d2e2ca224c7a5b576c5720275e5175d3fa3ffd9ab896dcf21c400",
-        "urls": [
-          "bzz-raw://fa847c271016bae89e056f66898f4fba411b348bb312face86c94758f8a378ac",
-          "dweb:/ipfs/QmPGHHbsmxVgL7tcc77qNVMfxtESgnYqrvdLqxGXdXw2bM"
-        ],
-        "license": "MPL-2.0"
-      },
-      "src/rules/validation/abstract/RuleAddressList/RuleAddressListInternal.sol": {
-        "keccak256": "0x4fe41635bb8060e980ed5d9847afd0f2bb89c64501254bea619e65a727ba67b6",
-        "urls": [
-          "bzz-raw://e0e417e96caa101c0a8a6a25944c89d9690cd166680dd298918e4819f415c531",
-          "dweb:/ipfs/QmPJeFJW8g4dzfHU81Kt5kfLBgVWevChUzArFSjh5iDVR8"
-        ],
-        "license": "MPL-2.0"
-      },
-      "src/rules/validation/abstract/RuleAddressList/invariantStorage/RuleAddressListInvariantStorage.sol": {
-        "keccak256": "0x56c9ca1310dccae89d1019b5a9041fcd11f8344656221995fe2fbc4d095b37c3",
-        "urls": [
-          "bzz-raw://ce143c19d8c1d192e4fddabb32be213caef4c6bfa19dcf79f3ae6a6cc518a1b7",
-          "dweb:/ipfs/Qmbn9wRsiRybULTaKqBkPWe6SEbbfKVRttD1mi2cb8RznB"
-        ],
-        "license": "MPL-2.0"
-      },
-      "src/rules/validation/abstract/RuleAddressList/invariantStorage/RuleWhitelistInvariantStorage.sol": {
-        "keccak256": "0x39a4b0b5ef4d03b32e826c67c0244bd0bdc803656e6f7d2301c395b7a3bd5bb2",
-        "urls": [
-          "bzz-raw://5c6222cc7a6e87d1bd11c5989c83ee6bf09dca003c3002845dbf41a4b694246e",
-          "dweb:/ipfs/QmXQy7odhSupb6BjG1T1KjbmaLs7mcBrag7Sn3cp2JGUyb"
-        ],
-        "license": "MPL-2.0"
-      },
-      "src/rules/validation/abstract/RuleCommonInvariantStorage.sol": {
-        "keccak256": "0xea52693dfabf31d5b94201b78ba04cd4e7f9985b616965530317dcb25c59b678",
-        "urls": [
-          "bzz-raw://c6a24a2b31405e5511548afd5dca62ea8670a71ebb7fce8604637609ff320749",
-          "dweb:/ipfs/QmUDXyeySu8nBRyTWGxdrTs4NC813F5w9PyBTgMs9Y7N7u"
-        ],
-        "license": "MPL-2.0"
-      },
-      "src/rules/validation/abstract/RuleValidateTransfer.sol": {
-        "keccak256": "0xd843208b93b04efb86fc20e5f0f8b1a725a6402fcbe5836aadf652c9804b749b",
-        "urls": [
-          "bzz-raw://2ce6f485b6d7c43e823fe0add5b894c252dbc36e61143df6e4a00c1bd12dc1cd",
-          "dweb:/ipfs/QmQaKkmwo8UacTADjRh9ebj1B8CCjpLRfHoUt3xMcDYhAt"
-        ],
-        "license": "MPL-2.0"
-      },
-      "src/rules/validation/abstract/RuleWhitelistCommon.sol": {
-        "keccak256": "0xbab37a174342a2a1d3343bb575b5e85450f662973f8c06cba6103f4071480c7c",
-        "urls": [
-          "bzz-raw://a45604ae07b94bec85e15b9d79d24b3ba98d8fed9eebee4e3769da215be1022c",
-          "dweb:/ipfs/QmNsESHhPwpHpJiuYiFRADLXGyUuKZmXrGVMcVvt8XyALZ"
-        ],
-        "license": "MPL-2.0"
-      }
-    },
-    "version": 1
-  },
-  "id": 100
-}