{"matchId":"27935309","creationMatch":"exact_match","runtimeMatch":"exact_match","verifiedAt":"2026-04-14T12:16:07Z","creationBytecode":{"onchainBytecode":"0x60a0604052306080523480156012575f5ffd5b506080516142b16100395f395f8181611fdb0152818161200401526123d701526142b15ff3fe608060405234801561000f575f5ffd5b5060043610610325575f3560e01c806364dad32f116101a85780639fc1d0e7116100f3578063c9c16fbd1161009e578063dd62ed3e11610079578063dd62ed3e1461066c578063ef3e8f221461067f578063f2e23d2214610692578063f8fa842b1461069a575f5ffd5b8063c9c16fbd1461063e578063d4a1911614610651578063d505accf14610659575f5ffd5b8063b187bd26116100ce578063b187bd2614610619578063bf4dc4b614610621578063c1491c5814610628575f5ffd5b80639fc1d0e7146105eb578063a9059cbb146105fe578063aaf10f4214610611575f5ffd5b80638456cb591161015357806398d2082f1161012e57806398d2082f1461059857806398d5fdca146105bb5780639dc29fac146105d8575f5ffd5b80638456cb591461057557806395d89b411461057d57806398cd615314610585575f5ffd5b80637ab8bf5a116101835780637ab8bf5a146105475780637e8962141461055a5780637ecebe0014610562575f5ffd5b806364dad32f1461050e5780636d70f7ae1461052157806370a0823114610534575f5ffd5b80633f4ba83a116102735780634f1ef2861161021e5780635845394b116101f95780635845394b146104aa5780635965959e146104d55780635ca13f04146104e85780635d3590d5146104fb575f5ffd5b80634f1ef2861461048757806352d1902d1461049a57806355f29166146104a2575f5ffd5b8063426796831161024e578063426796831461044e578063440fde4e1461046157806346fbf68e14610474575f5ffd5b80633f4ba83a1461041e57806340c10f1914610426578063422f8c0a14610439575f5ffd5b80632d524393116102d357806334cdcf26116102ae57806334cdcf26146103fb5780633644e5151461040e578063392e53cd14610416575f5ffd5b80632d524393146103bb578063313ce567146103ce57806333999fa6146103e8575f5ffd5b806318160ddd1161030357806318160ddd1461037f57806323b872dd14610395578063257e224c146103a8575f5ffd5b806306fdde031461032957806307e2a26014610347578063095ea7b31461035c575b5f5ffd5b6103316106a2565b60405161033e91906137ba565b60405180910390f35b61035a6103553660046137ed565b6106b1565b005b61036f61036a366004613824565b6107ad565b604051901515815260200161033e565b610387610807565b60405190815260200161033e565b61036f6103a336600461384e565b610830565b61035a6103b636600461395f565b6109b0565b61036f6103c9366004613a1c565b610a33565b6103d6610ad3565b60405160ff909116815260200161033e565b61035a6103f6366004613a3e565b610aff565b61036f610409366004613a1c565b610b0d565b610387610b2b565b61036f610b34565b61035a610b4a565b61035a610434366004613824565b610b69565b610441610c4d565b60405161033e9190613a9e565b61036f61045c366004613a1c565b610dc0565b61035a61046f366004613a1c565b610dde565b61036f610482366004613a1c565b610e7e565b61035a610495366004613a3e565b610e9c565b610387610eae565b61035a610ebf565b6001546104bd906001600160a01b031681565b6040516001600160a01b03909116815260200161033e565b61035a6104e33660046137ed565b610ef3565b61035a6104f63660046137ed565b610fe3565b61035a61050936600461384e565b6110d3565b61036f61051c366004613a1c565b611123565b61036f61052f366004613a1c565b611141565b610387610542366004613a1c565b61115f565b61036f610555366004613a1c565b61119b565b61035a6111b9565b610387610570366004613a1c565b6111ed565b61035a611229565b610331611246565b61035a610593366004613ae3565b611250565b6105ab6105a6366004613b15565b611399565b60405161033e9493929190613b2c565b6105c36113b6565b6040805192835260208301919091520161033e565b61035a6105e6366004613824565b6114d0565b61035a6105f936600461384e565b6115af565b61036f61060c366004613824565b6116e3565b6104bd6117cc565b61036f6117e2565b600161036f565b6106306117fb565b60405161033e929190613b60565b61035a61064c3660046137ed565b61192f565b610331611a1e565b61035a610667366004613b81565b611aa9565b61038761067a366004613bed565b611b97565b61035a61068d366004613a1c565b611be2565b6104bd611c03565b610331611c22565b60606106ac611cc5565b905090565b6106c6335f356001600160e01b031916611d66565b5f5160206141fc5f395f51905f525460ff16156106f65760405163ab35696f60e01b815260040160405180910390fd5b6106fe611c03565b604051636bcd157760e11b81525f60048201526001600160a01b0384811660248301528315156044830152919091169063d79a2aee906064015f604051808303815f87803b15801561074e575f5ffd5b505af1158015610760573d5f5f3e3d5ffd5b50505050816001600160a01b03167fd4145d5d40015b9d77048466bbe3ff2411630f7b70f80f9d79c273b6311aba74826040516107a1911515815260200190565b60405180910390a25050565b5f6107c3335f356001600160e01b031916611d66565b5f5160206141fc5f395f51905f525460ff16156107f35760405163ab35696f60e01b815260040160405180910390fd5b6107fe338484611e69565b90505b92915050565b5f6106ac7f67df8e602072ae967fe4567cec1273e29da0bd7a5a1af20d9b5c8d3f0d8385035490565b5f610846335f356001600160e01b031916611d66565b6040516364dad32f60e01b81526001600160a01b0385166004820152849030906364dad32f90602401602060405180830381865afa15801561088a573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108ae9190613c19565b6108db576040516326865f9b60e21b81526001600160a01b03821660048201526024015b60405180910390fd5b6040516364dad32f60e01b81526001600160a01b0385166004820152849030906364dad32f90602401602060405180830381865afa15801561091f573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109439190613c19565b61096b576040516326865f9b60e21b81526001600160a01b03821660048201526024016108d2565b5f5160206141fc5f395f51905f525460ff161561099b5760405163ab35696f60e01b815260040160405180910390fd5b6109a6868686611f3c565b9695505050505050565b6109b8611fd0565b5f5160206141bc5f395f51905f5254156109e55760405163f92ee8a960e01b815260040160405180910390fd5b6109ed61206b565b6109f88686866120a6565b610a0182612122565b610a0a81612148565b5f8054610a1690613c34565b90505f03610a2b575f610a298482613cb7565b505b505050505050565b5f610a3c611c03565b6001600160a01b031663970f8482835f5b604051908082528060200260200182016040528015610a76578160200160208202803683370190505b506040518363ffffffff1660e01b8152600401610a94929190613d72565b602060405180830381865afa158015610aaf573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108019190613c19565b5f6106ac7f67df8e602072ae967fe4567cec1273e29da0bd7a5a1af20d9b5c8d3f0d8385025460ff1690565b610b098282612188565b5050565b5f610b16611c03565b6001600160a01b031663f5fe5787835f610a4d565b5f6106ac6121dd565b5f6106ac5f5160206141bc5f395f51905f525490565b610b5f335f356001600160e01b031916611d66565b610b6761222c565b565b610b7e335f356001600160e01b031916611d66565b6040516364dad32f60e01b81526001600160a01b0383166004820152829030906364dad32f90602401602060405180830381865afa158015610bc2573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610be69190613c19565b610c0e576040516326865f9b60e21b81526001600160a01b03821660048201526024016108d2565b5f5160206141fc5f395f51905f525460ff1615610c3e5760405163ab35696f60e01b815260040160405180910390fd5b610c48838361229c565b505050565b6001546060906001600160a01b0316610c7b57604051631f93601760e01b81525f60048201526024016108d2565b600154610c90906001600160a01b0316612339565b15610d0b5760015f9054906101000a90046001600160a01b03166001600160a01b0316639d91348d6040518163ffffffff1660e01b81526004015f60405180830381865afa158015610ce4573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526106ac9190810190613dcc565b6040805160018082528183019092525f916020808301908036833750506001546040805163313ce56760e01b815290519394506001600160a01b039091169263313ce567925060048083019260209291908290030181865afa158015610d73573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d979190613e80565b815f81518110610da957610da9613e9b565b60ff90921660209283029190910190910152919050565b5f610dc9611c03565b6001600160a01b031663ffb2f26f835f610a4d565b610df3335f356001600160e01b031916611d66565b6001546001600160a01b039081169082168103610e2e57604051631eeb14f160e01b81526001600160a01b03831660048201526024016108d2565b600180546001600160a01b0319166001600160a01b0384811691821790925560405190918316907fd76fb624f0e2e090c9f82772a08d122c79250c90c7a896b1ed0de8bbe3e9e2e4905f90a35050565b5f610e87611c03565b6001600160a01b0316636f06fa43835f610a4d565b610ea4611fd0565b610b0982826123b0565b5f610eb76123cc565b6106ac612415565b5f51602061421c5f395f51905f5254610eeb57604051630604a9ff60e01b815260040160405180910390fd5b610b67612430565b610f08335f356001600160e01b031916611d66565b5f5160206141fc5f395f51905f525460ff1615610f385760405163ab35696f60e01b815260040160405180910390fd5b610f40611c03565b604051632b73cd6360e21b81525f60048201526001600160a01b0384811660248301528315156044830152919091169063adcf358c906064015f604051808303815f87803b158015610f90575f5ffd5b505af1158015610fa2573d5f5f3e3d5ffd5b50505050816001600160a01b03167fc71e52f779c12ade7cbf75a51deb27377b5addd6a3945e0b356bff858ffad7fb826040516107a1911515815260200190565b610ff8335f356001600160e01b031916611d66565b5f5160206141fc5f395f51905f525460ff16156110285760405163ab35696f60e01b815260040160405180910390fd5b611030611c03565b60405163361fa22b60e01b81525f60048201526001600160a01b0384811660248301528315156044830152919091169063361fa22b906064015f604051808303815f87803b158015611080575f5ffd5b505af1158015611092573d5f5f3e3d5ffd5b50505050816001600160a01b03167f6b410344a541a2ad2ffec50ea1cafabe58c50db82f72ae4f46a4bd2419155b15826040516107a1911515815260200190565b6110e8335f356001600160e01b031916611d66565b5f5160206141fc5f395f51905f525460ff16156111185760405163ab35696f60e01b815260040160405180910390fd5b610c4883838361247b565b5f61112c611c03565b6001600160a01b031663f2563ef3835f610a4d565b5f61114a611c03565b6001600160a01b031663394340e8835f610a4d565b6001600160a01b0381165f9081527f67df8e602072ae967fe4567cec1273e29da0bd7a5a1af20d9b5c8d3f0d8385046020526040812054610801565b5f6111a4611c03565b6001600160a01b03166378143d56835f610a4d565b5f51602061421c5f395f51905f52546111e557604051630604a9ff60e01b815260040160405180910390fd5b610b67612730565b6001600160a01b0381165f9081527f67df8e602072ae967fe4567cec1273e29da0bd7a5a1af20d9b5c8d3f0d8385086020526040812054610801565b61123e335f356001600160e01b031916611d66565b610b67612771565b60606106ac6127e5565b611265335f356001600160e01b031916611d66565b5f5160206141fc5f395f51905f525460ff16156112955760405163ab35696f60e01b815260040160405180910390fd5b5f5f80546112a290613c34565b80601f01602080910402602001604051908101604052809291908181526020018280546112ce90613c34565b80156113195780601f106112f057610100808354040283529160200191611319565b820191905f5260205f20905b8154815290600101906020018083116112fc57829003601f168201915b5050505050905081805190602001208180519060200120036113505781604051638651f2a560e01b81526004016108d291906137ba565b5f61135b8382613cb7565b507ffd07e2c2d6dc82f4d6b1b46f25e49eb888aba92d238fb40945856412cce2f2dd818360405161138d929190613eaf565b60405180910390a15050565b5f60605f5f6113a785612823565b93509350935093509193509193565b6001545f9081906001600160a01b031615806113e257506001546113e2906001600160a01b0316612339565b1561140f57600154604051631f93601760e01b81526001600160a01b0390911660048201526024016108d2565b60015f9054906101000a90046001600160a01b03166001600160a01b031663feaf968c6040518163ffffffff1660e01b815260040160a060405180830381865afa15801561145f573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906114839190613ef5565b5091945090925050505f8190036114ad57604051638ad52bdd60e01b815260040160405180910390fd5b5f82136114cc5760405162bfc92160e01b815260040160405180910390fd5b9091565b6114e5335f356001600160e01b031916611d66565b6040516364dad32f60e01b81526001600160a01b0383166004820152829030906364dad32f90602401602060405180830381865afa158015611529573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061154d9190613c19565b611575576040516326865f9b60e21b81526001600160a01b03821660048201526024016108d2565b5f5160206141fc5f395f51905f525460ff16156115a55760405163ab35696f60e01b815260040160405180910390fd5b610c48838361294f565b6040516364dad32f60e01b81526001600160a01b0383166004820152829030906364dad32f90602401602060405180830381865afa1580156115f3573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906116179190613c19565b61163f576040516326865f9b60e21b81526001600160a01b03821660048201526024016108d2565b611654335f356001600160e01b031916611d66565b5f5160206141fc5f395f51905f525460ff16156116845760405163ab35696f60e01b815260040160405180910390fd5b61168f8484846129f1565b50826001600160a01b0316846001600160a01b03167f7b3ce50c216d2ccf9919c6b9f1bfb33f0350a33010f188750b4af38e00448138846040516116d591815260200190565b60405180910390a350505050565b5f6116f9335f356001600160e01b031916611d66565b6040516364dad32f60e01b81526001600160a01b0384166004820152839030906364dad32f90602401602060405180830381865afa15801561173d573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906117619190613c19565b611789576040516326865f9b60e21b81526001600160a01b03821660048201526024016108d2565b5f5160206141fc5f395f51905f525460ff16156117b95760405163ab35696f60e01b815260040160405180910390fd5b6117c43385856129f1565b949350505050565b5f6106ac5f5160206141dc5f395f51905f525490565b5f6106ac5f5160206141fc5f395f51905f525460ff1690565b6001546060905f906001600160a01b0316158061182a5750600154611828906001600160a01b0316612339565b155b1561185757600154604051631f93601760e01b81526001600160a01b0390911660048201526024016108d2565b600154604080516328f5843360e21b815290516001600160a01b0390921691829163a3d610cc9160048083019260209291908290030181865afa1580156118a0573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906118c49190613f43565b9150806001600160a01b0316639198274f6040518163ffffffff1660e01b81526004015f60405180830381865afa158015611901573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526119289190810190613fae565b9250509091565b611944335f356001600160e01b031916611d66565b5f5160206141fc5f395f51905f525460ff16156119745760405163ab35696f60e01b815260040160405180910390fd5b61197c611c03565b604051624ff82360e21b81525f60048201526001600160a01b0384811660248301528315156044830152919091169063013fe08c906064015f604051808303815f87803b1580156119cb575f5ffd5b505af11580156119dd573d5f5f3e3d5ffd5b50505050816001600160a01b03167f5e20cf47b2259b331d4b7c60c19f771fc77bd7b207cb6438d0d217ea67755b57826040516107a1911515815260200190565b5f8054611a2a90613c34565b80601f0160208091040260200160405190810160405280929190818152602001828054611a5690613c34565b8015611aa15780601f10611a7857610100808354040283529160200191611aa1565b820191905f5260205f20905b815481529060010190602001808311611a8457829003601f168201915b505050505081565b611abe335f356001600160e01b031916611d66565b6040516364dad32f60e01b81526001600160a01b0388166004820152879030906364dad32f90602401602060405180830381865afa158015611b02573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611b269190613c19565b611b4e576040516326865f9b60e21b81526001600160a01b03821660048201526024016108d2565b5f5160206141fc5f395f51905f525460ff1615611b7e5760405163ab35696f60e01b815260040160405180910390fd5b611b8d88888888888888612ade565b5050505050505050565b6001600160a01b038083165f9081527f67df8e602072ae967fe4567cec1273e29da0bd7a5a1af20d9b5c8d3f0d838505602090815260408083209385168352929052908120546107fe565b611bf7335f356001600160e01b031916611d66565b611c0081612d08565b50565b5f6106ac5f51602061423c5f395f51905f52546001600160a01b031690565b6001546060906001600160a01b0316611c5057604051631f93601760e01b81525f60048201526024016108d2565b60015460408051633942720b60e11b815290516001600160a01b03909216918291637284e416916004808301925f9291908290030181865afa158015611c98573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611cbf9190810190613fe0565b91505090565b5f51602061425c5f395f51905f528054606091908190611ce490613c34565b80601f0160208091040260200160405190810160405280929190818152602001828054611d1090613c34565b8015611d5b5780601f10611d3257610100808354040283529160200191611d5b565b820191905f5260205f20905b815481529060010190602001808311611d3e57829003601f168201915b505050505091505090565b5f5f611d865f51602061423c5f395f51905f52546001600160a01b031690565b6040516001600160a01b0386811660248301526001600160e01b031986166044830152919091169060640160408051601f198184030181529181526020820180516001600160e01b0316630435f69f60e51b17905251611de69190614025565b5f60405180830381855afa9150503d805f8114611e1e576040519150601f19603f3d011682016040523d82523d5f602084013e611e23565b606091505b5091509150811580611e46575080806020019051810190611e449190613c19565b155b15611e63576040516282b42960e81b815260040160405180910390fd5b50505050565b5f6001600160a01b0384161580611e8757506001600160a01b038316155b15611ea55760405163d92e233d60e01b815260040160405180910390fd5b6001600160a01b038481165f8181527f67df8e602072ae967fe4567cec1273e29da0bd7a5a1af20d9b5c8d3f0d838505602090815260408083209488168084529482529182902086905590518581525f51602061425c5f395f51905f529392917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3506001949350505050565b6001600160a01b0383165f9081527f67df8e602072ae967fe4567cec1273e29da0bd7a5a1af20d9b5c8d3f0d838505602090815260408083203384529091528120545f51602061425c5f395f51905f52905f198114611fc557611f9f848261404f565b6001600160a01b0387165f90815260058401602090815260408083203384529091529020555b6109a68686866129f1565b306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148061204d57507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166120415f5160206141dc5f395f51905f525490565b6001600160a01b031614155b15610b675760405163703e46dd60e11b815260040160405180910390fd5b60015f5160206141bc5f395f51905f52556040517f5daa87a0e9463431830481fd4b6e3403442dfb9a12b9c07597e9f61d50b633c8905f90a1565b7f67df8e602072ae967fe4567cec1273e29da0bd7a5a1af20d9b5c8d3f0d838506545f51602061425c5f395f51905f52905f03611e6357806120e88582613cb7565b50600181016120f78482613cb7565b5060028101805460ff191660ff8416179055466006820155612117612d36565b600782015550505050565b5f51602061423c5f395f51905f5280546001600160a01b0316610b0957610b0982612d08565b7f2c9356b94ada349e65b0a691cd15e24beddfc13e05a26de25d9c64509c824401545f51602061421c5f395f51905f52905f03610b0957610b0982612de0565b604051309033907f16f2354671bbabcb07367cc01a78931a00a812ee080430be4e8f1a76ab58212b905f90a33330146121d35760405162e6155960e41b815260040160405180910390fd5b610b098282612e24565b7f67df8e602072ae967fe4567cec1273e29da0bd7a5a1af20d9b5c8d3f0d838506545f905f51602061425c5f395f51905f529046146122235761221e612d36565b611cbf565b60070154919050565b5f5160206141fc5f395f51905f525460ff1661225b5760405163dcdde9dd60e01b815260040160405180910390fd5b5f5160206141fc5f395f51905f52805460ff191681556040517fa45f47fdea8a1efdd9029a5691c7f759c32b7c698632b563573e155625d16933905f90a150565b7f67df8e602072ae967fe4567cec1273e29da0bd7a5a1af20d9b5c8d3f0d83850380545f51602061425c5f395f51905f529183915f906122dd908490614062565b90915550506001600160a01b0383165f8181526004830160209081526040808320805487019055518581527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91015b60405180910390a3505050565b5f816001600160a01b0316639d91348d6040518163ffffffff1660e01b81526004015f60405180830381865afa92505050801561239757506040513d5f823e601f3d908101601f191682016040526123949190810190613dcc565b60015b6123a257505f919050565b50600192915050565b919050565b6123b8611fd0565b6123c28282612e42565b610b098282612e97565b306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610b675760405163703e46dd60e11b815260040160405180910390fd5b5f61241e6123cc565b505f5160206141dc5f395f51905f5290565b5f51602061421c5f395f51905f5280545f61244a82611399565b50509150505f5f61245a83612ea1565b915091506124688282612e42565b61247184612ef4565b50505f9092555050565b5f806001600160a01b038516612501576040516001600160a01b0385169084905f81818185875af1925050503d805f81146124d1576040519150601f19603f3d011682016040523d82523d5f602084013e6124d6565b606091505b505080925050816124fa576040516312171d8360e31b815260040160405180910390fd5b50816126d3565b6040516370a0823160e01b81526001600160a01b03858116600483015286915f918316906370a0823190602401602060405180830381865afa158015612549573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061256d9190613f43565b604080516001600160a01b03898116602483015260448083018a905283518084039091018152606490920183526020820180516001600160e01b031663a9059cbb60e01b1790529151929350606092918a16916125ca9190614025565b5f604051808303815f865af19150503d805f8114612603576040519150601f19603f3d011682016040523d82523d5f602084013e612608565b606091505b50909550905084158061263757505f81511180156126375750808060200190518101906126359190613c19565b155b15612655576040516312171d8360e31b815260040160405180910390fd5b6040516370a0823160e01b81526001600160a01b0388811660048301525f91908516906370a0823190602401602060405180830381865afa15801561269c573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906126c09190613f43565b90506126cc838261404f565b9450505050505b836001600160a01b0316856001600160a01b03167f7a43eea7e0e6937c4baa97b10dabb89519feb249fe9ddcb442415b029148520d8584604051612721929190918252602082015260400190565b60405180910390a35050505050565b5f51602061421c5f395f51905f5280545f61274a82611399565b50509150505f5f61275a83612ea1565b915091506127688282612e42565b61247184612faf565b5f5160206141fc5f395f51905f525460ff16156127a15760405163ab35696f60e01b815260040160405180910390fd5b5f5160206141fc5f395f51905f52805460ff191660011781556040517f9e87fac88ff661f02d44f95383c817fece4bce600a3dab7a54406878b965e752905f90a150565b7f67df8e602072ae967fe4567cec1273e29da0bd7a5a1af20d9b5c8d3f0d83850180546060915f51602061425c5f395f51905f5291611ce490613c34565b5f8181527f1626844f871e5080d673ecb96ea8a32c7bdf671ea137282b2886cd9d0fd9a70260209081526040808320815160808101835281546001600160a01b03168152600182015493810193909352600281018054606094869485945f51602061419c5f395f51905f52948694919284019161289f90613c34565b80601f01602080910402602001604051908101604052809291908181526020018280546128cb90613c34565b80156129165780601f106128ed57610100808354040283529160200191612916565b820191905f5260205f20905b8154815290600101906020018083116128f957829003601f168201915b505050505081526020016003820154815250509050805f0151816040015182602001518360600151955095509550955050509193509193565b6001600160a01b0382165f9081527f67df8e602072ae967fe4567cec1273e29da0bd7a5a1af20d9b5c8d3f0d8385046020526040812080545f51602061425c5f395f51905f52928492916129a490849061404f565b909155505060038101805483900390556040518281525f906001600160a01b038516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200161232c565b5f6001600160a01b0384161580612a0f57506001600160a01b038316155b15612a2d5760405163d92e233d60e01b815260040160405180910390fd5b6001600160a01b0384165f9081527f67df8e602072ae967fe4567cec1273e29da0bd7a5a1af20d9b5c8d3f0d8385046020526040812080545f51602061425c5f395f51905f5292859291612a8290849061404f565b90915550506001600160a01b038085165f818152600484016020526040908190208054870190555190918716907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90611f299087815260200190565b42841015612aff576040516305787bdf60e01b815260040160405180910390fd5b6001600160a01b0387165f9081527f67df8e602072ae967fe4567cec1273e29da0bd7a5a1af20d9b5c8d3f0d83850860205260408120805460018082019092555f51602061425c5f395f51905f52929091612b586121dd565b604080517f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c960208201526001600160a01b03808f1692820192909252908c166060820152608081018b905260a0810185905260c081018a905260e00160405160208183030381529060405280519060200120604051602001612bf192919061190160f01b81526002810192909252602282015260420190565b60408051601f1981840301815282825280516020918201205f84529083018083525260ff891690820152606081018790526080810186905260a0016020604051602081039080840390855afa158015612c4c573d5f5f3e3d5ffd5b5050604051601f1901519150506001600160a01b0381161580612c815750896001600160a01b0316816001600160a01b031614155b15612c9f57604051632057875960e21b815260040160405180910390fd5b50506001600160a01b038881165f8181526005840160209081526040808320948c16808452948252918290208a905590518981527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a35050505050505050565b5f51602061423c5f395f51905f5280546001600160a01b0319166001600160a01b0392909216919091179055565b6040515f905f51602061425c5f395f51905f52907f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f90612d77908390614075565b6040805191829003822060208301939093528101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608201524660808201523060a082015260c0016040516020818303038152906040528051906020012091505090565b805f03612e00576040516327df2edd60e11b815260040160405180910390fd5b7f2c9356b94ada349e65b0a691cd15e24beddfc13e05a26de25d9c64509c82440155565b612e2e8282613202565b612e38828261321e565b610b098282613273565b612e4a611c03565b6001600160a01b0316336001600160a01b031614610b095733612e6b611c03565b60405163fe6cd27560e01b81526001600160a01b039283166004820152911660248201526044016108d2565b610b0982826132a6565b5f6060606483511015612ec75760405163fc69850b60e01b815260040160405180910390fd5b8251612ed7908490600490613363565b806020019051810190612eea91906140e6565b9094909350915050565b5f8181527f1626844f871e5080d673ecb96ea8a32c7bdf671ea137282b2886cd9d0fd9a70160205260409020545f51602061419c5f395f51905f529015610b09575f8281526001808301602090815260408084208490556002808601909252832080546001600160a01b0319168155918201839055909190612f7890830182613742565b505f60039190910181905560405183917f134fdd648feeaf30251f0157f9624ef8608ff9a042aad6d13e73f35d21d3f88d91a25050565b612fb8816133e2565b5f8181527f1626844f871e5080d673ecb96ea8a32c7bdf671ea137282b2886cd9d0fd9a70260209081526040808320815160808101835281546001600160a01b031681526001820154938101939093526002810180545f51602061419c5f395f51905f529594938401919061302c90613c34565b80601f016020809104026020016040519081016040528092919081815260200182805461305890613c34565b80156130a35780601f1061307a576101008083540402835291602001916130a3565b820191905f5260205f20905b81548152906001019060200180831161308657829003601f168201915b50505091835250506003919091015460209182015281519082015160408301519293509091478211156130f15760405162fae2d560e21b8152600481018390524760248201526044016108d2565b5f8681526001808701602090815260408084208490556002808a01909252832080546001600160a01b031916815591820183905590919061313490830182613742565b600382015f905550505f836001600160a01b031683836040516131579190614025565b5f6040518083038185875af1925050503d805f8114613191576040519150601f19603f3d011682016040523d82523d5f602084013e613196565b606091505b50509050806131bb5760405163165a1d4160e01b8152600481018890526024016108d2565b867fbc76564aec85e3f50672da2d1ddca0390851fecefe61cd19d89dea91a8267829858585426040516131f1949392919061412a565b60405180910390a250505050505050565b805115610b0957610b095f5f5160206141bc5f395f51905f5255565b6132278261345f565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a280511561326b57610c488282613479565b610b09613505565b5f81511180156132885750613286610b34565b155b15610b095760405163b3a31bfd60e01b815260040160405180910390fd5b5f51602061421c5f395f51905f5254156132d35760405163e741fd4560e01b815260040160405180910390fd5b7f2c9356b94ada349e65b0a691cd15e24beddfc13e05a26de25d9c64509c824401545f51602061421c5f395f51905f52905f906133109042614062565b90505f61335a30868660405160240161332a929190614162565b60408051601f198184030181529190526020810180516001600160e01b03166319cccfd360e11b17905284613524565b90925550505050565b606061337082855161363e565b915061337c838361363e565b9250613388838361404f565b67ffffffffffffffff8111156133a0576133a061388c565b6040519080825280601f01601f1916602001820160405280156133ca576020820181803683370190505b509050828203836020860101602083015e9392505050565b5f8181527f1626844f871e5080d673ecb96ea8a32c7bdf671ea137282b2886cd9d0fd9a70160205260408120545f51602061419c5f395f51905f529181900361343e57604051634b9aaa0960e11b815260040160405180910390fd5b80421015610c4857604051630f0b32ff60e11b815260040160405180910390fd5b61346881613653565b5f5160206141dc5f395f51905f5255565b60605f5f846001600160a01b0316846040516134959190614025565b5f60405180830381855af49150503d805f81146134cd576040519150601f19603f3d011682016040523d82523d5f602084013e6134d2565b606091505b5091509150816117c4578051156134ec5780518082602001fd5b60405163d6bda27560e01b815260040160405180910390fd5b3415610b675760405163b398979f60e01b815260040160405180910390fd5b5f8142106135455760405163b7d0949760e01b815260040160405180910390fd5b5f51602061419c5f395f51905f5280543490825f61356283614183565b909155505081545f81815260018085016020908152604080842089905580516080810182526001600160a01b038c811682528184018881528284018d8152606084018d90528888526002808c0190965293909620825181546001600160a01b0319169216919091178155945193850193909355519396509092908201906135e99082613cb7565b5060608201518160030155905050827f8d6fedd41517ab865c3658696c50923b3493c8a93ffd016d919a599f03c7531b8783888860405161362d949392919061412a565b60405180910390a250509392505050565b5f81831061364c57816107fe565b5090919050565b806001600160a01b03163b5f0361368857604051634c9c8ce360e01b81526001600160a01b03821660048201526024016108d2565b806001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa9250505080156136e2575060408051601f3d908101601f191682019092526136df91810190613f43565b60015b61370a57604051634c9c8ce360e01b81526001600160a01b03821660048201526024016108d2565b5f5160206141dc5f395f51905f528114610b0957604051634c9c8ce360e01b81526001600160a01b03831660048201526024016108d2565b50805461374e90613c34565b5f825580601f1061375d575050565b601f0160209004905f5260205f2090810190611c0091905b80821115613788575f8155600101613775565b5090565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f6107fe602083018461378c565b6001600160a01b0381168114611c00575f5ffd5b8015158114611c00575f5ffd5b5f5f604083850312156137fe575f5ffd5b8235613809816137cc565b91506020830135613819816137e0565b809150509250929050565b5f5f60408385031215613835575f5ffd5b8235613840816137cc565b946020939093013593505050565b5f5f5f60608486031215613860575f5ffd5b833561386b816137cc565b9250602084013561387b816137cc565b929592945050506040919091013590565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f1916810167ffffffffffffffff811182821017156138c9576138c961388c565b604052919050565b5f67ffffffffffffffff8211156138ea576138ea61388c565b50601f01601f191660200190565b5f61390a613905846138d1565b6138a0565b905082815283838301111561391d575f5ffd5b828260208301375f602084830101529392505050565b5f82601f830112613942575f5ffd5b6107fe838335602085016138f8565b60ff81168114611c00575f5ffd5b5f5f5f5f5f5f60c08789031215613974575f5ffd5b863567ffffffffffffffff81111561398a575f5ffd5b61399689828a01613933565b965050602087013567ffffffffffffffff8111156139b2575f5ffd5b6139be89828a01613933565b95505060408701356139cf81613951565b9350606087013567ffffffffffffffff8111156139ea575f5ffd5b6139f689828a01613933565b9350506080870135613a07816137cc565b9598949750929591949360a090920135925050565b5f60208284031215613a2c575f5ffd5b8135613a37816137cc565b9392505050565b5f5f60408385031215613a4f575f5ffd5b8235613a5a816137cc565b9150602083013567ffffffffffffffff811115613a75575f5ffd5b8301601f81018513613a85575f5ffd5b613a94858235602084016138f8565b9150509250929050565b602080825282518282018190525f918401906040840190835b81811015613ad857835160ff16835260209384019390920191600101613ab7565b509095945050505050565b5f60208284031215613af3575f5ffd5b813567ffffffffffffffff811115613b09575f5ffd5b6117c484828501613933565b5f60208284031215613b25575f5ffd5b5035919050565b6001600160a01b0385168152608060208201525f613b4d608083018661378c565b6040830194909452506060015292915050565b604081525f613b72604083018561378c565b90508260208301529392505050565b5f5f5f5f5f5f5f60e0888a031215613b97575f5ffd5b8735613ba2816137cc565b96506020880135613bb2816137cc565b955060408801359450606088013593506080880135613bd081613951565b9699959850939692959460a0840135945060c09093013592915050565b5f5f60408385031215613bfe575f5ffd5b8235613c09816137cc565b91506020830135613819816137cc565b5f60208284031215613c29575f5ffd5b8151613a37816137e0565b600181811c90821680613c4857607f821691505b602082108103613c6657634e487b7160e01b5f52602260045260245ffd5b50919050565b601f821115610c4857805f5260205f20601f840160051c81016020851015613c915750805b601f840160051c820191505b81811015613cb0575f8155600101613c9d565b5050505050565b815167ffffffffffffffff811115613cd157613cd161388c565b613ce581613cdf8454613c34565b84613c6c565b6020601f821160018114613d17575f8315613d005750848201515b5f19600385901b1c1916600184901b178455613cb0565b5f84815260208120601f198516915b82811015613d465787850151825560209485019460019092019101613d26565b5084821015613d6357868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b5f604082016001600160a01b0385168352604060208401528084518083526060850191506020860192505f5b81811015613dc057835161ffff16835260209384019390920191600101613d9e565b50909695505050505050565b5f60208284031215613ddc575f5ffd5b815167ffffffffffffffff811115613df2575f5ffd5b8201601f81018413613e02575f5ffd5b805167ffffffffffffffff811115613e1c57613e1c61388c565b8060051b613e2c602082016138a0565b91825260208184018101929081019087841115613e47575f5ffd5b6020850194505b83851015613e755784519250613e6383613951565b82825260209485019490910190613e4e565b979650505050505050565b5f60208284031215613e90575f5ffd5b8151613a3781613951565b634e487b7160e01b5f52603260045260245ffd5b604081525f613ec1604083018561378c565b8281036020840152613ed3818561378c565b95945050505050565b805169ffffffffffffffffffff811681146123ab575f5ffd5b5f5f5f5f5f60a08688031215613f09575f5ffd5b613f1286613edc565b60208701516040880151606089015192975090955093509150613f3760808701613edc565b90509295509295909350565b5f60208284031215613f53575f5ffd5b5051919050565b5f613f67613905846138d1565b9050828152838383011115613f7a575f5ffd5b8282602083015e5f602084830101529392505050565b5f82601f830112613f9f575f5ffd5b6107fe83835160208501613f5a565b5f60208284031215613fbe575f5ffd5b815167ffffffffffffffff811115613fd4575f5ffd5b6117c484828501613f90565b5f60208284031215613ff0575f5ffd5b815167ffffffffffffffff811115614006575f5ffd5b8201601f81018413614016575f5ffd5b6117c484825160208401613f5a565b5f82518060208501845e5f920191825250919050565b634e487b7160e01b5f52601160045260245ffd5b818103818111156108015761080161403b565b808201808211156108015761080161403b565b5f5f835461408281613c34565b60018216801561409957600181146140ae576140db565b60ff19831686528115158202860193506140db565b865f5260205f205f5b838110156140d3578154888201526001909101906020016140b7565b505081860193505b509195945050505050565b5f5f604083850312156140f7575f5ffd5b8251614102816137cc565b602084015190925067ffffffffffffffff81111561411e575f5ffd5b613a9485828601613f90565b6001600160a01b0385168152836020820152608060408201525f614151608083018561378c565b905082606083015295945050505050565b6001600160a01b0383168152604060208201525f6117c4604083018461378c565b5f600182016141945761419461403b565b506001019056fe1626844f871e5080d673ecb96ea8a32c7bdf671ea137282b2886cd9d0fd9a700112dd7b7d700a9bfd03edf4d4ce6f92b1f5f1a2fd81fde871f4db11384aa0b00360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbcfedd7b171e5aaf71411eb61c81513b977191128c387240284b4edb396fcbdb002c9356b94ada349e65b0a691cd15e24beddfc13e05a26de25d9c64509c8244001fa5656f3245be71aa51744436d19e5d46b909e499930c5c32c93901cab5290067df8e602072ae967fe4567cec1273e29da0bd7a5a1af20d9b5c8d3f0d838500a264697066735822122035e0410d4d866dbce71da568bdb6a948e20748cc7ea05eb3930bbfd8a939035964736f6c634300081e0033","recompiledBytecode":"0x60a0604052306080523480156012575f5ffd5b506080516142b16100395f395f8181611fdb0152818161200401526123d701526142b15ff3fe608060405234801561000f575f5ffd5b5060043610610325575f3560e01c806364dad32f116101a85780639fc1d0e7116100f3578063c9c16fbd1161009e578063dd62ed3e11610079578063dd62ed3e1461066c578063ef3e8f221461067f578063f2e23d2214610692578063f8fa842b1461069a575f5ffd5b8063c9c16fbd1461063e578063d4a1911614610651578063d505accf14610659575f5ffd5b8063b187bd26116100ce578063b187bd2614610619578063bf4dc4b614610621578063c1491c5814610628575f5ffd5b80639fc1d0e7146105eb578063a9059cbb146105fe578063aaf10f4214610611575f5ffd5b80638456cb591161015357806398d2082f1161012e57806398d2082f1461059857806398d5fdca146105bb5780639dc29fac146105d8575f5ffd5b80638456cb591461057557806395d89b411461057d57806398cd615314610585575f5ffd5b80637ab8bf5a116101835780637ab8bf5a146105475780637e8962141461055a5780637ecebe0014610562575f5ffd5b806364dad32f1461050e5780636d70f7ae1461052157806370a0823114610534575f5ffd5b80633f4ba83a116102735780634f1ef2861161021e5780635845394b116101f95780635845394b146104aa5780635965959e146104d55780635ca13f04146104e85780635d3590d5146104fb575f5ffd5b80634f1ef2861461048757806352d1902d1461049a57806355f29166146104a2575f5ffd5b8063426796831161024e578063426796831461044e578063440fde4e1461046157806346fbf68e14610474575f5ffd5b80633f4ba83a1461041e57806340c10f1914610426578063422f8c0a14610439575f5ffd5b80632d524393116102d357806334cdcf26116102ae57806334cdcf26146103fb5780633644e5151461040e578063392e53cd14610416575f5ffd5b80632d524393146103bb578063313ce567146103ce57806333999fa6146103e8575f5ffd5b806318160ddd1161030357806318160ddd1461037f57806323b872dd14610395578063257e224c146103a8575f5ffd5b806306fdde031461032957806307e2a26014610347578063095ea7b31461035c575b5f5ffd5b6103316106a2565b60405161033e91906137ba565b60405180910390f35b61035a6103553660046137ed565b6106b1565b005b61036f61036a366004613824565b6107ad565b604051901515815260200161033e565b610387610807565b60405190815260200161033e565b61036f6103a336600461384e565b610830565b61035a6103b636600461395f565b6109b0565b61036f6103c9366004613a1c565b610a33565b6103d6610ad3565b60405160ff909116815260200161033e565b61035a6103f6366004613a3e565b610aff565b61036f610409366004613a1c565b610b0d565b610387610b2b565b61036f610b34565b61035a610b4a565b61035a610434366004613824565b610b69565b610441610c4d565b60405161033e9190613a9e565b61036f61045c366004613a1c565b610dc0565b61035a61046f366004613a1c565b610dde565b61036f610482366004613a1c565b610e7e565b61035a610495366004613a3e565b610e9c565b610387610eae565b61035a610ebf565b6001546104bd906001600160a01b031681565b6040516001600160a01b03909116815260200161033e565b61035a6104e33660046137ed565b610ef3565b61035a6104f63660046137ed565b610fe3565b61035a61050936600461384e565b6110d3565b61036f61051c366004613a1c565b611123565b61036f61052f366004613a1c565b611141565b610387610542366004613a1c565b61115f565b61036f610555366004613a1c565b61119b565b61035a6111b9565b610387610570366004613a1c565b6111ed565b61035a611229565b610331611246565b61035a610593366004613ae3565b611250565b6105ab6105a6366004613b15565b611399565b60405161033e9493929190613b2c565b6105c36113b6565b6040805192835260208301919091520161033e565b61035a6105e6366004613824565b6114d0565b61035a6105f936600461384e565b6115af565b61036f61060c366004613824565b6116e3565b6104bd6117cc565b61036f6117e2565b600161036f565b6106306117fb565b60405161033e929190613b60565b61035a61064c3660046137ed565b61192f565b610331611a1e565b61035a610667366004613b81565b611aa9565b61038761067a366004613bed565b611b97565b61035a61068d366004613a1c565b611be2565b6104bd611c03565b610331611c22565b60606106ac611cc5565b905090565b6106c6335f356001600160e01b031916611d66565b5f5160206141fc5f395f51905f525460ff16156106f65760405163ab35696f60e01b815260040160405180910390fd5b6106fe611c03565b604051636bcd157760e11b81525f60048201526001600160a01b0384811660248301528315156044830152919091169063d79a2aee906064015f604051808303815f87803b15801561074e575f5ffd5b505af1158015610760573d5f5f3e3d5ffd5b50505050816001600160a01b03167fd4145d5d40015b9d77048466bbe3ff2411630f7b70f80f9d79c273b6311aba74826040516107a1911515815260200190565b60405180910390a25050565b5f6107c3335f356001600160e01b031916611d66565b5f5160206141fc5f395f51905f525460ff16156107f35760405163ab35696f60e01b815260040160405180910390fd5b6107fe338484611e69565b90505b92915050565b5f6106ac7f67df8e602072ae967fe4567cec1273e29da0bd7a5a1af20d9b5c8d3f0d8385035490565b5f610846335f356001600160e01b031916611d66565b6040516364dad32f60e01b81526001600160a01b0385166004820152849030906364dad32f90602401602060405180830381865afa15801561088a573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108ae9190613c19565b6108db576040516326865f9b60e21b81526001600160a01b03821660048201526024015b60405180910390fd5b6040516364dad32f60e01b81526001600160a01b0385166004820152849030906364dad32f90602401602060405180830381865afa15801561091f573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109439190613c19565b61096b576040516326865f9b60e21b81526001600160a01b03821660048201526024016108d2565b5f5160206141fc5f395f51905f525460ff161561099b5760405163ab35696f60e01b815260040160405180910390fd5b6109a6868686611f3c565b9695505050505050565b6109b8611fd0565b5f5160206141bc5f395f51905f5254156109e55760405163f92ee8a960e01b815260040160405180910390fd5b6109ed61206b565b6109f88686866120a6565b610a0182612122565b610a0a81612148565b5f8054610a1690613c34565b90505f03610a2b575f610a298482613cb7565b505b505050505050565b5f610a3c611c03565b6001600160a01b031663970f8482835f5b604051908082528060200260200182016040528015610a76578160200160208202803683370190505b506040518363ffffffff1660e01b8152600401610a94929190613d72565b602060405180830381865afa158015610aaf573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108019190613c19565b5f6106ac7f67df8e602072ae967fe4567cec1273e29da0bd7a5a1af20d9b5c8d3f0d8385025460ff1690565b610b098282612188565b5050565b5f610b16611c03565b6001600160a01b031663f5fe5787835f610a4d565b5f6106ac6121dd565b5f6106ac5f5160206141bc5f395f51905f525490565b610b5f335f356001600160e01b031916611d66565b610b6761222c565b565b610b7e335f356001600160e01b031916611d66565b6040516364dad32f60e01b81526001600160a01b0383166004820152829030906364dad32f90602401602060405180830381865afa158015610bc2573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610be69190613c19565b610c0e576040516326865f9b60e21b81526001600160a01b03821660048201526024016108d2565b5f5160206141fc5f395f51905f525460ff1615610c3e5760405163ab35696f60e01b815260040160405180910390fd5b610c48838361229c565b505050565b6001546060906001600160a01b0316610c7b57604051631f93601760e01b81525f60048201526024016108d2565b600154610c90906001600160a01b0316612339565b15610d0b5760015f9054906101000a90046001600160a01b03166001600160a01b0316639d91348d6040518163ffffffff1660e01b81526004015f60405180830381865afa158015610ce4573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526106ac9190810190613dcc565b6040805160018082528183019092525f916020808301908036833750506001546040805163313ce56760e01b815290519394506001600160a01b039091169263313ce567925060048083019260209291908290030181865afa158015610d73573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d979190613e80565b815f81518110610da957610da9613e9b565b60ff90921660209283029190910190910152919050565b5f610dc9611c03565b6001600160a01b031663ffb2f26f835f610a4d565b610df3335f356001600160e01b031916611d66565b6001546001600160a01b039081169082168103610e2e57604051631eeb14f160e01b81526001600160a01b03831660048201526024016108d2565b600180546001600160a01b0319166001600160a01b0384811691821790925560405190918316907fd76fb624f0e2e090c9f82772a08d122c79250c90c7a896b1ed0de8bbe3e9e2e4905f90a35050565b5f610e87611c03565b6001600160a01b0316636f06fa43835f610a4d565b610ea4611fd0565b610b0982826123b0565b5f610eb76123cc565b6106ac612415565b5f51602061421c5f395f51905f5254610eeb57604051630604a9ff60e01b815260040160405180910390fd5b610b67612430565b610f08335f356001600160e01b031916611d66565b5f5160206141fc5f395f51905f525460ff1615610f385760405163ab35696f60e01b815260040160405180910390fd5b610f40611c03565b604051632b73cd6360e21b81525f60048201526001600160a01b0384811660248301528315156044830152919091169063adcf358c906064015f604051808303815f87803b158015610f90575f5ffd5b505af1158015610fa2573d5f5f3e3d5ffd5b50505050816001600160a01b03167fc71e52f779c12ade7cbf75a51deb27377b5addd6a3945e0b356bff858ffad7fb826040516107a1911515815260200190565b610ff8335f356001600160e01b031916611d66565b5f5160206141fc5f395f51905f525460ff16156110285760405163ab35696f60e01b815260040160405180910390fd5b611030611c03565b60405163361fa22b60e01b81525f60048201526001600160a01b0384811660248301528315156044830152919091169063361fa22b906064015f604051808303815f87803b158015611080575f5ffd5b505af1158015611092573d5f5f3e3d5ffd5b50505050816001600160a01b03167f6b410344a541a2ad2ffec50ea1cafabe58c50db82f72ae4f46a4bd2419155b15826040516107a1911515815260200190565b6110e8335f356001600160e01b031916611d66565b5f5160206141fc5f395f51905f525460ff16156111185760405163ab35696f60e01b815260040160405180910390fd5b610c4883838361247b565b5f61112c611c03565b6001600160a01b031663f2563ef3835f610a4d565b5f61114a611c03565b6001600160a01b031663394340e8835f610a4d565b6001600160a01b0381165f9081527f67df8e602072ae967fe4567cec1273e29da0bd7a5a1af20d9b5c8d3f0d8385046020526040812054610801565b5f6111a4611c03565b6001600160a01b03166378143d56835f610a4d565b5f51602061421c5f395f51905f52546111e557604051630604a9ff60e01b815260040160405180910390fd5b610b67612730565b6001600160a01b0381165f9081527f67df8e602072ae967fe4567cec1273e29da0bd7a5a1af20d9b5c8d3f0d8385086020526040812054610801565b61123e335f356001600160e01b031916611d66565b610b67612771565b60606106ac6127e5565b611265335f356001600160e01b031916611d66565b5f5160206141fc5f395f51905f525460ff16156112955760405163ab35696f60e01b815260040160405180910390fd5b5f5f80546112a290613c34565b80601f01602080910402602001604051908101604052809291908181526020018280546112ce90613c34565b80156113195780601f106112f057610100808354040283529160200191611319565b820191905f5260205f20905b8154815290600101906020018083116112fc57829003601f168201915b5050505050905081805190602001208180519060200120036113505781604051638651f2a560e01b81526004016108d291906137ba565b5f61135b8382613cb7565b507ffd07e2c2d6dc82f4d6b1b46f25e49eb888aba92d238fb40945856412cce2f2dd818360405161138d929190613eaf565b60405180910390a15050565b5f60605f5f6113a785612823565b93509350935093509193509193565b6001545f9081906001600160a01b031615806113e257506001546113e2906001600160a01b0316612339565b1561140f57600154604051631f93601760e01b81526001600160a01b0390911660048201526024016108d2565b60015f9054906101000a90046001600160a01b03166001600160a01b031663feaf968c6040518163ffffffff1660e01b815260040160a060405180830381865afa15801561145f573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906114839190613ef5565b5091945090925050505f8190036114ad57604051638ad52bdd60e01b815260040160405180910390fd5b5f82136114cc5760405162bfc92160e01b815260040160405180910390fd5b9091565b6114e5335f356001600160e01b031916611d66565b6040516364dad32f60e01b81526001600160a01b0383166004820152829030906364dad32f90602401602060405180830381865afa158015611529573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061154d9190613c19565b611575576040516326865f9b60e21b81526001600160a01b03821660048201526024016108d2565b5f5160206141fc5f395f51905f525460ff16156115a55760405163ab35696f60e01b815260040160405180910390fd5b610c48838361294f565b6040516364dad32f60e01b81526001600160a01b0383166004820152829030906364dad32f90602401602060405180830381865afa1580156115f3573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906116179190613c19565b61163f576040516326865f9b60e21b81526001600160a01b03821660048201526024016108d2565b611654335f356001600160e01b031916611d66565b5f5160206141fc5f395f51905f525460ff16156116845760405163ab35696f60e01b815260040160405180910390fd5b61168f8484846129f1565b50826001600160a01b0316846001600160a01b03167f7b3ce50c216d2ccf9919c6b9f1bfb33f0350a33010f188750b4af38e00448138846040516116d591815260200190565b60405180910390a350505050565b5f6116f9335f356001600160e01b031916611d66565b6040516364dad32f60e01b81526001600160a01b0384166004820152839030906364dad32f90602401602060405180830381865afa15801561173d573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906117619190613c19565b611789576040516326865f9b60e21b81526001600160a01b03821660048201526024016108d2565b5f5160206141fc5f395f51905f525460ff16156117b95760405163ab35696f60e01b815260040160405180910390fd5b6117c43385856129f1565b949350505050565b5f6106ac5f5160206141dc5f395f51905f525490565b5f6106ac5f5160206141fc5f395f51905f525460ff1690565b6001546060905f906001600160a01b0316158061182a5750600154611828906001600160a01b0316612339565b155b1561185757600154604051631f93601760e01b81526001600160a01b0390911660048201526024016108d2565b600154604080516328f5843360e21b815290516001600160a01b0390921691829163a3d610cc9160048083019260209291908290030181865afa1580156118a0573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906118c49190613f43565b9150806001600160a01b0316639198274f6040518163ffffffff1660e01b81526004015f60405180830381865afa158015611901573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526119289190810190613fae565b9250509091565b611944335f356001600160e01b031916611d66565b5f5160206141fc5f395f51905f525460ff16156119745760405163ab35696f60e01b815260040160405180910390fd5b61197c611c03565b604051624ff82360e21b81525f60048201526001600160a01b0384811660248301528315156044830152919091169063013fe08c906064015f604051808303815f87803b1580156119cb575f5ffd5b505af11580156119dd573d5f5f3e3d5ffd5b50505050816001600160a01b03167f5e20cf47b2259b331d4b7c60c19f771fc77bd7b207cb6438d0d217ea67755b57826040516107a1911515815260200190565b5f8054611a2a90613c34565b80601f0160208091040260200160405190810160405280929190818152602001828054611a5690613c34565b8015611aa15780601f10611a7857610100808354040283529160200191611aa1565b820191905f5260205f20905b815481529060010190602001808311611a8457829003601f168201915b505050505081565b611abe335f356001600160e01b031916611d66565b6040516364dad32f60e01b81526001600160a01b0388166004820152879030906364dad32f90602401602060405180830381865afa158015611b02573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611b269190613c19565b611b4e576040516326865f9b60e21b81526001600160a01b03821660048201526024016108d2565b5f5160206141fc5f395f51905f525460ff1615611b7e5760405163ab35696f60e01b815260040160405180910390fd5b611b8d88888888888888612ade565b5050505050505050565b6001600160a01b038083165f9081527f67df8e602072ae967fe4567cec1273e29da0bd7a5a1af20d9b5c8d3f0d838505602090815260408083209385168352929052908120546107fe565b611bf7335f356001600160e01b031916611d66565b611c0081612d08565b50565b5f6106ac5f51602061423c5f395f51905f52546001600160a01b031690565b6001546060906001600160a01b0316611c5057604051631f93601760e01b81525f60048201526024016108d2565b60015460408051633942720b60e11b815290516001600160a01b03909216918291637284e416916004808301925f9291908290030181865afa158015611c98573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611cbf9190810190613fe0565b91505090565b5f51602061425c5f395f51905f528054606091908190611ce490613c34565b80601f0160208091040260200160405190810160405280929190818152602001828054611d1090613c34565b8015611d5b5780601f10611d3257610100808354040283529160200191611d5b565b820191905f5260205f20905b815481529060010190602001808311611d3e57829003601f168201915b505050505091505090565b5f5f611d865f51602061423c5f395f51905f52546001600160a01b031690565b6040516001600160a01b0386811660248301526001600160e01b031986166044830152919091169060640160408051601f198184030181529181526020820180516001600160e01b0316630435f69f60e51b17905251611de69190614025565b5f60405180830381855afa9150503d805f8114611e1e576040519150601f19603f3d011682016040523d82523d5f602084013e611e23565b606091505b5091509150811580611e46575080806020019051810190611e449190613c19565b155b15611e63576040516282b42960e81b815260040160405180910390fd5b50505050565b5f6001600160a01b0384161580611e8757506001600160a01b038316155b15611ea55760405163d92e233d60e01b815260040160405180910390fd5b6001600160a01b038481165f8181527f67df8e602072ae967fe4567cec1273e29da0bd7a5a1af20d9b5c8d3f0d838505602090815260408083209488168084529482529182902086905590518581525f51602061425c5f395f51905f529392917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3506001949350505050565b6001600160a01b0383165f9081527f67df8e602072ae967fe4567cec1273e29da0bd7a5a1af20d9b5c8d3f0d838505602090815260408083203384529091528120545f51602061425c5f395f51905f52905f198114611fc557611f9f848261404f565b6001600160a01b0387165f90815260058401602090815260408083203384529091529020555b6109a68686866129f1565b306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148061204d57507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166120415f5160206141dc5f395f51905f525490565b6001600160a01b031614155b15610b675760405163703e46dd60e11b815260040160405180910390fd5b60015f5160206141bc5f395f51905f52556040517f5daa87a0e9463431830481fd4b6e3403442dfb9a12b9c07597e9f61d50b633c8905f90a1565b7f67df8e602072ae967fe4567cec1273e29da0bd7a5a1af20d9b5c8d3f0d838506545f51602061425c5f395f51905f52905f03611e6357806120e88582613cb7565b50600181016120f78482613cb7565b5060028101805460ff191660ff8416179055466006820155612117612d36565b600782015550505050565b5f51602061423c5f395f51905f5280546001600160a01b0316610b0957610b0982612d08565b7f2c9356b94ada349e65b0a691cd15e24beddfc13e05a26de25d9c64509c824401545f51602061421c5f395f51905f52905f03610b0957610b0982612de0565b604051309033907f16f2354671bbabcb07367cc01a78931a00a812ee080430be4e8f1a76ab58212b905f90a33330146121d35760405162e6155960e41b815260040160405180910390fd5b610b098282612e24565b7f67df8e602072ae967fe4567cec1273e29da0bd7a5a1af20d9b5c8d3f0d838506545f905f51602061425c5f395f51905f529046146122235761221e612d36565b611cbf565b60070154919050565b5f5160206141fc5f395f51905f525460ff1661225b5760405163dcdde9dd60e01b815260040160405180910390fd5b5f5160206141fc5f395f51905f52805460ff191681556040517fa45f47fdea8a1efdd9029a5691c7f759c32b7c698632b563573e155625d16933905f90a150565b7f67df8e602072ae967fe4567cec1273e29da0bd7a5a1af20d9b5c8d3f0d83850380545f51602061425c5f395f51905f529183915f906122dd908490614062565b90915550506001600160a01b0383165f8181526004830160209081526040808320805487019055518581527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91015b60405180910390a3505050565b5f816001600160a01b0316639d91348d6040518163ffffffff1660e01b81526004015f60405180830381865afa92505050801561239757506040513d5f823e601f3d908101601f191682016040526123949190810190613dcc565b60015b6123a257505f919050565b50600192915050565b919050565b6123b8611fd0565b6123c28282612e42565b610b098282612e97565b306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610b675760405163703e46dd60e11b815260040160405180910390fd5b5f61241e6123cc565b505f5160206141dc5f395f51905f5290565b5f51602061421c5f395f51905f5280545f61244a82611399565b50509150505f5f61245a83612ea1565b915091506124688282612e42565b61247184612ef4565b50505f9092555050565b5f806001600160a01b038516612501576040516001600160a01b0385169084905f81818185875af1925050503d805f81146124d1576040519150601f19603f3d011682016040523d82523d5f602084013e6124d6565b606091505b505080925050816124fa576040516312171d8360e31b815260040160405180910390fd5b50816126d3565b6040516370a0823160e01b81526001600160a01b03858116600483015286915f918316906370a0823190602401602060405180830381865afa158015612549573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061256d9190613f43565b604080516001600160a01b03898116602483015260448083018a905283518084039091018152606490920183526020820180516001600160e01b031663a9059cbb60e01b1790529151929350606092918a16916125ca9190614025565b5f604051808303815f865af19150503d805f8114612603576040519150601f19603f3d011682016040523d82523d5f602084013e612608565b606091505b50909550905084158061263757505f81511180156126375750808060200190518101906126359190613c19565b155b15612655576040516312171d8360e31b815260040160405180910390fd5b6040516370a0823160e01b81526001600160a01b0388811660048301525f91908516906370a0823190602401602060405180830381865afa15801561269c573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906126c09190613f43565b90506126cc838261404f565b9450505050505b836001600160a01b0316856001600160a01b03167f7a43eea7e0e6937c4baa97b10dabb89519feb249fe9ddcb442415b029148520d8584604051612721929190918252602082015260400190565b60405180910390a35050505050565b5f51602061421c5f395f51905f5280545f61274a82611399565b50509150505f5f61275a83612ea1565b915091506127688282612e42565b61247184612faf565b5f5160206141fc5f395f51905f525460ff16156127a15760405163ab35696f60e01b815260040160405180910390fd5b5f5160206141fc5f395f51905f52805460ff191660011781556040517f9e87fac88ff661f02d44f95383c817fece4bce600a3dab7a54406878b965e752905f90a150565b7f67df8e602072ae967fe4567cec1273e29da0bd7a5a1af20d9b5c8d3f0d83850180546060915f51602061425c5f395f51905f5291611ce490613c34565b5f8181527f1626844f871e5080d673ecb96ea8a32c7bdf671ea137282b2886cd9d0fd9a70260209081526040808320815160808101835281546001600160a01b03168152600182015493810193909352600281018054606094869485945f51602061419c5f395f51905f52948694919284019161289f90613c34565b80601f01602080910402602001604051908101604052809291908181526020018280546128cb90613c34565b80156129165780601f106128ed57610100808354040283529160200191612916565b820191905f5260205f20905b8154815290600101906020018083116128f957829003601f168201915b505050505081526020016003820154815250509050805f0151816040015182602001518360600151955095509550955050509193509193565b6001600160a01b0382165f9081527f67df8e602072ae967fe4567cec1273e29da0bd7a5a1af20d9b5c8d3f0d8385046020526040812080545f51602061425c5f395f51905f52928492916129a490849061404f565b909155505060038101805483900390556040518281525f906001600160a01b038516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200161232c565b5f6001600160a01b0384161580612a0f57506001600160a01b038316155b15612a2d5760405163d92e233d60e01b815260040160405180910390fd5b6001600160a01b0384165f9081527f67df8e602072ae967fe4567cec1273e29da0bd7a5a1af20d9b5c8d3f0d8385046020526040812080545f51602061425c5f395f51905f5292859291612a8290849061404f565b90915550506001600160a01b038085165f818152600484016020526040908190208054870190555190918716907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90611f299087815260200190565b42841015612aff576040516305787bdf60e01b815260040160405180910390fd5b6001600160a01b0387165f9081527f67df8e602072ae967fe4567cec1273e29da0bd7a5a1af20d9b5c8d3f0d83850860205260408120805460018082019092555f51602061425c5f395f51905f52929091612b586121dd565b604080517f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c960208201526001600160a01b03808f1692820192909252908c166060820152608081018b905260a0810185905260c081018a905260e00160405160208183030381529060405280519060200120604051602001612bf192919061190160f01b81526002810192909252602282015260420190565b60408051601f1981840301815282825280516020918201205f84529083018083525260ff891690820152606081018790526080810186905260a0016020604051602081039080840390855afa158015612c4c573d5f5f3e3d5ffd5b5050604051601f1901519150506001600160a01b0381161580612c815750896001600160a01b0316816001600160a01b031614155b15612c9f57604051632057875960e21b815260040160405180910390fd5b50506001600160a01b038881165f8181526005840160209081526040808320948c16808452948252918290208a905590518981527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a35050505050505050565b5f51602061423c5f395f51905f5280546001600160a01b0319166001600160a01b0392909216919091179055565b6040515f905f51602061425c5f395f51905f52907f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f90612d77908390614075565b6040805191829003822060208301939093528101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608201524660808201523060a082015260c0016040516020818303038152906040528051906020012091505090565b805f03612e00576040516327df2edd60e11b815260040160405180910390fd5b7f2c9356b94ada349e65b0a691cd15e24beddfc13e05a26de25d9c64509c82440155565b612e2e8282613202565b612e38828261321e565b610b098282613273565b612e4a611c03565b6001600160a01b0316336001600160a01b031614610b095733612e6b611c03565b60405163fe6cd27560e01b81526001600160a01b039283166004820152911660248201526044016108d2565b610b0982826132a6565b5f6060606483511015612ec75760405163fc69850b60e01b815260040160405180910390fd5b8251612ed7908490600490613363565b806020019051810190612eea91906140e6565b9094909350915050565b5f8181527f1626844f871e5080d673ecb96ea8a32c7bdf671ea137282b2886cd9d0fd9a70160205260409020545f51602061419c5f395f51905f529015610b09575f8281526001808301602090815260408084208490556002808601909252832080546001600160a01b0319168155918201839055909190612f7890830182613742565b505f60039190910181905560405183917f134fdd648feeaf30251f0157f9624ef8608ff9a042aad6d13e73f35d21d3f88d91a25050565b612fb8816133e2565b5f8181527f1626844f871e5080d673ecb96ea8a32c7bdf671ea137282b2886cd9d0fd9a70260209081526040808320815160808101835281546001600160a01b031681526001820154938101939093526002810180545f51602061419c5f395f51905f529594938401919061302c90613c34565b80601f016020809104026020016040519081016040528092919081815260200182805461305890613c34565b80156130a35780601f1061307a576101008083540402835291602001916130a3565b820191905f5260205f20905b81548152906001019060200180831161308657829003601f168201915b50505091835250506003919091015460209182015281519082015160408301519293509091478211156130f15760405162fae2d560e21b8152600481018390524760248201526044016108d2565b5f8681526001808701602090815260408084208490556002808a01909252832080546001600160a01b031916815591820183905590919061313490830182613742565b600382015f905550505f836001600160a01b031683836040516131579190614025565b5f6040518083038185875af1925050503d805f8114613191576040519150601f19603f3d011682016040523d82523d5f602084013e613196565b606091505b50509050806131bb5760405163165a1d4160e01b8152600481018890526024016108d2565b867fbc76564aec85e3f50672da2d1ddca0390851fecefe61cd19d89dea91a8267829858585426040516131f1949392919061412a565b60405180910390a250505050505050565b805115610b0957610b095f5f5160206141bc5f395f51905f5255565b6132278261345f565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a280511561326b57610c488282613479565b610b09613505565b5f81511180156132885750613286610b34565b155b15610b095760405163b3a31bfd60e01b815260040160405180910390fd5b5f51602061421c5f395f51905f5254156132d35760405163e741fd4560e01b815260040160405180910390fd5b7f2c9356b94ada349e65b0a691cd15e24beddfc13e05a26de25d9c64509c824401545f51602061421c5f395f51905f52905f906133109042614062565b90505f61335a30868660405160240161332a929190614162565b60408051601f198184030181529190526020810180516001600160e01b03166319cccfd360e11b17905284613524565b90925550505050565b606061337082855161363e565b915061337c838361363e565b9250613388838361404f565b67ffffffffffffffff8111156133a0576133a061388c565b6040519080825280601f01601f1916602001820160405280156133ca576020820181803683370190505b509050828203836020860101602083015e9392505050565b5f8181527f1626844f871e5080d673ecb96ea8a32c7bdf671ea137282b2886cd9d0fd9a70160205260408120545f51602061419c5f395f51905f529181900361343e57604051634b9aaa0960e11b815260040160405180910390fd5b80421015610c4857604051630f0b32ff60e11b815260040160405180910390fd5b61346881613653565b5f5160206141dc5f395f51905f5255565b60605f5f846001600160a01b0316846040516134959190614025565b5f60405180830381855af49150503d805f81146134cd576040519150601f19603f3d011682016040523d82523d5f602084013e6134d2565b606091505b5091509150816117c4578051156134ec5780518082602001fd5b60405163d6bda27560e01b815260040160405180910390fd5b3415610b675760405163b398979f60e01b815260040160405180910390fd5b5f8142106135455760405163b7d0949760e01b815260040160405180910390fd5b5f51602061419c5f395f51905f5280543490825f61356283614183565b909155505081545f81815260018085016020908152604080842089905580516080810182526001600160a01b038c811682528184018881528284018d8152606084018d90528888526002808c0190965293909620825181546001600160a01b0319169216919091178155945193850193909355519396509092908201906135e99082613cb7565b5060608201518160030155905050827f8d6fedd41517ab865c3658696c50923b3493c8a93ffd016d919a599f03c7531b8783888860405161362d949392919061412a565b60405180910390a250509392505050565b5f81831061364c57816107fe565b5090919050565b806001600160a01b03163b5f0361368857604051634c9c8ce360e01b81526001600160a01b03821660048201526024016108d2565b806001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa9250505080156136e2575060408051601f3d908101601f191682019092526136df91810190613f43565b60015b61370a57604051634c9c8ce360e01b81526001600160a01b03821660048201526024016108d2565b5f5160206141dc5f395f51905f528114610b0957604051634c9c8ce360e01b81526001600160a01b03831660048201526024016108d2565b50805461374e90613c34565b5f825580601f1061375d575050565b601f0160209004905f5260205f2090810190611c0091905b80821115613788575f8155600101613775565b5090565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f6107fe602083018461378c565b6001600160a01b0381168114611c00575f5ffd5b8015158114611c00575f5ffd5b5f5f604083850312156137fe575f5ffd5b8235613809816137cc565b91506020830135613819816137e0565b809150509250929050565b5f5f60408385031215613835575f5ffd5b8235613840816137cc565b946020939093013593505050565b5f5f5f60608486031215613860575f5ffd5b833561386b816137cc565b9250602084013561387b816137cc565b929592945050506040919091013590565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f1916810167ffffffffffffffff811182821017156138c9576138c961388c565b604052919050565b5f67ffffffffffffffff8211156138ea576138ea61388c565b50601f01601f191660200190565b5f61390a613905846138d1565b6138a0565b905082815283838301111561391d575f5ffd5b828260208301375f602084830101529392505050565b5f82601f830112613942575f5ffd5b6107fe838335602085016138f8565b60ff81168114611c00575f5ffd5b5f5f5f5f5f5f60c08789031215613974575f5ffd5b863567ffffffffffffffff81111561398a575f5ffd5b61399689828a01613933565b965050602087013567ffffffffffffffff8111156139b2575f5ffd5b6139be89828a01613933565b95505060408701356139cf81613951565b9350606087013567ffffffffffffffff8111156139ea575f5ffd5b6139f689828a01613933565b9350506080870135613a07816137cc565b9598949750929591949360a090920135925050565b5f60208284031215613a2c575f5ffd5b8135613a37816137cc565b9392505050565b5f5f60408385031215613a4f575f5ffd5b8235613a5a816137cc565b9150602083013567ffffffffffffffff811115613a75575f5ffd5b8301601f81018513613a85575f5ffd5b613a94858235602084016138f8565b9150509250929050565b602080825282518282018190525f918401906040840190835b81811015613ad857835160ff16835260209384019390920191600101613ab7565b509095945050505050565b5f60208284031215613af3575f5ffd5b813567ffffffffffffffff811115613b09575f5ffd5b6117c484828501613933565b5f60208284031215613b25575f5ffd5b5035919050565b6001600160a01b0385168152608060208201525f613b4d608083018661378c565b6040830194909452506060015292915050565b604081525f613b72604083018561378c565b90508260208301529392505050565b5f5f5f5f5f5f5f60e0888a031215613b97575f5ffd5b8735613ba2816137cc565b96506020880135613bb2816137cc565b955060408801359450606088013593506080880135613bd081613951565b9699959850939692959460a0840135945060c09093013592915050565b5f5f60408385031215613bfe575f5ffd5b8235613c09816137cc565b91506020830135613819816137cc565b5f60208284031215613c29575f5ffd5b8151613a37816137e0565b600181811c90821680613c4857607f821691505b602082108103613c6657634e487b7160e01b5f52602260045260245ffd5b50919050565b601f821115610c4857805f5260205f20601f840160051c81016020851015613c915750805b601f840160051c820191505b81811015613cb0575f8155600101613c9d565b5050505050565b815167ffffffffffffffff811115613cd157613cd161388c565b613ce581613cdf8454613c34565b84613c6c565b6020601f821160018114613d17575f8315613d005750848201515b5f19600385901b1c1916600184901b178455613cb0565b5f84815260208120601f198516915b82811015613d465787850151825560209485019460019092019101613d26565b5084821015613d6357868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b5f604082016001600160a01b0385168352604060208401528084518083526060850191506020860192505f5b81811015613dc057835161ffff16835260209384019390920191600101613d9e565b50909695505050505050565b5f60208284031215613ddc575f5ffd5b815167ffffffffffffffff811115613df2575f5ffd5b8201601f81018413613e02575f5ffd5b805167ffffffffffffffff811115613e1c57613e1c61388c565b8060051b613e2c602082016138a0565b91825260208184018101929081019087841115613e47575f5ffd5b6020850194505b83851015613e755784519250613e6383613951565b82825260209485019490910190613e4e565b979650505050505050565b5f60208284031215613e90575f5ffd5b8151613a3781613951565b634e487b7160e01b5f52603260045260245ffd5b604081525f613ec1604083018561378c565b8281036020840152613ed3818561378c565b95945050505050565b805169ffffffffffffffffffff811681146123ab575f5ffd5b5f5f5f5f5f60a08688031215613f09575f5ffd5b613f1286613edc565b60208701516040880151606089015192975090955093509150613f3760808701613edc565b90509295509295909350565b5f60208284031215613f53575f5ffd5b5051919050565b5f613f67613905846138d1565b9050828152838383011115613f7a575f5ffd5b8282602083015e5f602084830101529392505050565b5f82601f830112613f9f575f5ffd5b6107fe83835160208501613f5a565b5f60208284031215613fbe575f5ffd5b815167ffffffffffffffff811115613fd4575f5ffd5b6117c484828501613f90565b5f60208284031215613ff0575f5ffd5b815167ffffffffffffffff811115614006575f5ffd5b8201601f81018413614016575f5ffd5b6117c484825160208401613f5a565b5f82518060208501845e5f920191825250919050565b634e487b7160e01b5f52601160045260245ffd5b818103818111156108015761080161403b565b808201808211156108015761080161403b565b5f5f835461408281613c34565b60018216801561409957600181146140ae576140db565b60ff19831686528115158202860193506140db565b865f5260205f205f5b838110156140d3578154888201526001909101906020016140b7565b505081860193505b509195945050505050565b5f5f604083850312156140f7575f5ffd5b8251614102816137cc565b602084015190925067ffffffffffffffff81111561411e575f5ffd5b613a9485828601613f90565b6001600160a01b0385168152836020820152608060408201525f614151608083018561378c565b905082606083015295945050505050565b6001600160a01b0383168152604060208201525f6117c4604083018461378c565b5f600182016141945761419461403b565b506001019056fe1626844f871e5080d673ecb96ea8a32c7bdf671ea137282b2886cd9d0fd9a700112dd7b7d700a9bfd03edf4d4ce6f92b1f5f1a2fd81fde871f4db11384aa0b00360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbcfedd7b171e5aaf71411eb61c81513b977191128c387240284b4edb396fcbdb002c9356b94ada349e65b0a691cd15e24beddfc13e05a26de25d9c64509c8244001fa5656f3245be71aa51744436d19e5d46b909e499930c5c32c93901cab5290067df8e602072ae967fe4567cec1273e29da0bd7a5a1af20d9b5c8d3f0d838500a264697066735822122035e0410d4d866dbce71da568bdb6a948e20748cc7ea05eb3930bbfd8a939035964736f6c634300081e0033","sourceMap":"1127:5125:5:-:0;;;1629:4:27;1586:48;;1127:5125:5;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;","linkReferences":{},"cborAuxdata":{"1":{"value":"0xa264697066735822122035e0410d4d866dbce71da568bdb6a948e20748cc7ea05eb3930bbfd8a939035964736f6c634300081e0033","offset":17077}},"transformations":[],"transformationValues":{}},"runtimeBytecode":{"onchainBytecode":"0x608060405234801561000f575f5ffd5b5060043610610325575f3560e01c806364dad32f116101a85780639fc1d0e7116100f3578063c9c16fbd1161009e578063dd62ed3e11610079578063dd62ed3e1461066c578063ef3e8f221461067f578063f2e23d2214610692578063f8fa842b1461069a575f5ffd5b8063c9c16fbd1461063e578063d4a1911614610651578063d505accf14610659575f5ffd5b8063b187bd26116100ce578063b187bd2614610619578063bf4dc4b614610621578063c1491c5814610628575f5ffd5b80639fc1d0e7146105eb578063a9059cbb146105fe578063aaf10f4214610611575f5ffd5b80638456cb591161015357806398d2082f1161012e57806398d2082f1461059857806398d5fdca146105bb5780639dc29fac146105d8575f5ffd5b80638456cb591461057557806395d89b411461057d57806398cd615314610585575f5ffd5b80637ab8bf5a116101835780637ab8bf5a146105475780637e8962141461055a5780637ecebe0014610562575f5ffd5b806364dad32f1461050e5780636d70f7ae1461052157806370a0823114610534575f5ffd5b80633f4ba83a116102735780634f1ef2861161021e5780635845394b116101f95780635845394b146104aa5780635965959e146104d55780635ca13f04146104e85780635d3590d5146104fb575f5ffd5b80634f1ef2861461048757806352d1902d1461049a57806355f29166146104a2575f5ffd5b8063426796831161024e578063426796831461044e578063440fde4e1461046157806346fbf68e14610474575f5ffd5b80633f4ba83a1461041e57806340c10f1914610426578063422f8c0a14610439575f5ffd5b80632d524393116102d357806334cdcf26116102ae57806334cdcf26146103fb5780633644e5151461040e578063392e53cd14610416575f5ffd5b80632d524393146103bb578063313ce567146103ce57806333999fa6146103e8575f5ffd5b806318160ddd1161030357806318160ddd1461037f57806323b872dd14610395578063257e224c146103a8575f5ffd5b806306fdde031461032957806307e2a26014610347578063095ea7b31461035c575b5f5ffd5b6103316106a2565b60405161033e91906137ba565b60405180910390f35b61035a6103553660046137ed565b6106b1565b005b61036f61036a366004613824565b6107ad565b604051901515815260200161033e565b610387610807565b60405190815260200161033e565b61036f6103a336600461384e565b610830565b61035a6103b636600461395f565b6109b0565b61036f6103c9366004613a1c565b610a33565b6103d6610ad3565b60405160ff909116815260200161033e565b61035a6103f6366004613a3e565b610aff565b61036f610409366004613a1c565b610b0d565b610387610b2b565b61036f610b34565b61035a610b4a565b61035a610434366004613824565b610b69565b610441610c4d565b60405161033e9190613a9e565b61036f61045c366004613a1c565b610dc0565b61035a61046f366004613a1c565b610dde565b61036f610482366004613a1c565b610e7e565b61035a610495366004613a3e565b610e9c565b610387610eae565b61035a610ebf565b6001546104bd906001600160a01b031681565b6040516001600160a01b03909116815260200161033e565b61035a6104e33660046137ed565b610ef3565b61035a6104f63660046137ed565b610fe3565b61035a61050936600461384e565b6110d3565b61036f61051c366004613a1c565b611123565b61036f61052f366004613a1c565b611141565b610387610542366004613a1c565b61115f565b61036f610555366004613a1c565b61119b565b61035a6111b9565b610387610570366004613a1c565b6111ed565b61035a611229565b610331611246565b61035a610593366004613ae3565b611250565b6105ab6105a6366004613b15565b611399565b60405161033e9493929190613b2c565b6105c36113b6565b6040805192835260208301919091520161033e565b61035a6105e6366004613824565b6114d0565b61035a6105f936600461384e565b6115af565b61036f61060c366004613824565b6116e3565b6104bd6117cc565b61036f6117e2565b600161036f565b6106306117fb565b60405161033e929190613b60565b61035a61064c3660046137ed565b61192f565b610331611a1e565b61035a610667366004613b81565b611aa9565b61038761067a366004613bed565b611b97565b61035a61068d366004613a1c565b611be2565b6104bd611c03565b610331611c22565b60606106ac611cc5565b905090565b6106c6335f356001600160e01b031916611d66565b5f5160206141fc5f395f51905f525460ff16156106f65760405163ab35696f60e01b815260040160405180910390fd5b6106fe611c03565b604051636bcd157760e11b81525f60048201526001600160a01b0384811660248301528315156044830152919091169063d79a2aee906064015f604051808303815f87803b15801561074e575f5ffd5b505af1158015610760573d5f5f3e3d5ffd5b50505050816001600160a01b03167fd4145d5d40015b9d77048466bbe3ff2411630f7b70f80f9d79c273b6311aba74826040516107a1911515815260200190565b60405180910390a25050565b5f6107c3335f356001600160e01b031916611d66565b5f5160206141fc5f395f51905f525460ff16156107f35760405163ab35696f60e01b815260040160405180910390fd5b6107fe338484611e69565b90505b92915050565b5f6106ac7f67df8e602072ae967fe4567cec1273e29da0bd7a5a1af20d9b5c8d3f0d8385035490565b5f610846335f356001600160e01b031916611d66565b6040516364dad32f60e01b81526001600160a01b0385166004820152849030906364dad32f90602401602060405180830381865afa15801561088a573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108ae9190613c19565b6108db576040516326865f9b60e21b81526001600160a01b03821660048201526024015b60405180910390fd5b6040516364dad32f60e01b81526001600160a01b0385166004820152849030906364dad32f90602401602060405180830381865afa15801561091f573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109439190613c19565b61096b576040516326865f9b60e21b81526001600160a01b03821660048201526024016108d2565b5f5160206141fc5f395f51905f525460ff161561099b5760405163ab35696f60e01b815260040160405180910390fd5b6109a6868686611f3c565b9695505050505050565b6109b8611fd0565b5f5160206141bc5f395f51905f5254156109e55760405163f92ee8a960e01b815260040160405180910390fd5b6109ed61206b565b6109f88686866120a6565b610a0182612122565b610a0a81612148565b5f8054610a1690613c34565b90505f03610a2b575f610a298482613cb7565b505b505050505050565b5f610a3c611c03565b6001600160a01b031663970f8482835f5b604051908082528060200260200182016040528015610a76578160200160208202803683370190505b506040518363ffffffff1660e01b8152600401610a94929190613d72565b602060405180830381865afa158015610aaf573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108019190613c19565b5f6106ac7f67df8e602072ae967fe4567cec1273e29da0bd7a5a1af20d9b5c8d3f0d8385025460ff1690565b610b098282612188565b5050565b5f610b16611c03565b6001600160a01b031663f5fe5787835f610a4d565b5f6106ac6121dd565b5f6106ac5f5160206141bc5f395f51905f525490565b610b5f335f356001600160e01b031916611d66565b610b6761222c565b565b610b7e335f356001600160e01b031916611d66565b6040516364dad32f60e01b81526001600160a01b0383166004820152829030906364dad32f90602401602060405180830381865afa158015610bc2573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610be69190613c19565b610c0e576040516326865f9b60e21b81526001600160a01b03821660048201526024016108d2565b5f5160206141fc5f395f51905f525460ff1615610c3e5760405163ab35696f60e01b815260040160405180910390fd5b610c48838361229c565b505050565b6001546060906001600160a01b0316610c7b57604051631f93601760e01b81525f60048201526024016108d2565b600154610c90906001600160a01b0316612339565b15610d0b5760015f9054906101000a90046001600160a01b03166001600160a01b0316639d91348d6040518163ffffffff1660e01b81526004015f60405180830381865afa158015610ce4573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526106ac9190810190613dcc565b6040805160018082528183019092525f916020808301908036833750506001546040805163313ce56760e01b815290519394506001600160a01b039091169263313ce567925060048083019260209291908290030181865afa158015610d73573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d979190613e80565b815f81518110610da957610da9613e9b565b60ff90921660209283029190910190910152919050565b5f610dc9611c03565b6001600160a01b031663ffb2f26f835f610a4d565b610df3335f356001600160e01b031916611d66565b6001546001600160a01b039081169082168103610e2e57604051631eeb14f160e01b81526001600160a01b03831660048201526024016108d2565b600180546001600160a01b0319166001600160a01b0384811691821790925560405190918316907fd76fb624f0e2e090c9f82772a08d122c79250c90c7a896b1ed0de8bbe3e9e2e4905f90a35050565b5f610e87611c03565b6001600160a01b0316636f06fa43835f610a4d565b610ea4611fd0565b610b0982826123b0565b5f610eb76123cc565b6106ac612415565b5f51602061421c5f395f51905f5254610eeb57604051630604a9ff60e01b815260040160405180910390fd5b610b67612430565b610f08335f356001600160e01b031916611d66565b5f5160206141fc5f395f51905f525460ff1615610f385760405163ab35696f60e01b815260040160405180910390fd5b610f40611c03565b604051632b73cd6360e21b81525f60048201526001600160a01b0384811660248301528315156044830152919091169063adcf358c906064015f604051808303815f87803b158015610f90575f5ffd5b505af1158015610fa2573d5f5f3e3d5ffd5b50505050816001600160a01b03167fc71e52f779c12ade7cbf75a51deb27377b5addd6a3945e0b356bff858ffad7fb826040516107a1911515815260200190565b610ff8335f356001600160e01b031916611d66565b5f5160206141fc5f395f51905f525460ff16156110285760405163ab35696f60e01b815260040160405180910390fd5b611030611c03565b60405163361fa22b60e01b81525f60048201526001600160a01b0384811660248301528315156044830152919091169063361fa22b906064015f604051808303815f87803b158015611080575f5ffd5b505af1158015611092573d5f5f3e3d5ffd5b50505050816001600160a01b03167f6b410344a541a2ad2ffec50ea1cafabe58c50db82f72ae4f46a4bd2419155b15826040516107a1911515815260200190565b6110e8335f356001600160e01b031916611d66565b5f5160206141fc5f395f51905f525460ff16156111185760405163ab35696f60e01b815260040160405180910390fd5b610c4883838361247b565b5f61112c611c03565b6001600160a01b031663f2563ef3835f610a4d565b5f61114a611c03565b6001600160a01b031663394340e8835f610a4d565b6001600160a01b0381165f9081527f67df8e602072ae967fe4567cec1273e29da0bd7a5a1af20d9b5c8d3f0d8385046020526040812054610801565b5f6111a4611c03565b6001600160a01b03166378143d56835f610a4d565b5f51602061421c5f395f51905f52546111e557604051630604a9ff60e01b815260040160405180910390fd5b610b67612730565b6001600160a01b0381165f9081527f67df8e602072ae967fe4567cec1273e29da0bd7a5a1af20d9b5c8d3f0d8385086020526040812054610801565b61123e335f356001600160e01b031916611d66565b610b67612771565b60606106ac6127e5565b611265335f356001600160e01b031916611d66565b5f5160206141fc5f395f51905f525460ff16156112955760405163ab35696f60e01b815260040160405180910390fd5b5f5f80546112a290613c34565b80601f01602080910402602001604051908101604052809291908181526020018280546112ce90613c34565b80156113195780601f106112f057610100808354040283529160200191611319565b820191905f5260205f20905b8154815290600101906020018083116112fc57829003601f168201915b5050505050905081805190602001208180519060200120036113505781604051638651f2a560e01b81526004016108d291906137ba565b5f61135b8382613cb7565b507ffd07e2c2d6dc82f4d6b1b46f25e49eb888aba92d238fb40945856412cce2f2dd818360405161138d929190613eaf565b60405180910390a15050565b5f60605f5f6113a785612823565b93509350935093509193509193565b6001545f9081906001600160a01b031615806113e257506001546113e2906001600160a01b0316612339565b1561140f57600154604051631f93601760e01b81526001600160a01b0390911660048201526024016108d2565b60015f9054906101000a90046001600160a01b03166001600160a01b031663feaf968c6040518163ffffffff1660e01b815260040160a060405180830381865afa15801561145f573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906114839190613ef5565b5091945090925050505f8190036114ad57604051638ad52bdd60e01b815260040160405180910390fd5b5f82136114cc5760405162bfc92160e01b815260040160405180910390fd5b9091565b6114e5335f356001600160e01b031916611d66565b6040516364dad32f60e01b81526001600160a01b0383166004820152829030906364dad32f90602401602060405180830381865afa158015611529573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061154d9190613c19565b611575576040516326865f9b60e21b81526001600160a01b03821660048201526024016108d2565b5f5160206141fc5f395f51905f525460ff16156115a55760405163ab35696f60e01b815260040160405180910390fd5b610c48838361294f565b6040516364dad32f60e01b81526001600160a01b0383166004820152829030906364dad32f90602401602060405180830381865afa1580156115f3573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906116179190613c19565b61163f576040516326865f9b60e21b81526001600160a01b03821660048201526024016108d2565b611654335f356001600160e01b031916611d66565b5f5160206141fc5f395f51905f525460ff16156116845760405163ab35696f60e01b815260040160405180910390fd5b61168f8484846129f1565b50826001600160a01b0316846001600160a01b03167f7b3ce50c216d2ccf9919c6b9f1bfb33f0350a33010f188750b4af38e00448138846040516116d591815260200190565b60405180910390a350505050565b5f6116f9335f356001600160e01b031916611d66565b6040516364dad32f60e01b81526001600160a01b0384166004820152839030906364dad32f90602401602060405180830381865afa15801561173d573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906117619190613c19565b611789576040516326865f9b60e21b81526001600160a01b03821660048201526024016108d2565b5f5160206141fc5f395f51905f525460ff16156117b95760405163ab35696f60e01b815260040160405180910390fd5b6117c43385856129f1565b949350505050565b5f6106ac5f5160206141dc5f395f51905f525490565b5f6106ac5f5160206141fc5f395f51905f525460ff1690565b6001546060905f906001600160a01b0316158061182a5750600154611828906001600160a01b0316612339565b155b1561185757600154604051631f93601760e01b81526001600160a01b0390911660048201526024016108d2565b600154604080516328f5843360e21b815290516001600160a01b0390921691829163a3d610cc9160048083019260209291908290030181865afa1580156118a0573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906118c49190613f43565b9150806001600160a01b0316639198274f6040518163ffffffff1660e01b81526004015f60405180830381865afa158015611901573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526119289190810190613fae565b9250509091565b611944335f356001600160e01b031916611d66565b5f5160206141fc5f395f51905f525460ff16156119745760405163ab35696f60e01b815260040160405180910390fd5b61197c611c03565b604051624ff82360e21b81525f60048201526001600160a01b0384811660248301528315156044830152919091169063013fe08c906064015f604051808303815f87803b1580156119cb575f5ffd5b505af11580156119dd573d5f5f3e3d5ffd5b50505050816001600160a01b03167f5e20cf47b2259b331d4b7c60c19f771fc77bd7b207cb6438d0d217ea67755b57826040516107a1911515815260200190565b5f8054611a2a90613c34565b80601f0160208091040260200160405190810160405280929190818152602001828054611a5690613c34565b8015611aa15780601f10611a7857610100808354040283529160200191611aa1565b820191905f5260205f20905b815481529060010190602001808311611a8457829003601f168201915b505050505081565b611abe335f356001600160e01b031916611d66565b6040516364dad32f60e01b81526001600160a01b0388166004820152879030906364dad32f90602401602060405180830381865afa158015611b02573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611b269190613c19565b611b4e576040516326865f9b60e21b81526001600160a01b03821660048201526024016108d2565b5f5160206141fc5f395f51905f525460ff1615611b7e5760405163ab35696f60e01b815260040160405180910390fd5b611b8d88888888888888612ade565b5050505050505050565b6001600160a01b038083165f9081527f67df8e602072ae967fe4567cec1273e29da0bd7a5a1af20d9b5c8d3f0d838505602090815260408083209385168352929052908120546107fe565b611bf7335f356001600160e01b031916611d66565b611c0081612d08565b50565b5f6106ac5f51602061423c5f395f51905f52546001600160a01b031690565b6001546060906001600160a01b0316611c5057604051631f93601760e01b81525f60048201526024016108d2565b60015460408051633942720b60e11b815290516001600160a01b03909216918291637284e416916004808301925f9291908290030181865afa158015611c98573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611cbf9190810190613fe0565b91505090565b5f51602061425c5f395f51905f528054606091908190611ce490613c34565b80601f0160208091040260200160405190810160405280929190818152602001828054611d1090613c34565b8015611d5b5780601f10611d3257610100808354040283529160200191611d5b565b820191905f5260205f20905b815481529060010190602001808311611d3e57829003601f168201915b505050505091505090565b5f5f611d865f51602061423c5f395f51905f52546001600160a01b031690565b6040516001600160a01b0386811660248301526001600160e01b031986166044830152919091169060640160408051601f198184030181529181526020820180516001600160e01b0316630435f69f60e51b17905251611de69190614025565b5f60405180830381855afa9150503d805f8114611e1e576040519150601f19603f3d011682016040523d82523d5f602084013e611e23565b606091505b5091509150811580611e46575080806020019051810190611e449190613c19565b155b15611e63576040516282b42960e81b815260040160405180910390fd5b50505050565b5f6001600160a01b0384161580611e8757506001600160a01b038316155b15611ea55760405163d92e233d60e01b815260040160405180910390fd5b6001600160a01b038481165f8181527f67df8e602072ae967fe4567cec1273e29da0bd7a5a1af20d9b5c8d3f0d838505602090815260408083209488168084529482529182902086905590518581525f51602061425c5f395f51905f529392917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3506001949350505050565b6001600160a01b0383165f9081527f67df8e602072ae967fe4567cec1273e29da0bd7a5a1af20d9b5c8d3f0d838505602090815260408083203384529091528120545f51602061425c5f395f51905f52905f198114611fc557611f9f848261404f565b6001600160a01b0387165f90815260058401602090815260408083203384529091529020555b6109a68686866129f1565b306001600160a01b037f0000000000000000000000007030fe438be6ed196b8886616bbf5a245c26733916148061204d57507f0000000000000000000000007030fe438be6ed196b8886616bbf5a245c2673396001600160a01b03166120415f5160206141dc5f395f51905f525490565b6001600160a01b031614155b15610b675760405163703e46dd60e11b815260040160405180910390fd5b60015f5160206141bc5f395f51905f52556040517f5daa87a0e9463431830481fd4b6e3403442dfb9a12b9c07597e9f61d50b633c8905f90a1565b7f67df8e602072ae967fe4567cec1273e29da0bd7a5a1af20d9b5c8d3f0d838506545f51602061425c5f395f51905f52905f03611e6357806120e88582613cb7565b50600181016120f78482613cb7565b5060028101805460ff191660ff8416179055466006820155612117612d36565b600782015550505050565b5f51602061423c5f395f51905f5280546001600160a01b0316610b0957610b0982612d08565b7f2c9356b94ada349e65b0a691cd15e24beddfc13e05a26de25d9c64509c824401545f51602061421c5f395f51905f52905f03610b0957610b0982612de0565b604051309033907f16f2354671bbabcb07367cc01a78931a00a812ee080430be4e8f1a76ab58212b905f90a33330146121d35760405162e6155960e41b815260040160405180910390fd5b610b098282612e24565b7f67df8e602072ae967fe4567cec1273e29da0bd7a5a1af20d9b5c8d3f0d838506545f905f51602061425c5f395f51905f529046146122235761221e612d36565b611cbf565b60070154919050565b5f5160206141fc5f395f51905f525460ff1661225b5760405163dcdde9dd60e01b815260040160405180910390fd5b5f5160206141fc5f395f51905f52805460ff191681556040517fa45f47fdea8a1efdd9029a5691c7f759c32b7c698632b563573e155625d16933905f90a150565b7f67df8e602072ae967fe4567cec1273e29da0bd7a5a1af20d9b5c8d3f0d83850380545f51602061425c5f395f51905f529183915f906122dd908490614062565b90915550506001600160a01b0383165f8181526004830160209081526040808320805487019055518581527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91015b60405180910390a3505050565b5f816001600160a01b0316639d91348d6040518163ffffffff1660e01b81526004015f60405180830381865afa92505050801561239757506040513d5f823e601f3d908101601f191682016040526123949190810190613dcc565b60015b6123a257505f919050565b50600192915050565b919050565b6123b8611fd0565b6123c28282612e42565b610b098282612e97565b306001600160a01b037f0000000000000000000000007030fe438be6ed196b8886616bbf5a245c2673391614610b675760405163703e46dd60e11b815260040160405180910390fd5b5f61241e6123cc565b505f5160206141dc5f395f51905f5290565b5f51602061421c5f395f51905f5280545f61244a82611399565b50509150505f5f61245a83612ea1565b915091506124688282612e42565b61247184612ef4565b50505f9092555050565b5f806001600160a01b038516612501576040516001600160a01b0385169084905f81818185875af1925050503d805f81146124d1576040519150601f19603f3d011682016040523d82523d5f602084013e6124d6565b606091505b505080925050816124fa576040516312171d8360e31b815260040160405180910390fd5b50816126d3565b6040516370a0823160e01b81526001600160a01b03858116600483015286915f918316906370a0823190602401602060405180830381865afa158015612549573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061256d9190613f43565b604080516001600160a01b03898116602483015260448083018a905283518084039091018152606490920183526020820180516001600160e01b031663a9059cbb60e01b1790529151929350606092918a16916125ca9190614025565b5f604051808303815f865af19150503d805f8114612603576040519150601f19603f3d011682016040523d82523d5f602084013e612608565b606091505b50909550905084158061263757505f81511180156126375750808060200190518101906126359190613c19565b155b15612655576040516312171d8360e31b815260040160405180910390fd5b6040516370a0823160e01b81526001600160a01b0388811660048301525f91908516906370a0823190602401602060405180830381865afa15801561269c573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906126c09190613f43565b90506126cc838261404f565b9450505050505b836001600160a01b0316856001600160a01b03167f7a43eea7e0e6937c4baa97b10dabb89519feb249fe9ddcb442415b029148520d8584604051612721929190918252602082015260400190565b60405180910390a35050505050565b5f51602061421c5f395f51905f5280545f61274a82611399565b50509150505f5f61275a83612ea1565b915091506127688282612e42565b61247184612faf565b5f5160206141fc5f395f51905f525460ff16156127a15760405163ab35696f60e01b815260040160405180910390fd5b5f5160206141fc5f395f51905f52805460ff191660011781556040517f9e87fac88ff661f02d44f95383c817fece4bce600a3dab7a54406878b965e752905f90a150565b7f67df8e602072ae967fe4567cec1273e29da0bd7a5a1af20d9b5c8d3f0d83850180546060915f51602061425c5f395f51905f5291611ce490613c34565b5f8181527f1626844f871e5080d673ecb96ea8a32c7bdf671ea137282b2886cd9d0fd9a70260209081526040808320815160808101835281546001600160a01b03168152600182015493810193909352600281018054606094869485945f51602061419c5f395f51905f52948694919284019161289f90613c34565b80601f01602080910402602001604051908101604052809291908181526020018280546128cb90613c34565b80156129165780601f106128ed57610100808354040283529160200191612916565b820191905f5260205f20905b8154815290600101906020018083116128f957829003601f168201915b505050505081526020016003820154815250509050805f0151816040015182602001518360600151955095509550955050509193509193565b6001600160a01b0382165f9081527f67df8e602072ae967fe4567cec1273e29da0bd7a5a1af20d9b5c8d3f0d8385046020526040812080545f51602061425c5f395f51905f52928492916129a490849061404f565b909155505060038101805483900390556040518281525f906001600160a01b038516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200161232c565b5f6001600160a01b0384161580612a0f57506001600160a01b038316155b15612a2d5760405163d92e233d60e01b815260040160405180910390fd5b6001600160a01b0384165f9081527f67df8e602072ae967fe4567cec1273e29da0bd7a5a1af20d9b5c8d3f0d8385046020526040812080545f51602061425c5f395f51905f5292859291612a8290849061404f565b90915550506001600160a01b038085165f818152600484016020526040908190208054870190555190918716907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90611f299087815260200190565b42841015612aff576040516305787bdf60e01b815260040160405180910390fd5b6001600160a01b0387165f9081527f67df8e602072ae967fe4567cec1273e29da0bd7a5a1af20d9b5c8d3f0d83850860205260408120805460018082019092555f51602061425c5f395f51905f52929091612b586121dd565b604080517f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c960208201526001600160a01b03808f1692820192909252908c166060820152608081018b905260a0810185905260c081018a905260e00160405160208183030381529060405280519060200120604051602001612bf192919061190160f01b81526002810192909252602282015260420190565b60408051601f1981840301815282825280516020918201205f84529083018083525260ff891690820152606081018790526080810186905260a0016020604051602081039080840390855afa158015612c4c573d5f5f3e3d5ffd5b5050604051601f1901519150506001600160a01b0381161580612c815750896001600160a01b0316816001600160a01b031614155b15612c9f57604051632057875960e21b815260040160405180910390fd5b50506001600160a01b038881165f8181526005840160209081526040808320948c16808452948252918290208a905590518981527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a35050505050505050565b5f51602061423c5f395f51905f5280546001600160a01b0319166001600160a01b0392909216919091179055565b6040515f905f51602061425c5f395f51905f52907f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f90612d77908390614075565b6040805191829003822060208301939093528101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608201524660808201523060a082015260c0016040516020818303038152906040528051906020012091505090565b805f03612e00576040516327df2edd60e11b815260040160405180910390fd5b7f2c9356b94ada349e65b0a691cd15e24beddfc13e05a26de25d9c64509c82440155565b612e2e8282613202565b612e38828261321e565b610b098282613273565b612e4a611c03565b6001600160a01b0316336001600160a01b031614610b095733612e6b611c03565b60405163fe6cd27560e01b81526001600160a01b039283166004820152911660248201526044016108d2565b610b0982826132a6565b5f6060606483511015612ec75760405163fc69850b60e01b815260040160405180910390fd5b8251612ed7908490600490613363565b806020019051810190612eea91906140e6565b9094909350915050565b5f8181527f1626844f871e5080d673ecb96ea8a32c7bdf671ea137282b2886cd9d0fd9a70160205260409020545f51602061419c5f395f51905f529015610b09575f8281526001808301602090815260408084208490556002808601909252832080546001600160a01b0319168155918201839055909190612f7890830182613742565b505f60039190910181905560405183917f134fdd648feeaf30251f0157f9624ef8608ff9a042aad6d13e73f35d21d3f88d91a25050565b612fb8816133e2565b5f8181527f1626844f871e5080d673ecb96ea8a32c7bdf671ea137282b2886cd9d0fd9a70260209081526040808320815160808101835281546001600160a01b031681526001820154938101939093526002810180545f51602061419c5f395f51905f529594938401919061302c90613c34565b80601f016020809104026020016040519081016040528092919081815260200182805461305890613c34565b80156130a35780601f1061307a576101008083540402835291602001916130a3565b820191905f5260205f20905b81548152906001019060200180831161308657829003601f168201915b50505091835250506003919091015460209182015281519082015160408301519293509091478211156130f15760405162fae2d560e21b8152600481018390524760248201526044016108d2565b5f8681526001808701602090815260408084208490556002808a01909252832080546001600160a01b031916815591820183905590919061313490830182613742565b600382015f905550505f836001600160a01b031683836040516131579190614025565b5f6040518083038185875af1925050503d805f8114613191576040519150601f19603f3d011682016040523d82523d5f602084013e613196565b606091505b50509050806131bb5760405163165a1d4160e01b8152600481018890526024016108d2565b867fbc76564aec85e3f50672da2d1ddca0390851fecefe61cd19d89dea91a8267829858585426040516131f1949392919061412a565b60405180910390a250505050505050565b805115610b0957610b095f5f5160206141bc5f395f51905f5255565b6132278261345f565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a280511561326b57610c488282613479565b610b09613505565b5f81511180156132885750613286610b34565b155b15610b095760405163b3a31bfd60e01b815260040160405180910390fd5b5f51602061421c5f395f51905f5254156132d35760405163e741fd4560e01b815260040160405180910390fd5b7f2c9356b94ada349e65b0a691cd15e24beddfc13e05a26de25d9c64509c824401545f51602061421c5f395f51905f52905f906133109042614062565b90505f61335a30868660405160240161332a929190614162565b60408051601f198184030181529190526020810180516001600160e01b03166319cccfd360e11b17905284613524565b90925550505050565b606061337082855161363e565b915061337c838361363e565b9250613388838361404f565b67ffffffffffffffff8111156133a0576133a061388c565b6040519080825280601f01601f1916602001820160405280156133ca576020820181803683370190505b509050828203836020860101602083015e9392505050565b5f8181527f1626844f871e5080d673ecb96ea8a32c7bdf671ea137282b2886cd9d0fd9a70160205260408120545f51602061419c5f395f51905f529181900361343e57604051634b9aaa0960e11b815260040160405180910390fd5b80421015610c4857604051630f0b32ff60e11b815260040160405180910390fd5b61346881613653565b5f5160206141dc5f395f51905f5255565b60605f5f846001600160a01b0316846040516134959190614025565b5f60405180830381855af49150503d805f81146134cd576040519150601f19603f3d011682016040523d82523d5f602084013e6134d2565b606091505b5091509150816117c4578051156134ec5780518082602001fd5b60405163d6bda27560e01b815260040160405180910390fd5b3415610b675760405163b398979f60e01b815260040160405180910390fd5b5f8142106135455760405163b7d0949760e01b815260040160405180910390fd5b5f51602061419c5f395f51905f5280543490825f61356283614183565b909155505081545f81815260018085016020908152604080842089905580516080810182526001600160a01b038c811682528184018881528284018d8152606084018d90528888526002808c0190965293909620825181546001600160a01b0319169216919091178155945193850193909355519396509092908201906135e99082613cb7565b5060608201518160030155905050827f8d6fedd41517ab865c3658696c50923b3493c8a93ffd016d919a599f03c7531b8783888860405161362d949392919061412a565b60405180910390a250509392505050565b5f81831061364c57816107fe565b5090919050565b806001600160a01b03163b5f0361368857604051634c9c8ce360e01b81526001600160a01b03821660048201526024016108d2565b806001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa9250505080156136e2575060408051601f3d908101601f191682019092526136df91810190613f43565b60015b61370a57604051634c9c8ce360e01b81526001600160a01b03821660048201526024016108d2565b5f5160206141dc5f395f51905f528114610b0957604051634c9c8ce360e01b81526001600160a01b03831660048201526024016108d2565b50805461374e90613c34565b5f825580601f1061375d575050565b601f0160209004905f5260205f2090810190611c0091905b80821115613788575f8155600101613775565b5090565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f6107fe602083018461378c565b6001600160a01b0381168114611c00575f5ffd5b8015158114611c00575f5ffd5b5f5f604083850312156137fe575f5ffd5b8235613809816137cc565b91506020830135613819816137e0565b809150509250929050565b5f5f60408385031215613835575f5ffd5b8235613840816137cc565b946020939093013593505050565b5f5f5f60608486031215613860575f5ffd5b833561386b816137cc565b9250602084013561387b816137cc565b929592945050506040919091013590565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f1916810167ffffffffffffffff811182821017156138c9576138c961388c565b604052919050565b5f67ffffffffffffffff8211156138ea576138ea61388c565b50601f01601f191660200190565b5f61390a613905846138d1565b6138a0565b905082815283838301111561391d575f5ffd5b828260208301375f602084830101529392505050565b5f82601f830112613942575f5ffd5b6107fe838335602085016138f8565b60ff81168114611c00575f5ffd5b5f5f5f5f5f5f60c08789031215613974575f5ffd5b863567ffffffffffffffff81111561398a575f5ffd5b61399689828a01613933565b965050602087013567ffffffffffffffff8111156139b2575f5ffd5b6139be89828a01613933565b95505060408701356139cf81613951565b9350606087013567ffffffffffffffff8111156139ea575f5ffd5b6139f689828a01613933565b9350506080870135613a07816137cc565b9598949750929591949360a090920135925050565b5f60208284031215613a2c575f5ffd5b8135613a37816137cc565b9392505050565b5f5f60408385031215613a4f575f5ffd5b8235613a5a816137cc565b9150602083013567ffffffffffffffff811115613a75575f5ffd5b8301601f81018513613a85575f5ffd5b613a94858235602084016138f8565b9150509250929050565b602080825282518282018190525f918401906040840190835b81811015613ad857835160ff16835260209384019390920191600101613ab7565b509095945050505050565b5f60208284031215613af3575f5ffd5b813567ffffffffffffffff811115613b09575f5ffd5b6117c484828501613933565b5f60208284031215613b25575f5ffd5b5035919050565b6001600160a01b0385168152608060208201525f613b4d608083018661378c565b6040830194909452506060015292915050565b604081525f613b72604083018561378c565b90508260208301529392505050565b5f5f5f5f5f5f5f60e0888a031215613b97575f5ffd5b8735613ba2816137cc565b96506020880135613bb2816137cc565b955060408801359450606088013593506080880135613bd081613951565b9699959850939692959460a0840135945060c09093013592915050565b5f5f60408385031215613bfe575f5ffd5b8235613c09816137cc565b91506020830135613819816137cc565b5f60208284031215613c29575f5ffd5b8151613a37816137e0565b600181811c90821680613c4857607f821691505b602082108103613c6657634e487b7160e01b5f52602260045260245ffd5b50919050565b601f821115610c4857805f5260205f20601f840160051c81016020851015613c915750805b601f840160051c820191505b81811015613cb0575f8155600101613c9d565b5050505050565b815167ffffffffffffffff811115613cd157613cd161388c565b613ce581613cdf8454613c34565b84613c6c565b6020601f821160018114613d17575f8315613d005750848201515b5f19600385901b1c1916600184901b178455613cb0565b5f84815260208120601f198516915b82811015613d465787850151825560209485019460019092019101613d26565b5084821015613d6357868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b5f604082016001600160a01b0385168352604060208401528084518083526060850191506020860192505f5b81811015613dc057835161ffff16835260209384019390920191600101613d9e565b50909695505050505050565b5f60208284031215613ddc575f5ffd5b815167ffffffffffffffff811115613df2575f5ffd5b8201601f81018413613e02575f5ffd5b805167ffffffffffffffff811115613e1c57613e1c61388c565b8060051b613e2c602082016138a0565b91825260208184018101929081019087841115613e47575f5ffd5b6020850194505b83851015613e755784519250613e6383613951565b82825260209485019490910190613e4e565b979650505050505050565b5f60208284031215613e90575f5ffd5b8151613a3781613951565b634e487b7160e01b5f52603260045260245ffd5b604081525f613ec1604083018561378c565b8281036020840152613ed3818561378c565b95945050505050565b805169ffffffffffffffffffff811681146123ab575f5ffd5b5f5f5f5f5f60a08688031215613f09575f5ffd5b613f1286613edc565b60208701516040880151606089015192975090955093509150613f3760808701613edc565b90509295509295909350565b5f60208284031215613f53575f5ffd5b5051919050565b5f613f67613905846138d1565b9050828152838383011115613f7a575f5ffd5b8282602083015e5f602084830101529392505050565b5f82601f830112613f9f575f5ffd5b6107fe83835160208501613f5a565b5f60208284031215613fbe575f5ffd5b815167ffffffffffffffff811115613fd4575f5ffd5b6117c484828501613f90565b5f60208284031215613ff0575f5ffd5b815167ffffffffffffffff811115614006575f5ffd5b8201601f81018413614016575f5ffd5b6117c484825160208401613f5a565b5f82518060208501845e5f920191825250919050565b634e487b7160e01b5f52601160045260245ffd5b818103818111156108015761080161403b565b808201808211156108015761080161403b565b5f5f835461408281613c34565b60018216801561409957600181146140ae576140db565b60ff19831686528115158202860193506140db565b865f5260205f205f5b838110156140d3578154888201526001909101906020016140b7565b505081860193505b509195945050505050565b5f5f604083850312156140f7575f5ffd5b8251614102816137cc565b602084015190925067ffffffffffffffff81111561411e575f5ffd5b613a9485828601613f90565b6001600160a01b0385168152836020820152608060408201525f614151608083018561378c565b905082606083015295945050505050565b6001600160a01b0383168152604060208201525f6117c4604083018461378c565b5f600182016141945761419461403b565b506001019056fe1626844f871e5080d673ecb96ea8a32c7bdf671ea137282b2886cd9d0fd9a700112dd7b7d700a9bfd03edf4d4ce6f92b1f5f1a2fd81fde871f4db11384aa0b00360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbcfedd7b171e5aaf71411eb61c81513b977191128c387240284b4edb396fcbdb002c9356b94ada349e65b0a691cd15e24beddfc13e05a26de25d9c64509c8244001fa5656f3245be71aa51744436d19e5d46b909e499930c5c32c93901cab5290067df8e602072ae967fe4567cec1273e29da0bd7a5a1af20d9b5c8d3f0d838500a264697066735822122035e0410d4d866dbce71da568bdb6a948e20748cc7ea05eb3930bbfd8a939035964736f6c634300081e0033","recompiledBytecode":"0x608060405234801561000f575f5ffd5b5060043610610325575f3560e01c806364dad32f116101a85780639fc1d0e7116100f3578063c9c16fbd1161009e578063dd62ed3e11610079578063dd62ed3e1461066c578063ef3e8f221461067f578063f2e23d2214610692578063f8fa842b1461069a575f5ffd5b8063c9c16fbd1461063e578063d4a1911614610651578063d505accf14610659575f5ffd5b8063b187bd26116100ce578063b187bd2614610619578063bf4dc4b614610621578063c1491c5814610628575f5ffd5b80639fc1d0e7146105eb578063a9059cbb146105fe578063aaf10f4214610611575f5ffd5b80638456cb591161015357806398d2082f1161012e57806398d2082f1461059857806398d5fdca146105bb5780639dc29fac146105d8575f5ffd5b80638456cb591461057557806395d89b411461057d57806398cd615314610585575f5ffd5b80637ab8bf5a116101835780637ab8bf5a146105475780637e8962141461055a5780637ecebe0014610562575f5ffd5b806364dad32f1461050e5780636d70f7ae1461052157806370a0823114610534575f5ffd5b80633f4ba83a116102735780634f1ef2861161021e5780635845394b116101f95780635845394b146104aa5780635965959e146104d55780635ca13f04146104e85780635d3590d5146104fb575f5ffd5b80634f1ef2861461048757806352d1902d1461049a57806355f29166146104a2575f5ffd5b8063426796831161024e578063426796831461044e578063440fde4e1461046157806346fbf68e14610474575f5ffd5b80633f4ba83a1461041e57806340c10f1914610426578063422f8c0a14610439575f5ffd5b80632d524393116102d357806334cdcf26116102ae57806334cdcf26146103fb5780633644e5151461040e578063392e53cd14610416575f5ffd5b80632d524393146103bb578063313ce567146103ce57806333999fa6146103e8575f5ffd5b806318160ddd1161030357806318160ddd1461037f57806323b872dd14610395578063257e224c146103a8575f5ffd5b806306fdde031461032957806307e2a26014610347578063095ea7b31461035c575b5f5ffd5b6103316106a2565b60405161033e91906137ba565b60405180910390f35b61035a6103553660046137ed565b6106b1565b005b61036f61036a366004613824565b6107ad565b604051901515815260200161033e565b610387610807565b60405190815260200161033e565b61036f6103a336600461384e565b610830565b61035a6103b636600461395f565b6109b0565b61036f6103c9366004613a1c565b610a33565b6103d6610ad3565b60405160ff909116815260200161033e565b61035a6103f6366004613a3e565b610aff565b61036f610409366004613a1c565b610b0d565b610387610b2b565b61036f610b34565b61035a610b4a565b61035a610434366004613824565b610b69565b610441610c4d565b60405161033e9190613a9e565b61036f61045c366004613a1c565b610dc0565b61035a61046f366004613a1c565b610dde565b61036f610482366004613a1c565b610e7e565b61035a610495366004613a3e565b610e9c565b610387610eae565b61035a610ebf565b6001546104bd906001600160a01b031681565b6040516001600160a01b03909116815260200161033e565b61035a6104e33660046137ed565b610ef3565b61035a6104f63660046137ed565b610fe3565b61035a61050936600461384e565b6110d3565b61036f61051c366004613a1c565b611123565b61036f61052f366004613a1c565b611141565b610387610542366004613a1c565b61115f565b61036f610555366004613a1c565b61119b565b61035a6111b9565b610387610570366004613a1c565b6111ed565b61035a611229565b610331611246565b61035a610593366004613ae3565b611250565b6105ab6105a6366004613b15565b611399565b60405161033e9493929190613b2c565b6105c36113b6565b6040805192835260208301919091520161033e565b61035a6105e6366004613824565b6114d0565b61035a6105f936600461384e565b6115af565b61036f61060c366004613824565b6116e3565b6104bd6117cc565b61036f6117e2565b600161036f565b6106306117fb565b60405161033e929190613b60565b61035a61064c3660046137ed565b61192f565b610331611a1e565b61035a610667366004613b81565b611aa9565b61038761067a366004613bed565b611b97565b61035a61068d366004613a1c565b611be2565b6104bd611c03565b610331611c22565b60606106ac611cc5565b905090565b6106c6335f356001600160e01b031916611d66565b5f5160206141fc5f395f51905f525460ff16156106f65760405163ab35696f60e01b815260040160405180910390fd5b6106fe611c03565b604051636bcd157760e11b81525f60048201526001600160a01b0384811660248301528315156044830152919091169063d79a2aee906064015f604051808303815f87803b15801561074e575f5ffd5b505af1158015610760573d5f5f3e3d5ffd5b50505050816001600160a01b03167fd4145d5d40015b9d77048466bbe3ff2411630f7b70f80f9d79c273b6311aba74826040516107a1911515815260200190565b60405180910390a25050565b5f6107c3335f356001600160e01b031916611d66565b5f5160206141fc5f395f51905f525460ff16156107f35760405163ab35696f60e01b815260040160405180910390fd5b6107fe338484611e69565b90505b92915050565b5f6106ac7f67df8e602072ae967fe4567cec1273e29da0bd7a5a1af20d9b5c8d3f0d8385035490565b5f610846335f356001600160e01b031916611d66565b6040516364dad32f60e01b81526001600160a01b0385166004820152849030906364dad32f90602401602060405180830381865afa15801561088a573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108ae9190613c19565b6108db576040516326865f9b60e21b81526001600160a01b03821660048201526024015b60405180910390fd5b6040516364dad32f60e01b81526001600160a01b0385166004820152849030906364dad32f90602401602060405180830381865afa15801561091f573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109439190613c19565b61096b576040516326865f9b60e21b81526001600160a01b03821660048201526024016108d2565b5f5160206141fc5f395f51905f525460ff161561099b5760405163ab35696f60e01b815260040160405180910390fd5b6109a6868686611f3c565b9695505050505050565b6109b8611fd0565b5f5160206141bc5f395f51905f5254156109e55760405163f92ee8a960e01b815260040160405180910390fd5b6109ed61206b565b6109f88686866120a6565b610a0182612122565b610a0a81612148565b5f8054610a1690613c34565b90505f03610a2b575f610a298482613cb7565b505b505050505050565b5f610a3c611c03565b6001600160a01b031663970f8482835f5b604051908082528060200260200182016040528015610a76578160200160208202803683370190505b506040518363ffffffff1660e01b8152600401610a94929190613d72565b602060405180830381865afa158015610aaf573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108019190613c19565b5f6106ac7f67df8e602072ae967fe4567cec1273e29da0bd7a5a1af20d9b5c8d3f0d8385025460ff1690565b610b098282612188565b5050565b5f610b16611c03565b6001600160a01b031663f5fe5787835f610a4d565b5f6106ac6121dd565b5f6106ac5f5160206141bc5f395f51905f525490565b610b5f335f356001600160e01b031916611d66565b610b6761222c565b565b610b7e335f356001600160e01b031916611d66565b6040516364dad32f60e01b81526001600160a01b0383166004820152829030906364dad32f90602401602060405180830381865afa158015610bc2573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610be69190613c19565b610c0e576040516326865f9b60e21b81526001600160a01b03821660048201526024016108d2565b5f5160206141fc5f395f51905f525460ff1615610c3e5760405163ab35696f60e01b815260040160405180910390fd5b610c48838361229c565b505050565b6001546060906001600160a01b0316610c7b57604051631f93601760e01b81525f60048201526024016108d2565b600154610c90906001600160a01b0316612339565b15610d0b5760015f9054906101000a90046001600160a01b03166001600160a01b0316639d91348d6040518163ffffffff1660e01b81526004015f60405180830381865afa158015610ce4573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526106ac9190810190613dcc565b6040805160018082528183019092525f916020808301908036833750506001546040805163313ce56760e01b815290519394506001600160a01b039091169263313ce567925060048083019260209291908290030181865afa158015610d73573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d979190613e80565b815f81518110610da957610da9613e9b565b60ff90921660209283029190910190910152919050565b5f610dc9611c03565b6001600160a01b031663ffb2f26f835f610a4d565b610df3335f356001600160e01b031916611d66565b6001546001600160a01b039081169082168103610e2e57604051631eeb14f160e01b81526001600160a01b03831660048201526024016108d2565b600180546001600160a01b0319166001600160a01b0384811691821790925560405190918316907fd76fb624f0e2e090c9f82772a08d122c79250c90c7a896b1ed0de8bbe3e9e2e4905f90a35050565b5f610e87611c03565b6001600160a01b0316636f06fa43835f610a4d565b610ea4611fd0565b610b0982826123b0565b5f610eb76123cc565b6106ac612415565b5f51602061421c5f395f51905f5254610eeb57604051630604a9ff60e01b815260040160405180910390fd5b610b67612430565b610f08335f356001600160e01b031916611d66565b5f5160206141fc5f395f51905f525460ff1615610f385760405163ab35696f60e01b815260040160405180910390fd5b610f40611c03565b604051632b73cd6360e21b81525f60048201526001600160a01b0384811660248301528315156044830152919091169063adcf358c906064015f604051808303815f87803b158015610f90575f5ffd5b505af1158015610fa2573d5f5f3e3d5ffd5b50505050816001600160a01b03167fc71e52f779c12ade7cbf75a51deb27377b5addd6a3945e0b356bff858ffad7fb826040516107a1911515815260200190565b610ff8335f356001600160e01b031916611d66565b5f5160206141fc5f395f51905f525460ff16156110285760405163ab35696f60e01b815260040160405180910390fd5b611030611c03565b60405163361fa22b60e01b81525f60048201526001600160a01b0384811660248301528315156044830152919091169063361fa22b906064015f604051808303815f87803b158015611080575f5ffd5b505af1158015611092573d5f5f3e3d5ffd5b50505050816001600160a01b03167f6b410344a541a2ad2ffec50ea1cafabe58c50db82f72ae4f46a4bd2419155b15826040516107a1911515815260200190565b6110e8335f356001600160e01b031916611d66565b5f5160206141fc5f395f51905f525460ff16156111185760405163ab35696f60e01b815260040160405180910390fd5b610c4883838361247b565b5f61112c611c03565b6001600160a01b031663f2563ef3835f610a4d565b5f61114a611c03565b6001600160a01b031663394340e8835f610a4d565b6001600160a01b0381165f9081527f67df8e602072ae967fe4567cec1273e29da0bd7a5a1af20d9b5c8d3f0d8385046020526040812054610801565b5f6111a4611c03565b6001600160a01b03166378143d56835f610a4d565b5f51602061421c5f395f51905f52546111e557604051630604a9ff60e01b815260040160405180910390fd5b610b67612730565b6001600160a01b0381165f9081527f67df8e602072ae967fe4567cec1273e29da0bd7a5a1af20d9b5c8d3f0d8385086020526040812054610801565b61123e335f356001600160e01b031916611d66565b610b67612771565b60606106ac6127e5565b611265335f356001600160e01b031916611d66565b5f5160206141fc5f395f51905f525460ff16156112955760405163ab35696f60e01b815260040160405180910390fd5b5f5f80546112a290613c34565b80601f01602080910402602001604051908101604052809291908181526020018280546112ce90613c34565b80156113195780601f106112f057610100808354040283529160200191611319565b820191905f5260205f20905b8154815290600101906020018083116112fc57829003601f168201915b5050505050905081805190602001208180519060200120036113505781604051638651f2a560e01b81526004016108d291906137ba565b5f61135b8382613cb7565b507ffd07e2c2d6dc82f4d6b1b46f25e49eb888aba92d238fb40945856412cce2f2dd818360405161138d929190613eaf565b60405180910390a15050565b5f60605f5f6113a785612823565b93509350935093509193509193565b6001545f9081906001600160a01b031615806113e257506001546113e2906001600160a01b0316612339565b1561140f57600154604051631f93601760e01b81526001600160a01b0390911660048201526024016108d2565b60015f9054906101000a90046001600160a01b03166001600160a01b031663feaf968c6040518163ffffffff1660e01b815260040160a060405180830381865afa15801561145f573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906114839190613ef5565b5091945090925050505f8190036114ad57604051638ad52bdd60e01b815260040160405180910390fd5b5f82136114cc5760405162bfc92160e01b815260040160405180910390fd5b9091565b6114e5335f356001600160e01b031916611d66565b6040516364dad32f60e01b81526001600160a01b0383166004820152829030906364dad32f90602401602060405180830381865afa158015611529573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061154d9190613c19565b611575576040516326865f9b60e21b81526001600160a01b03821660048201526024016108d2565b5f5160206141fc5f395f51905f525460ff16156115a55760405163ab35696f60e01b815260040160405180910390fd5b610c48838361294f565b6040516364dad32f60e01b81526001600160a01b0383166004820152829030906364dad32f90602401602060405180830381865afa1580156115f3573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906116179190613c19565b61163f576040516326865f9b60e21b81526001600160a01b03821660048201526024016108d2565b611654335f356001600160e01b031916611d66565b5f5160206141fc5f395f51905f525460ff16156116845760405163ab35696f60e01b815260040160405180910390fd5b61168f8484846129f1565b50826001600160a01b0316846001600160a01b03167f7b3ce50c216d2ccf9919c6b9f1bfb33f0350a33010f188750b4af38e00448138846040516116d591815260200190565b60405180910390a350505050565b5f6116f9335f356001600160e01b031916611d66565b6040516364dad32f60e01b81526001600160a01b0384166004820152839030906364dad32f90602401602060405180830381865afa15801561173d573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906117619190613c19565b611789576040516326865f9b60e21b81526001600160a01b03821660048201526024016108d2565b5f5160206141fc5f395f51905f525460ff16156117b95760405163ab35696f60e01b815260040160405180910390fd5b6117c43385856129f1565b949350505050565b5f6106ac5f5160206141dc5f395f51905f525490565b5f6106ac5f5160206141fc5f395f51905f525460ff1690565b6001546060905f906001600160a01b0316158061182a5750600154611828906001600160a01b0316612339565b155b1561185757600154604051631f93601760e01b81526001600160a01b0390911660048201526024016108d2565b600154604080516328f5843360e21b815290516001600160a01b0390921691829163a3d610cc9160048083019260209291908290030181865afa1580156118a0573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906118c49190613f43565b9150806001600160a01b0316639198274f6040518163ffffffff1660e01b81526004015f60405180830381865afa158015611901573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526119289190810190613fae565b9250509091565b611944335f356001600160e01b031916611d66565b5f5160206141fc5f395f51905f525460ff16156119745760405163ab35696f60e01b815260040160405180910390fd5b61197c611c03565b604051624ff82360e21b81525f60048201526001600160a01b0384811660248301528315156044830152919091169063013fe08c906064015f604051808303815f87803b1580156119cb575f5ffd5b505af11580156119dd573d5f5f3e3d5ffd5b50505050816001600160a01b03167f5e20cf47b2259b331d4b7c60c19f771fc77bd7b207cb6438d0d217ea67755b57826040516107a1911515815260200190565b5f8054611a2a90613c34565b80601f0160208091040260200160405190810160405280929190818152602001828054611a5690613c34565b8015611aa15780601f10611a7857610100808354040283529160200191611aa1565b820191905f5260205f20905b815481529060010190602001808311611a8457829003601f168201915b505050505081565b611abe335f356001600160e01b031916611d66565b6040516364dad32f60e01b81526001600160a01b0388166004820152879030906364dad32f90602401602060405180830381865afa158015611b02573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611b269190613c19565b611b4e576040516326865f9b60e21b81526001600160a01b03821660048201526024016108d2565b5f5160206141fc5f395f51905f525460ff1615611b7e5760405163ab35696f60e01b815260040160405180910390fd5b611b8d88888888888888612ade565b5050505050505050565b6001600160a01b038083165f9081527f67df8e602072ae967fe4567cec1273e29da0bd7a5a1af20d9b5c8d3f0d838505602090815260408083209385168352929052908120546107fe565b611bf7335f356001600160e01b031916611d66565b611c0081612d08565b50565b5f6106ac5f51602061423c5f395f51905f52546001600160a01b031690565b6001546060906001600160a01b0316611c5057604051631f93601760e01b81525f60048201526024016108d2565b60015460408051633942720b60e11b815290516001600160a01b03909216918291637284e416916004808301925f9291908290030181865afa158015611c98573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611cbf9190810190613fe0565b91505090565b5f51602061425c5f395f51905f528054606091908190611ce490613c34565b80601f0160208091040260200160405190810160405280929190818152602001828054611d1090613c34565b8015611d5b5780601f10611d3257610100808354040283529160200191611d5b565b820191905f5260205f20905b815481529060010190602001808311611d3e57829003601f168201915b505050505091505090565b5f5f611d865f51602061423c5f395f51905f52546001600160a01b031690565b6040516001600160a01b0386811660248301526001600160e01b031986166044830152919091169060640160408051601f198184030181529181526020820180516001600160e01b0316630435f69f60e51b17905251611de69190614025565b5f60405180830381855afa9150503d805f8114611e1e576040519150601f19603f3d011682016040523d82523d5f602084013e611e23565b606091505b5091509150811580611e46575080806020019051810190611e449190613c19565b155b15611e63576040516282b42960e81b815260040160405180910390fd5b50505050565b5f6001600160a01b0384161580611e8757506001600160a01b038316155b15611ea55760405163d92e233d60e01b815260040160405180910390fd5b6001600160a01b038481165f8181527f67df8e602072ae967fe4567cec1273e29da0bd7a5a1af20d9b5c8d3f0d838505602090815260408083209488168084529482529182902086905590518581525f51602061425c5f395f51905f529392917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3506001949350505050565b6001600160a01b0383165f9081527f67df8e602072ae967fe4567cec1273e29da0bd7a5a1af20d9b5c8d3f0d838505602090815260408083203384529091528120545f51602061425c5f395f51905f52905f198114611fc557611f9f848261404f565b6001600160a01b0387165f90815260058401602090815260408083203384529091529020555b6109a68686866129f1565b306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148061204d57507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166120415f5160206141dc5f395f51905f525490565b6001600160a01b031614155b15610b675760405163703e46dd60e11b815260040160405180910390fd5b60015f5160206141bc5f395f51905f52556040517f5daa87a0e9463431830481fd4b6e3403442dfb9a12b9c07597e9f61d50b633c8905f90a1565b7f67df8e602072ae967fe4567cec1273e29da0bd7a5a1af20d9b5c8d3f0d838506545f51602061425c5f395f51905f52905f03611e6357806120e88582613cb7565b50600181016120f78482613cb7565b5060028101805460ff191660ff8416179055466006820155612117612d36565b600782015550505050565b5f51602061423c5f395f51905f5280546001600160a01b0316610b0957610b0982612d08565b7f2c9356b94ada349e65b0a691cd15e24beddfc13e05a26de25d9c64509c824401545f51602061421c5f395f51905f52905f03610b0957610b0982612de0565b604051309033907f16f2354671bbabcb07367cc01a78931a00a812ee080430be4e8f1a76ab58212b905f90a33330146121d35760405162e6155960e41b815260040160405180910390fd5b610b098282612e24565b7f67df8e602072ae967fe4567cec1273e29da0bd7a5a1af20d9b5c8d3f0d838506545f905f51602061425c5f395f51905f529046146122235761221e612d36565b611cbf565b60070154919050565b5f5160206141fc5f395f51905f525460ff1661225b5760405163dcdde9dd60e01b815260040160405180910390fd5b5f5160206141fc5f395f51905f52805460ff191681556040517fa45f47fdea8a1efdd9029a5691c7f759c32b7c698632b563573e155625d16933905f90a150565b7f67df8e602072ae967fe4567cec1273e29da0bd7a5a1af20d9b5c8d3f0d83850380545f51602061425c5f395f51905f529183915f906122dd908490614062565b90915550506001600160a01b0383165f8181526004830160209081526040808320805487019055518581527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91015b60405180910390a3505050565b5f816001600160a01b0316639d91348d6040518163ffffffff1660e01b81526004015f60405180830381865afa92505050801561239757506040513d5f823e601f3d908101601f191682016040526123949190810190613dcc565b60015b6123a257505f919050565b50600192915050565b919050565b6123b8611fd0565b6123c28282612e42565b610b098282612e97565b306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610b675760405163703e46dd60e11b815260040160405180910390fd5b5f61241e6123cc565b505f5160206141dc5f395f51905f5290565b5f51602061421c5f395f51905f5280545f61244a82611399565b50509150505f5f61245a83612ea1565b915091506124688282612e42565b61247184612ef4565b50505f9092555050565b5f806001600160a01b038516612501576040516001600160a01b0385169084905f81818185875af1925050503d805f81146124d1576040519150601f19603f3d011682016040523d82523d5f602084013e6124d6565b606091505b505080925050816124fa576040516312171d8360e31b815260040160405180910390fd5b50816126d3565b6040516370a0823160e01b81526001600160a01b03858116600483015286915f918316906370a0823190602401602060405180830381865afa158015612549573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061256d9190613f43565b604080516001600160a01b03898116602483015260448083018a905283518084039091018152606490920183526020820180516001600160e01b031663a9059cbb60e01b1790529151929350606092918a16916125ca9190614025565b5f604051808303815f865af19150503d805f8114612603576040519150601f19603f3d011682016040523d82523d5f602084013e612608565b606091505b50909550905084158061263757505f81511180156126375750808060200190518101906126359190613c19565b155b15612655576040516312171d8360e31b815260040160405180910390fd5b6040516370a0823160e01b81526001600160a01b0388811660048301525f91908516906370a0823190602401602060405180830381865afa15801561269c573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906126c09190613f43565b90506126cc838261404f565b9450505050505b836001600160a01b0316856001600160a01b03167f7a43eea7e0e6937c4baa97b10dabb89519feb249fe9ddcb442415b029148520d8584604051612721929190918252602082015260400190565b60405180910390a35050505050565b5f51602061421c5f395f51905f5280545f61274a82611399565b50509150505f5f61275a83612ea1565b915091506127688282612e42565b61247184612faf565b5f5160206141fc5f395f51905f525460ff16156127a15760405163ab35696f60e01b815260040160405180910390fd5b5f5160206141fc5f395f51905f52805460ff191660011781556040517f9e87fac88ff661f02d44f95383c817fece4bce600a3dab7a54406878b965e752905f90a150565b7f67df8e602072ae967fe4567cec1273e29da0bd7a5a1af20d9b5c8d3f0d83850180546060915f51602061425c5f395f51905f5291611ce490613c34565b5f8181527f1626844f871e5080d673ecb96ea8a32c7bdf671ea137282b2886cd9d0fd9a70260209081526040808320815160808101835281546001600160a01b03168152600182015493810193909352600281018054606094869485945f51602061419c5f395f51905f52948694919284019161289f90613c34565b80601f01602080910402602001604051908101604052809291908181526020018280546128cb90613c34565b80156129165780601f106128ed57610100808354040283529160200191612916565b820191905f5260205f20905b8154815290600101906020018083116128f957829003601f168201915b505050505081526020016003820154815250509050805f0151816040015182602001518360600151955095509550955050509193509193565b6001600160a01b0382165f9081527f67df8e602072ae967fe4567cec1273e29da0bd7a5a1af20d9b5c8d3f0d8385046020526040812080545f51602061425c5f395f51905f52928492916129a490849061404f565b909155505060038101805483900390556040518281525f906001600160a01b038516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200161232c565b5f6001600160a01b0384161580612a0f57506001600160a01b038316155b15612a2d5760405163d92e233d60e01b815260040160405180910390fd5b6001600160a01b0384165f9081527f67df8e602072ae967fe4567cec1273e29da0bd7a5a1af20d9b5c8d3f0d8385046020526040812080545f51602061425c5f395f51905f5292859291612a8290849061404f565b90915550506001600160a01b038085165f818152600484016020526040908190208054870190555190918716907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90611f299087815260200190565b42841015612aff576040516305787bdf60e01b815260040160405180910390fd5b6001600160a01b0387165f9081527f67df8e602072ae967fe4567cec1273e29da0bd7a5a1af20d9b5c8d3f0d83850860205260408120805460018082019092555f51602061425c5f395f51905f52929091612b586121dd565b604080517f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c960208201526001600160a01b03808f1692820192909252908c166060820152608081018b905260a0810185905260c081018a905260e00160405160208183030381529060405280519060200120604051602001612bf192919061190160f01b81526002810192909252602282015260420190565b60408051601f1981840301815282825280516020918201205f84529083018083525260ff891690820152606081018790526080810186905260a0016020604051602081039080840390855afa158015612c4c573d5f5f3e3d5ffd5b5050604051601f1901519150506001600160a01b0381161580612c815750896001600160a01b0316816001600160a01b031614155b15612c9f57604051632057875960e21b815260040160405180910390fd5b50506001600160a01b038881165f8181526005840160209081526040808320948c16808452948252918290208a905590518981527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a35050505050505050565b5f51602061423c5f395f51905f5280546001600160a01b0319166001600160a01b0392909216919091179055565b6040515f905f51602061425c5f395f51905f52907f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f90612d77908390614075565b6040805191829003822060208301939093528101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608201524660808201523060a082015260c0016040516020818303038152906040528051906020012091505090565b805f03612e00576040516327df2edd60e11b815260040160405180910390fd5b7f2c9356b94ada349e65b0a691cd15e24beddfc13e05a26de25d9c64509c82440155565b612e2e8282613202565b612e38828261321e565b610b098282613273565b612e4a611c03565b6001600160a01b0316336001600160a01b031614610b095733612e6b611c03565b60405163fe6cd27560e01b81526001600160a01b039283166004820152911660248201526044016108d2565b610b0982826132a6565b5f6060606483511015612ec75760405163fc69850b60e01b815260040160405180910390fd5b8251612ed7908490600490613363565b806020019051810190612eea91906140e6565b9094909350915050565b5f8181527f1626844f871e5080d673ecb96ea8a32c7bdf671ea137282b2886cd9d0fd9a70160205260409020545f51602061419c5f395f51905f529015610b09575f8281526001808301602090815260408084208490556002808601909252832080546001600160a01b0319168155918201839055909190612f7890830182613742565b505f60039190910181905560405183917f134fdd648feeaf30251f0157f9624ef8608ff9a042aad6d13e73f35d21d3f88d91a25050565b612fb8816133e2565b5f8181527f1626844f871e5080d673ecb96ea8a32c7bdf671ea137282b2886cd9d0fd9a70260209081526040808320815160808101835281546001600160a01b031681526001820154938101939093526002810180545f51602061419c5f395f51905f529594938401919061302c90613c34565b80601f016020809104026020016040519081016040528092919081815260200182805461305890613c34565b80156130a35780601f1061307a576101008083540402835291602001916130a3565b820191905f5260205f20905b81548152906001019060200180831161308657829003601f168201915b50505091835250506003919091015460209182015281519082015160408301519293509091478211156130f15760405162fae2d560e21b8152600481018390524760248201526044016108d2565b5f8681526001808701602090815260408084208490556002808a01909252832080546001600160a01b031916815591820183905590919061313490830182613742565b600382015f905550505f836001600160a01b031683836040516131579190614025565b5f6040518083038185875af1925050503d805f8114613191576040519150601f19603f3d011682016040523d82523d5f602084013e613196565b606091505b50509050806131bb5760405163165a1d4160e01b8152600481018890526024016108d2565b867fbc76564aec85e3f50672da2d1ddca0390851fecefe61cd19d89dea91a8267829858585426040516131f1949392919061412a565b60405180910390a250505050505050565b805115610b0957610b095f5f5160206141bc5f395f51905f5255565b6132278261345f565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a280511561326b57610c488282613479565b610b09613505565b5f81511180156132885750613286610b34565b155b15610b095760405163b3a31bfd60e01b815260040160405180910390fd5b5f51602061421c5f395f51905f5254156132d35760405163e741fd4560e01b815260040160405180910390fd5b7f2c9356b94ada349e65b0a691cd15e24beddfc13e05a26de25d9c64509c824401545f51602061421c5f395f51905f52905f906133109042614062565b90505f61335a30868660405160240161332a929190614162565b60408051601f198184030181529190526020810180516001600160e01b03166319cccfd360e11b17905284613524565b90925550505050565b606061337082855161363e565b915061337c838361363e565b9250613388838361404f565b67ffffffffffffffff8111156133a0576133a061388c565b6040519080825280601f01601f1916602001820160405280156133ca576020820181803683370190505b509050828203836020860101602083015e9392505050565b5f8181527f1626844f871e5080d673ecb96ea8a32c7bdf671ea137282b2886cd9d0fd9a70160205260408120545f51602061419c5f395f51905f529181900361343e57604051634b9aaa0960e11b815260040160405180910390fd5b80421015610c4857604051630f0b32ff60e11b815260040160405180910390fd5b61346881613653565b5f5160206141dc5f395f51905f5255565b60605f5f846001600160a01b0316846040516134959190614025565b5f60405180830381855af49150503d805f81146134cd576040519150601f19603f3d011682016040523d82523d5f602084013e6134d2565b606091505b5091509150816117c4578051156134ec5780518082602001fd5b60405163d6bda27560e01b815260040160405180910390fd5b3415610b675760405163b398979f60e01b815260040160405180910390fd5b5f8142106135455760405163b7d0949760e01b815260040160405180910390fd5b5f51602061419c5f395f51905f5280543490825f61356283614183565b909155505081545f81815260018085016020908152604080842089905580516080810182526001600160a01b038c811682528184018881528284018d8152606084018d90528888526002808c0190965293909620825181546001600160a01b0319169216919091178155945193850193909355519396509092908201906135e99082613cb7565b5060608201518160030155905050827f8d6fedd41517ab865c3658696c50923b3493c8a93ffd016d919a599f03c7531b8783888860405161362d949392919061412a565b60405180910390a250509392505050565b5f81831061364c57816107fe565b5090919050565b806001600160a01b03163b5f0361368857604051634c9c8ce360e01b81526001600160a01b03821660048201526024016108d2565b806001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa9250505080156136e2575060408051601f3d908101601f191682019092526136df91810190613f43565b60015b61370a57604051634c9c8ce360e01b81526001600160a01b03821660048201526024016108d2565b5f5160206141dc5f395f51905f528114610b0957604051634c9c8ce360e01b81526001600160a01b03831660048201526024016108d2565b50805461374e90613c34565b5f825580601f1061375d575050565b601f0160209004905f5260205f2090810190611c0091905b80821115613788575f8155600101613775565b5090565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f6107fe602083018461378c565b6001600160a01b0381168114611c00575f5ffd5b8015158114611c00575f5ffd5b5f5f604083850312156137fe575f5ffd5b8235613809816137cc565b91506020830135613819816137e0565b809150509250929050565b5f5f60408385031215613835575f5ffd5b8235613840816137cc565b946020939093013593505050565b5f5f5f60608486031215613860575f5ffd5b833561386b816137cc565b9250602084013561387b816137cc565b929592945050506040919091013590565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f1916810167ffffffffffffffff811182821017156138c9576138c961388c565b604052919050565b5f67ffffffffffffffff8211156138ea576138ea61388c565b50601f01601f191660200190565b5f61390a613905846138d1565b6138a0565b905082815283838301111561391d575f5ffd5b828260208301375f602084830101529392505050565b5f82601f830112613942575f5ffd5b6107fe838335602085016138f8565b60ff81168114611c00575f5ffd5b5f5f5f5f5f5f60c08789031215613974575f5ffd5b863567ffffffffffffffff81111561398a575f5ffd5b61399689828a01613933565b965050602087013567ffffffffffffffff8111156139b2575f5ffd5b6139be89828a01613933565b95505060408701356139cf81613951565b9350606087013567ffffffffffffffff8111156139ea575f5ffd5b6139f689828a01613933565b9350506080870135613a07816137cc565b9598949750929591949360a090920135925050565b5f60208284031215613a2c575f5ffd5b8135613a37816137cc565b9392505050565b5f5f60408385031215613a4f575f5ffd5b8235613a5a816137cc565b9150602083013567ffffffffffffffff811115613a75575f5ffd5b8301601f81018513613a85575f5ffd5b613a94858235602084016138f8565b9150509250929050565b602080825282518282018190525f918401906040840190835b81811015613ad857835160ff16835260209384019390920191600101613ab7565b509095945050505050565b5f60208284031215613af3575f5ffd5b813567ffffffffffffffff811115613b09575f5ffd5b6117c484828501613933565b5f60208284031215613b25575f5ffd5b5035919050565b6001600160a01b0385168152608060208201525f613b4d608083018661378c565b6040830194909452506060015292915050565b604081525f613b72604083018561378c565b90508260208301529392505050565b5f5f5f5f5f5f5f60e0888a031215613b97575f5ffd5b8735613ba2816137cc565b96506020880135613bb2816137cc565b955060408801359450606088013593506080880135613bd081613951565b9699959850939692959460a0840135945060c09093013592915050565b5f5f60408385031215613bfe575f5ffd5b8235613c09816137cc565b91506020830135613819816137cc565b5f60208284031215613c29575f5ffd5b8151613a37816137e0565b600181811c90821680613c4857607f821691505b602082108103613c6657634e487b7160e01b5f52602260045260245ffd5b50919050565b601f821115610c4857805f5260205f20601f840160051c81016020851015613c915750805b601f840160051c820191505b81811015613cb0575f8155600101613c9d565b5050505050565b815167ffffffffffffffff811115613cd157613cd161388c565b613ce581613cdf8454613c34565b84613c6c565b6020601f821160018114613d17575f8315613d005750848201515b5f19600385901b1c1916600184901b178455613cb0565b5f84815260208120601f198516915b82811015613d465787850151825560209485019460019092019101613d26565b5084821015613d6357868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b5f604082016001600160a01b0385168352604060208401528084518083526060850191506020860192505f5b81811015613dc057835161ffff16835260209384019390920191600101613d9e565b50909695505050505050565b5f60208284031215613ddc575f5ffd5b815167ffffffffffffffff811115613df2575f5ffd5b8201601f81018413613e02575f5ffd5b805167ffffffffffffffff811115613e1c57613e1c61388c565b8060051b613e2c602082016138a0565b91825260208184018101929081019087841115613e47575f5ffd5b6020850194505b83851015613e755784519250613e6383613951565b82825260209485019490910190613e4e565b979650505050505050565b5f60208284031215613e90575f5ffd5b8151613a3781613951565b634e487b7160e01b5f52603260045260245ffd5b604081525f613ec1604083018561378c565b8281036020840152613ed3818561378c565b95945050505050565b805169ffffffffffffffffffff811681146123ab575f5ffd5b5f5f5f5f5f60a08688031215613f09575f5ffd5b613f1286613edc565b60208701516040880151606089015192975090955093509150613f3760808701613edc565b90509295509295909350565b5f60208284031215613f53575f5ffd5b5051919050565b5f613f67613905846138d1565b9050828152838383011115613f7a575f5ffd5b8282602083015e5f602084830101529392505050565b5f82601f830112613f9f575f5ffd5b6107fe83835160208501613f5a565b5f60208284031215613fbe575f5ffd5b815167ffffffffffffffff811115613fd4575f5ffd5b6117c484828501613f90565b5f60208284031215613ff0575f5ffd5b815167ffffffffffffffff811115614006575f5ffd5b8201601f81018413614016575f5ffd5b6117c484825160208401613f5a565b5f82518060208501845e5f920191825250919050565b634e487b7160e01b5f52601160045260245ffd5b818103818111156108015761080161403b565b808201808211156108015761080161403b565b5f5f835461408281613c34565b60018216801561409957600181146140ae576140db565b60ff19831686528115158202860193506140db565b865f5260205f205f5b838110156140d3578154888201526001909101906020016140b7565b505081860193505b509195945050505050565b5f5f604083850312156140f7575f5ffd5b8251614102816137cc565b602084015190925067ffffffffffffffff81111561411e575f5ffd5b613a9485828601613f90565b6001600160a01b0385168152836020820152608060408201525f614151608083018561378c565b905082606083015295945050505050565b6001600160a01b0383168152604060208201525f6117c4604083018461378c565b5f600182016141945761419461403b565b506001019056fe1626844f871e5080d673ecb96ea8a32c7bdf671ea137282b2886cd9d0fd9a700112dd7b7d700a9bfd03edf4d4ce6f92b1f5f1a2fd81fde871f4db11384aa0b00360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbcfedd7b171e5aaf71411eb61c81513b977191128c387240284b4edb396fcbdb002c9356b94ada349e65b0a691cd15e24beddfc13e05a26de25d9c64509c8244001fa5656f3245be71aa51744436d19e5d46b909e499930c5c32c93901cab5290067df8e602072ae967fe4567cec1273e29da0bd7a5a1af20d9b5c8d3f0d838500a264697066735822122035e0410d4d866dbce71da568bdb6a948e20748cc7ea05eb3930bbfd8a939035964736f6c634300081e0033","sourceMap":"1127:5125:5:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;879:83:10;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6987:249:4;;;;;;:::i;:::-;;:::i;:::-;;2580:203:2;;;;;;:::i;:::-;;:::i;:::-;;;1739:14:38;;1732:22;1714:41;;1702:2;1687:18;2580:203:2;1574:187:38;1503:91:10;;;:::i;:::-;;;1912:25:38;;;1900:2;1885:18;1503:91:10;1766:177:38;1996:253:2;;;;;;:::i;:::-;;:::i;2147:509:5:-;;;;;;:::i;:::-;;:::i;1604:177:4:-;;;;;;:::i;:::-;;:::i;1299:83:10:-;;;:::i;:::-;;;5332:4:38;5320:17;;;5302:36;;5290:2;5275:18;1299:83:10;5160:184:38;3173:180:24;;;;;;:::i;:::-;;:::i;2820:167:4:-;;;;;;:::i;:::-;;:::i;2769:101:10:-;;;:::i;994:92:15:-;;;:::i;1389:68:3:-;;;:::i;3947:135:2:-;;;;;;:::i;:::-;;:::i;4601:511:1:-;;;:::i;:::-;;;;;;;:::i;4014:179:4:-;;;;;;:::i;:::-;;:::i;1608:447:1:-;;;;;;:::i;:::-;;:::i;3410:167:4:-;;;;;;:::i;:::-;;:::i;1049:174:24:-;;;;;;:::i;:::-;;:::i;1490:110:26:-;;;:::i;2441:77:24:-;;;:::i;440:40:7:-;;;;;-1:-1:-1;;;;;440:40:7;;;;;;-1:-1:-1;;;;;6908:55:38;;;6890:74;;6878:2;6863:18;440:40:7;6744:226:38;5784:267:4;;;;;;:::i;:::-;;:::i;6353:291::-;;;;;;:::i;:::-;;:::i;4224:164:5:-;;;;;;:::i;:::-;;:::i;5258:173:4:-;;;;;;:::i;:::-;;:::i;2210:171::-;;;;;;:::i;:::-;;:::i;1788:111:10:-;;;;;;:::i;:::-;;:::i;4640:187:4:-;;;;;;:::i;:::-;;:::i;1892:79:24:-;;;:::i;2496:105:10:-;;;;;;:::i;:::-;;:::i;1213:64:3:-;;;:::i;1070:87:10:-;;;:::i;3304:391:5:-;;;;;;:::i;:::-;;:::i;1225:225:23:-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;:::i;2544:518:1:-;;;:::i;:::-;;;;8713:25:38;;;8769:2;8754:18;;8747:34;;;;8686:18;2544:518:1;8541:246:38;4260:141:2;;;;;;:::i;:::-;;:::i;2979:221:5:-;;;;;;:::i;:::-;;:::i;1421:214:2:-;;;;;;:::i;:::-;;:::i;1821:114:26:-;;;:::i;951:82:3:-;;;:::i;4898:93:5:-;4980:4;4898:93;;3691:483:1;;;:::i;:::-;;;;;;;;:::i;7622:259:4:-;;;;;;:::i;:::-;;:::i;371:25:7:-;;;:::i;3431:319:2:-;;;;;;:::i;:::-;;:::i;2170:135:10:-;;;;;;:::i;:::-;;:::i;742:164:18:-;;;;;;:::i;:::-;;:::i;1000:123:20:-;;;:::i;5375:326:1:-;;;:::i;879:83:10:-;916:13;948:7;:5;:7::i;:::-;941:14;;879:83;:::o;6987:249:4:-;1731:34:19;1745:10;1757:7;;-1:-1:-1;;;;;;1757:7:19;1731:13;:34::i;:::-;-1:-1:-1;;;;;;;;;;;1790:8:16;;;2060:65:::1;;;2098:16;;-1:-1:-1::0;;;2098:16:16::1;;;;;;;;;;;2060:65;7105:29:4::2;:27;:29::i;:::-;7093:83;::::0;-1:-1:-1;;;7093:83:4;;7152:1:::2;7093:83;::::0;::::2;10696:38:38::0;-1:-1:-1;;;;;10770:55:38;;;10750:18;;;10743:83;10869:14;;10862:22;10842:18;;;10835:50;7093:58:4;;;::::2;::::0;::::2;::::0;10669:18:38;;7093:83:4::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7208:8;-1:-1:-1::0;;;;;7191:38:4::2;;7218:10;7191:38;;;;1739:14:38::0;1732:22;1714:41;;1702:2;1687:18;;1574:187;7191:38:4::2;;;;;;;;6987:249:::0;;:::o;2580:203:2:-;2714:4;1731:34:19;1745:10;1757:7;;-1:-1:-1;;;;;;1757:7:19;1731:13;:34::i;:::-;-1:-1:-1;;;;;;;;;;;1790:8:16;;;2060:65:::1;;;2098:16;;-1:-1:-1::0;;;2098:16:16::1;;;;;;;;;;;2060:65;2737:39:2::2;2746:10;2758:8;2768:7;2737:8;:39::i;:::-;2730:46;;2134:1:16;2580:203:2::0;;;;:::o;1503:91:10:-;1547:7;1573:14;3872:13:9;;;3746:146;1996:253:2;2185:4;1731:34:19;1745:10;1757:7;;-1:-1:-1;;;;;;1757:7:19;1731:13;:34::i;:::-;958:26:2::1;::::0;-1:-1:-1;;;958:26:2;;-1:-1:-1;;;;;6908:55:38;;958:26:2::1;::::0;::::1;6890:74:38::0;2136:5:2;;958:4:::1;::::0;:16:::1;::::0;6863:18:38;;958:26:2::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;953:87;;1007:22;::::0;-1:-1:-1;;;1007:22:2;;-1:-1:-1;;;;;6908:55:38;;1007:22:2::1;::::0;::::1;6890:74:38::0;6863:18;;1007:22:2::1;;;;;;;;953:87;958:26:::2;::::0;-1:-1:-1;;;958:26:2;;-1:-1:-1;;;;;6908:55:38;;958:26:2::2;::::0;::::2;6890:74:38::0;2157:3:2;;958:4:::2;::::0;:16:::2;::::0;6863:18:38;;958:26:2::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;953:87;;1007:22;::::0;-1:-1:-1;;;1007:22:2;;-1:-1:-1;;;;;6908:55:38;;1007:22:2::2;::::0;::::2;6890:74:38::0;6863:18;;1007:22:2::2;6744:226:38::0;953:87:2::2;-1:-1:-1::0;;;;;;;;;;;1790:8:16;;;2060:65:::3;;;2098:16;;-1:-1:-1::0;;;2098:16:16::3;;;;;;;;;;;2060:65;2208:34:2::4;2222:5;2229:3;2234:7;2208:13;:34::i;:::-;2201:41:::0;1996:253;-1:-1:-1;;;;;;1996:253:2:o;2147:509:5:-;2018:13:27;:11;:13::i;:::-;-1:-1:-1;;;;;;;;;;;2082:36:14;1580:77:::1;;;1623:23;;-1:-1:-1::0;;;1623:23:14::1;;;;;;;;;;;1580:77;1666:17;:15;:17::i;:::-;2412:38:5::2;2424:5;2431:7;2440:9;2412:11;:38::i;:::-;2460:45;2479:25;2460:18;:45::i;:::-;2515:41;2534:21;2515:18;:41::i;:::-;2576:11;2570:25;;;;;:::i;:::-;;;2599:1;2570:30:::0;2566:84:::2;;2616:11;:23;2630:9:::0;2616:11;:23:::2;:::i;:::-;;2566:84;2147:509:::0;;;;;;:::o;1604:177:4:-;1668:4;1703:29;:27;:29::i;:::-;-1:-1:-1;;;;;1691:56:4;;1748:8;1771:1;1758:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1758:15:4;;1691:83;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;1299::10:-;1340:5;1364:11;3609:10:9;;;;;3488:138;3173:180:24;3294:52;3320:18;3340:5;3294:25;:52::i;:::-;3173:180;;:::o;2820:167:4:-;2879:4;2914:29;:27;:29::i;:::-;-1:-1:-1;;;;;2902:51:4;;2954:8;2977:1;2964:15;;2769:101:10;2818:7;2844:19;:17;:19::i;994:92:15:-;1040:4;1063:16;-1:-1:-1;;;;;;;;;;;2082:36:14;;1907:227;1389:68:3;1731:34:19;1745:10;1757:7;;-1:-1:-1;;;;;;1757:7:19;1731:13;:34::i;:::-;1440:10:3::1;:8;:10::i;:::-;1389:68::o:0;3947:135:2:-;1731:34:19;1745:10;1757:7;;-1:-1:-1;;;;;;1757:7:19;1731:13;:34::i;:::-;958:26:2::1;::::0;-1:-1:-1;;;958:26:2;;-1:-1:-1;;;;;6908:55:38;;958:26:2::1;::::0;::::1;6890:74:38::0;4027:3:2;;958:4:::1;::::0;:16:::1;::::0;6863:18:38;;958:26:2::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;953:87;;1007:22;::::0;-1:-1:-1;;;1007:22:2;;-1:-1:-1;;;;;6908:55:38;;1007:22:2::1;::::0;::::1;6890:74:38::0;6863:18;;1007:22:2::1;6744:226:38::0;953:87:2::1;-1:-1:-1::0;;;;;;;;;;;1790:8:16;;;2060:65:::2;;;2098:16;;-1:-1:-1::0;;;2098:16:16::2;;;;;;;;;;;2060:65;4056:19:2::3;4062:3;4067:7;4056:5;:19::i;:::-;1775:1:19::1;3947:135:2::0;;:::o;4601:511:1:-;4686:25;;4656:14;;-1:-1:-1;;;;;4686:25:1;4682:102;;4748:25;;-1:-1:-1;;;4748:25:1;;4770:1;4748:25;;;6890:74:38;6863:18;;4748:25:1;6744:226:38;4682:102:1;4818:25;;4798:46;;-1:-1:-1;;;;;4818:25:1;4798:19;:46::i;:::-;4794:150;;;4890:25;;;;;;;;;-1:-1:-1;;;;;4890:25:1;-1:-1:-1;;;;;4867:64:1;;:66;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;4867:66:1;;;;;;;;;;;;:::i;4794:150::-;4981:14;;;4993:1;4981:14;;;;;;;;;4954:24;;4981:14;;;;;;;;;-1:-1:-1;;5042:25:1;;5020:59;;;-1:-1:-1;;;5020:59:1;;;;4954:41;;-1:-1:-1;;;;;;5042:25:1;;;;5020:57;;-1:-1:-1;5020:59:1;;;;;;;;;;;;;;5042:25;5020:59;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;5005:9;5015:1;5005:12;;;;;;;;:::i;:::-;:74;;;;:12;;;;;;;;;;;:74;5096:9;4601:511;-1:-1:-1;4601:511:1:o;4014:179:4:-;4079:4;4114:29;:27;:29::i;:::-;-1:-1:-1;;;;;4102:57:4;;4160:8;4183:1;4170:15;;1608:447:1;1731:34:19;1745:10;1757:7;;-1:-1:-1;;;;;;1757:7:19;1731:13;:34::i;:::-;1740:25:1::1;::::0;-1:-1:-1;;;;;1740:25:1;;::::1;::::0;1779:45;::::1;::::0;;1775:128:::1;;1847:45;::::0;-1:-1:-1;;;1847:45:1;;-1:-1:-1;;;;;6908:55:38;;1847:45:1::1;::::0;::::1;6890:74:38::0;6863:18;;1847:45:1::1;6744:226:38::0;1775:128:1::1;1912:25;:54:::0;;-1:-1:-1;;;;;;1912:54:1::1;-1:-1:-1::0;;;;;1912:54:1;;::::1;::::0;;::::1;::::0;;;1981:67:::1;::::0;1912:54;;1981:67;::::1;::::0;::::1;::::0;-1:-1:-1;;1981:67:1::1;1704:351;1608:447:::0;:::o;3410:167:4:-;3469:4;3504:29;:27;:29::i;:::-;-1:-1:-1;;;;;3492:51:4;;3544:8;3567:1;3554:15;;1049:174:24;2018:13:27;:11;:13::i;:::-;1172:44:24::1;1190:18;1210:5;1172:17;:44::i;1490:110:26:-:0;1551:7;2419:20:27;:18;:20::i;:::-;1577:16:26::1;:14;:16::i;2441:77:24:-:0;-1:-1:-1;;;;;;;;;;;11293:13:25;2374:73;;2416:20;;-1:-1:-1;;;2416:20:25;;;;;;;;;;;2374:73;2495:16:24::1;:14;:16::i;5784:267:4:-:0;1731:34:19;1745:10;1757:7;;-1:-1:-1;;;;;;1757:7:19;1731:13;:34::i;:::-;-1:-1:-1;;;;;;;;;;;1790:8:16;;;2060:65:::1;;;2098:16;;-1:-1:-1::0;;;2098:16:16::1;;;;;;;;;;;2060:65;5908:29:4::2;:27;:29::i;:::-;5896:89;::::0;-1:-1:-1;;;5896:89:4;;5958:1:::2;5896:89;::::0;::::2;10696:38:38::0;-1:-1:-1;;;;;10770:55:38;;;10750:18;;;10743:83;10869:14;;10862:22;10842:18;;;10835:50;5896:61:4;;;::::2;::::0;::::2;::::0;10669:18:38;;5896:89:4::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6020:8;-1:-1:-1::0;;;;;6000:44:4::2;;6030:13;6000:44;;;;1739:14:38::0;1732:22;1714:41;;1702:2;1687:18;;1574:187;6353:291:4;1731:34:19;1745:10;1757:7;;-1:-1:-1;;;;;;1757:7:19;1731:13;:34::i;:::-;-1:-1:-1;;;;;;;;;;;1790:8:16;;;2060:65:::1;;;2098:16;;-1:-1:-1::0;;;2098:16:16::1;;;;;;;;;;;2060:65;6485:29:4::2;:27;:29::i;:::-;6473:97;::::0;-1:-1:-1;;;6473:97:4;;6539:1:::2;6473:97;::::0;::::2;10696:38:38::0;-1:-1:-1;;;;;10770:55:38;;;10750:18;;;10743:83;10869:14;;10862:22;10842:18;;;10835:50;6473:65:4;;;::::2;::::0;::::2;::::0;10669:18:38;;6473:97:4::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6609:8;-1:-1:-1::0;;;;;6585:52:4::2;;6619:17;6585:52;;;;1739:14:38::0;1732:22;1714:41;;1702:2;1687:18;;1574:187;4224:164:5;1731:34:19;1745:10;1757:7;;-1:-1:-1;;;;;;1757:7:19;1731:13;:34::i;:::-;-1:-1:-1;;;;;;;;;;;1790:8:16;;;2060:65:::1;;;2098:16;;-1:-1:-1::0;;;2098:16:16::1;;;;;;;;;;;2060:65;4346:35:5::2;4360:6;4368:3;4373:7;4346:13;:35::i;5258:173:4:-:0;5320:4;5355:29;:27;:29::i;:::-;-1:-1:-1;;;;;5343:54:4;;5398:8;5421:1;5408:15;;2210:171;2271:4;2306:29;:27;:29::i;:::-;-1:-1:-1;;;;;2294:53:4;;2348:8;2371:1;2358:15;;1788:111:10;-1:-1:-1;;;;;4225:21:9;;1846:7:10;4225:21:9;;;:11;:21;;;;;;1872:20:10;4085:168:9;4640:187:4;4709:4;4744:29;:27;:29::i;:::-;-1:-1:-1;;;;;4732:61:4;;4794:8;4817:1;4804:15;;1892:79:24;-1:-1:-1;;;;;;;;;;;11293:13:25;2374:73;;2416:20;;-1:-1:-1;;;2416:20:25;;;;;;;;;;;2374:73;1947:17:24::1;:15;:17::i;2496:105:10:-:0;-1:-1:-1;;;;;5007:18:9;;2551:7:10;5007:18:9;;;:8;:18;;;;;;2577:17:10;4870:162:9;1213:64:3;1731:34:19;1745:10;1757:7;;-1:-1:-1;;;;;;1757:7:19;1731:13;:34::i;:::-;1262:8:3::1;:6;:8::i;1070:87:10:-:0;1109:13;1141:9;:7;:9::i;3304:391:5:-;1731:34:19;1745:10;1757:7;;-1:-1:-1;;;;;;1757:7:19;1731:13;:34::i;:::-;-1:-1:-1;;;;;;;;;;;1790:8:16;;;2060:65:::1;;;2098:16;;-1:-1:-1::0;;;2098:16:16::1;;;;;;;;;;;2060:65;3402:31:5::2;3436:11;3402:45;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3516:12;3500:30;;;;;;3477:17;3461:35;;;;;;:69:::0;3457:133:::2;;3566:12;3553:26;;-1:-1:-1::0;;;3553:26:5::2;;;;;;;;:::i;3457:133::-;3599:11;:26;3613:12:::0;3599:11;:26:::2;:::i;:::-;;3640:48;3656:17;3675:12;3640:48;;;;;;;:::i;:::-;;;;;;;;3392:303;3304:391:::0;:::o;1225:225:23:-;1320:14;1336:17;1355:13;1370:11;1400:43;1430:12;1400:29;:43::i;:::-;1393:50;;;;;;;;1225:225;;;;;:::o;2544:518:1:-;2636:25;;2587:13;;;;-1:-1:-1;;;;;2636:25:1;:39;;:89;;-1:-1:-1;2699:25:1;;2679:46;;-1:-1:-1;;;;;2699:25:1;2679:19;:46::i;:::-;2632:167;;;2762:25;;2748:40;;-1:-1:-1;;;2748:40:1;;-1:-1:-1;;;;;2762:25:1;;;2748:40;;;6890:74:38;6863:18;;2748:40:1;6744:226:38;2632:167:1;2858:25;;;;;;;;;-1:-1:-1;;;;;2858:25:1;-1:-1:-1;;;;;2836:64:1;;:66;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;2809:93:1;;-1:-1:-1;2809:93:1;;-1:-1:-1;;;2931:1:1;2917:15;;;2913:70;;2955:17;;-1:-1:-1;;;2955:17:1;;;;;;;;;;;2913:70;3007:1;2997:6;:11;2993:63;;3031:14;;-1:-1:-1;;;3031:14:1;;;;;;;;;;;2993:63;2544:518;;:::o;4260:141:2:-;1731:34:19;1745:10;1757:7;;-1:-1:-1;;;;;;1757:7:19;1731:13;:34::i;:::-;958:26:2::1;::::0;-1:-1:-1;;;958:26:2;;-1:-1:-1;;;;;6908:55:38;;958:26:2::1;::::0;::::1;6890:74:38::0;4342:5:2;;958:4:::1;::::0;:16:::1;::::0;6863:18:38;;958:26:2::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;953:87;;1007:22;::::0;-1:-1:-1;;;1007:22:2;;-1:-1:-1;;;;;6908:55:38;;1007:22:2::1;::::0;::::1;6890:74:38::0;6863:18;;1007:22:2::1;6744:226:38::0;953:87:2::1;-1:-1:-1::0;;;;;;;;;;;1790:8:16;;;2060:65:::2;;;2098:16;;-1:-1:-1::0;;;2098:16:16::2;;;;;;;;;;;2060:65;4373:21:2::3;4379:5;4386:7;4373:5;:21::i;2979:221:5:-:0;958:26:2;;-1:-1:-1;;;958:26:2;;-1:-1:-1;;;;;6908:55:38;;958:26:2;;;6890:74:38;3071:3:5;;958:4:2;;:16;;6863:18:38;;958:26:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;953:87;;1007:22;;-1:-1:-1;;;1007:22:2;;-1:-1:-1;;;;;6908:55:38;;1007:22:2;;;6890:74:38;6863:18;;1007:22:2;6744:226:38;953:87:2;1731:34:19::1;1745:10;1757:7;;-1:-1:-1::0;;;;;;1757:7:19::1;1731:13;:34::i;:::-;-1:-1:-1::0;;;;;;;;;;;1790:8:16;;;2060:65:::2;;;2098:16;;-1:-1:-1::0;;;2098:16:16::2;;;;;;;;;;;2060:65;3113:30:5::3;3123:5;3130:3;3135:7;3113:9;:30::i;:::-;;3180:3;-1:-1:-1::0;;;;;3158:35:5::3;3173:5;-1:-1:-1::0;;;;;3158:35:5::3;;3185:7;3158:35;;;;1912:25:38::0;;1900:2;1885:18;;1766:177;3158:35:5::3;;;;;;;;2979:221:::0;;;;:::o;1421:214:2:-;1570:4;1731:34:19;1745:10;1757:7;;-1:-1:-1;;;;;;1757:7:19;1731:13;:34::i;:::-;958:26:2::1;::::0;-1:-1:-1;;;958:26:2;;-1:-1:-1;;;;;6908:55:38;;958:26:2::1;::::0;::::1;6890:74:38::0;1542:3:2;;958:4:::1;::::0;:16:::1;::::0;6863:18:38;;958:26:2::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;953:87;;1007:22;::::0;-1:-1:-1;;;1007:22:2;;-1:-1:-1;;;;;6908:55:38;;1007:22:2::1;::::0;::::1;6890:74:38::0;6863:18;;1007:22:2::1;6744:226:38::0;953:87:2::1;-1:-1:-1::0;;;;;;;;;;;1790:8:16;;;2060:65:::2;;;2098:16;;-1:-1:-1::0;;;2098:16:16::2;;;;;;;;;;;2060:65;1593:35:2::3;1603:10;1615:3;1620:7;1593:9;:35::i;:::-;1586:42:::0;1421:214;-1:-1:-1;;;;1421:214:2:o;1821:114:26:-;1873:7;1899:29;-1:-1:-1;;;;;;;;;;;1401:26:28;;1107:336;951:82:3;992:4;1015:11;-1:-1:-1;;;;;;;;;;;1790:8:16;;;;1664:141;3691:483:1;3799:25;;3739:24;;3765:18;;-1:-1:-1;;;;;3799:25:1;:39;;:90;;-1:-1:-1;3863:25:1;;3843:46;;-1:-1:-1;;;;;3863:25:1;3843:19;:46::i;:::-;3842:47;3799:90;3795:168;;;3926:25;;3912:40;;-1:-1:-1;;;3912:40:1;;-1:-1:-1;;;;;3926:25:1;;;3912:40;;;6890:74:38;6863:18;;3912:40:1;6744:226:38;3795:168:1;4033:25;;4082:35;;;-1:-1:-1;;;4082:35:1;;;;-1:-1:-1;;;;;4033:25:1;;;;;;4082:33;;:35;;;;;;;;;;;;;;4033:25;4082:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;4069:48;;4141:11;-1:-1:-1;;;;;4141:24:1;;:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;4141:26:1;;;;;;;;;;;;:::i;:::-;4127:40;;3785:389;3691:483;;:::o;7622:259:4:-;1731:34:19;1745:10;1757:7;;-1:-1:-1;;;;;;1757:7:19;1731:13;:34::i;:::-;-1:-1:-1;;;;;;;;;;;1790:8:16;;;2060:65:::1;;;2098:16;;-1:-1:-1::0;;;2098:16:16::1;;;;;;;;;;;2060:65;7743:29:4::2;:27;:29::i;:::-;7731:86;::::0;-1:-1:-1;;;7731:86:4;;7793:1:::2;7731:86;::::0;::::2;10696:38:38::0;-1:-1:-1;;;;;10770:55:38;;;10750:18;;;10743:83;10869:14;;10862:22;10842:18;;;10835:50;7731:61:4;;;::::2;::::0;::::2;::::0;10669:18:38;;7731:86:4::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7853:8;-1:-1:-1::0;;;;;7832:42:4::2;;7863:10;7832:42;;;;1739:14:38::0;1732:22;1714:41;;1702:2;1687:18;;1574:187;371:25:7;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;3431:319:2:-;1731:34:19;1745:10;1757:7;;-1:-1:-1;;;;;;1757:7:19;1731:13;:34::i;:::-;958:26:2::1;::::0;-1:-1:-1;;;958:26:2;;-1:-1:-1;;;;;6908:55:38;;958:26:2::1;::::0;::::1;6890:74:38::0;3655:6:2;;958:4:::1;::::0;:16:::1;::::0;6863:18:38;;958:26:2::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;953:87;;1007:22;::::0;-1:-1:-1;;;1007:22:2;;-1:-1:-1;;;;;6908:55:38;;1007:22:2::1;::::0;::::1;6890:74:38::0;6863:18;;1007:22:2::1;6744:226:38::0;953:87:2::1;-1:-1:-1::0;;;;;;;;;;;1790:8:16;;;2060:65:::2;;;2098:16;;-1:-1:-1::0;;;2098:16:16::2;;;;;;;;;;;2060:65;3687:56:2::3;3695:6;3703:8;3713:6;3721:9;3732:2;3736;3740;3687:7;:56::i;:::-;1775:1:19::1;3431:319:2::0;;;;;;;:::o;2170:135:10:-;-1:-1:-1;;;;;4635:19:9;;;2244:7:10;4635:19:9;;;:11;:19;;;;;;;;:29;;;;;;;;;;;;2270:28:10;4479:192:9;742:164:18;1731:34:19;1745:10;1757:7;;-1:-1:-1;;;;;;1757:7:19;1731:13;:34::i;:::-;844:55:18::1;873:25;844:28;:55::i;:::-;742:164:::0;:::o;1000:123:20:-;1060:7;1086:30;-1:-1:-1;;;;;;;;;;;2132:26:19;-1:-1:-1;;;;;2132:26:19;;1976:189;5375:326:1;5462:25;;5433:13;;-1:-1:-1;;;;;5462:25:1;5458:102;;5524:25;;-1:-1:-1;;;5524:25:1;;5546:1;5524:25;;;6890:74:38;6863:18;;5524:25:1;6744:226:38;5458:102:1;5627:25;;5670:24;;;-1:-1:-1;;;5670:24:1;;;;-1:-1:-1;;;;;5627:25:1;;;;;;5670:22;;:24;;;;;5570:32;;5670:24;;;;;;;5627:25;5670:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;5670:24:1;;;;;;;;;;;;:::i;:::-;5663:31;;;5375:326;:::o;2988:138:9:-;-1:-1:-1;;;;;;;;;;;3106:13:9;;3028;;13752:23;;;3106:13;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2988:138;:::o;3638:451:19:-;3802:13;3817:20;3841:30;-1:-1:-1;;;;;;;;;;;2132:26:19;-1:-1:-1;;;;;2132:26:19;;1976:189;3841:30;3896:73;;-1:-1:-1;;;;;18750:55:38;;;3896:73:19;;;18732:74:38;-1:-1:-1;;;;;;18842:33:38;;18822:18;;;18815:61;3841:41:19;;;;;18705:18:38;;3896:73:19;;;-1:-1:-1;;3896:73:19;;;;;;;;;;;;;;-1:-1:-1;;;;;3896:73:19;-1:-1:-1;;;3896:73:19;;;3841:138;;;3896:73;3841:138;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3801:178;;;;3995:8;3994:9;:41;;;;4019:7;4008:27;;;;;;;;;;;;:::i;:::-;4007:28;3994:41;3990:93;;;4058:14;;-1:-1:-1;;;4058:14:19;;;;;;;;;;;3990:93;3713:376;;3638:451;;:::o;6627:358:9:-;6714:4;-1:-1:-1;;;;;6734:20:9;;;;:46;;-1:-1:-1;;;;;;6758:22:9;;;6734:46;6730:72;;;6789:13;;-1:-1:-1;;;6789:13:9;;;;;;;;;;;6730:72;-1:-1:-1;;;;;6866:19:9;;;6813:22;6866:19;;;:11;:19;;;;;;;;:29;;;;;;;;;;;;;:39;;;6921:35;;1912:25:38;;;-1:-1:-1;;;;;;;;;;;13752:23:9;6866:29;:19;6921:35;;1885:18:38;6921:35:9;;;;;;;;-1:-1:-1;6974:4:9;;6627:358;-1:-1:-1;;;;6627:358:9:o;8081:422::-;-1:-1:-1;;;;;8285:18:9;;8197:4;8285:18;;;:11;:18;;;;;;;;8304:10;8285:30;;;;;;;;-1:-1:-1;;;;;;;;;;;13752:23:9;-1:-1:-1;;8366:29:9;;8362:86;;8430:18;8441:7;8430:8;:18;:::i;:::-;-1:-1:-1;;;;;8397:18:9;;;;;;:11;;;:18;;;;;;;;8416:10;8397:30;;;;;;;:51;8362:86;8466:30;8476:5;8483:3;8488:7;8466:9;:30::i;3345:466:27:-;3675:4;-1:-1:-1;;;;;3684:6:27;3667:23;;;:66;;;3727:6;-1:-1:-1;;;;;3694:39:27;:29;-1:-1:-1;;;;;;;;;;;1401:26:28;;1107:336;3694:29:27;-1:-1:-1;;;;;3694:39:27;;;3667:66;3650:155;;;3765:29;;-1:-1:-1;;;3765:29:27;;;;;;;;;;;2356:225:14;2535:1;-1:-1:-1;;;;;;;;;;;2497:40:14;2561:13;;;;;;;2356:225::o;5685:473:9:-;5888:18;;-1:-1:-1;;;;;;;;;;;13752:23:9;5831:22;5888:23;5884:268;;5927:1;:19;5936:10;5927:1;:19;:::i;:::-;-1:-1:-1;5960:8:9;;;:23;5971:12;5960:8;:23;:::i;:::-;-1:-1:-1;5997:10:9;;;:27;;-1:-1:-1;;5997:27:9;;;;;;;6060:13;6039:18;;;:34;6116:25;:23;:25::i;:::-;6087:26;;;:54;5821:337;5685:473;;;:::o;2643:281:19:-;-1:-1:-1;;;;;;;;;;;2796:26:19;;-1:-1:-1;;;;;2796:26:19;2792:126;;2852:55;2881:25;2852:28;:55::i;3114:210:25:-;3262:7;;-1:-1:-1;;;;;;;;;;;11713:43:25;3177:36;3262:12;3258:60;;3290:17;3300:6;3290:9;:17::i;6952:194::-;2570:34;;2598:4;;2578:10;;2570:34;;;;;2618:10;2640:4;2618:27;2614:58;;2654:18;;-1:-1:-1;;;2654:18:25;;;;;;;;;;;2614:58;7091:48:::1;7113:18;7133:5;7091:21;:48::i;10995:274:9:-:0;11155:18;;11047:7;;-1:-1:-1;;;;;;;;;;;13752:23:9;11138:13;:35;:124;;11237:25;:23;:25::i;:::-;11138:124;;;11192:26;;;;10995:274;-1:-1:-1;10995:274:9:o;2916:157:16:-;-1:-1:-1;;;;;;;;;;;1790:8:16;;;2354:69;;2393:19;;-1:-1:-1;;;2393:19:16;;;;;;;;;;;2354:69;-1:-1:-1;;;;;;;;;;;3025:16:16;;-1:-1:-1;;3025:16:16::1;::::0;;3056:10:::1;::::0;::::1;::::0;2966:25:::1;::::0;3056:10:::1;2956:117;2916:157::o:0;12320:381:9:-;12437:13;:24;;-1:-1:-1;;;;;;;;;;;13752:23:9;12454:7;;12384:22;;12437:24;;12454:7;;12437:24;:::i;:::-;;;;-1:-1:-1;;;;;;;12607:16:9;;;;;;:11;;;:16;;;;;;;;:27;;;;;;12660:34;1912:25:38;;;12660:34:9;;1885:18:38;12660:34:9;;;;;;;;12374:327;12320:381;;:::o;6057:262:1:-;6132:4;6175:14;-1:-1:-1;;;;;6152:53:1;;:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;6152:55:1;;;;;;;;;;;;:::i;:::-;;;6148:165;;-1:-1:-1;6297:5:1;;6057:262;-1:-1:-1;6057:262:1:o;6148:165::-;-1:-1:-1;6254:4:1;;6057:262;-1:-1:-1;;6057:262:1:o;6148:165::-;6057:262;;;:::o;4715:242:27:-;4831:13;:11;:13::i;:::-;4854:44;4872:18;4892:5;4854:17;:44::i;:::-;4908:42;4924:18;4944:5;4908:15;:42::i;4124:275::-;4315:4;-1:-1:-1;;;;;4324:6:27;4307:23;;4303:90;;4353:29;;-1:-1:-1;;;4353:29:27;;;;;;;;;;;2810:141;2859:7;2878:20;:18;:20::i;:::-;-1:-1:-1;;;;;;;;;;;;975:66:28;2810:141:27:o;5694:641:25:-;-1:-1:-1;;;;;;;;;;;5843:13:25;;5739:36;5895:42;5843:13;5895:28;:42::i;:::-;5866:71;;;;;6032:26;6060:22;6086:29;6109:5;6086:22;:29::i;:::-;6031:84;;;;6200:48;6218:18;6238:9;6200:17;:48::i;:::-;6259:39;6285:12;6259:25;:39::i;:::-;-1:-1:-1;;6315:13:25;6308:20;;;-1:-1:-1;;5694:641:25:o;1452:1656:12:-;1548:13;;-1:-1:-1;;;;;1615:20:12;;1611:1416;;1707:28;;-1:-1:-1;;;;;1707:8:12;;;1723:7;;1707:28;;;;1723:7;1707:8;:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1693:42;;;;;1754:8;1749:71;;1789:16;;-1:-1:-1;;;1789:16:12;;;;;;;;;;;1749:71;-1:-1:-1;1857:7:12;1611:1416;;;2080:29;;-1:-1:-1;;;2080:29:12;;-1:-1:-1;;;;;6908:55:38;;;2080:29:12;;;6890:74:38;2034:6:12;;2003:21;;2080:24;;;;;6863:18:38;;2080:29:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;2494:62;;;-1:-1:-1;;;;;20245:55:38;;;2494:62:12;;;20227:74:38;20317:18;;;;20310:34;;;2494:62:12;;;;;;;;;;20200:18:38;;;;2494:62:12;;;;;;;-1:-1:-1;;;;;2494:62:12;-1:-1:-1;;;2494:62:12;;;2465:105;;2055:54;;-1:-1:-1;2338:24:12;;2465:11;;;;:105;;2494:62;2465:105;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;2439:131:12;;-1:-1:-1;2439:131:12;-1:-1:-1;2749:9:12;;;:73;;;2784:1;2763:11;:18;:22;:58;;;;;2801:11;2790:31;;;;;;;;;;;;:::i;:::-;2789:32;2763:58;2745:135;;;2849:16;;-1:-1:-1;;;2849:16:12;;;;;;;;;;;2745:135;2918:29;;-1:-1:-1;;;2918:29:12;;-1:-1:-1;;;;;6908:55:38;;;2918:29:12;;;6890:74:38;2894:21:12;;2918:24;;;;;;6863:18:38;;2918:29:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;2894:53;-1:-1:-1;2986:30:12;3002:14;2894:53;2986:30;:::i;:::-;2962:54;;1881:1146;;;;1611:1416;3065:3;-1:-1:-1;;;;;3042:59:12;3057:6;-1:-1:-1;;;;;3042:59:12;;3070:7;3079:21;3042:59;;;;;;8713:25:38;;;8769:2;8754:18;;8747:34;8701:2;8686:18;;8541:246;3042:59:12;;;;;;;;1538:1570;;1452:1656;;;:::o;4325:630:25:-;-1:-1:-1;;;;;;;;;;;4475:13:25;;4371:36;4527:42;4475:13;4527:28;:42::i;:::-;4498:71;;;;;4664:26;4692:22;4718:29;4741:5;4718:22;:29::i;:::-;4663:84;;;;4819:48;4837:18;4857:9;4819:17;:48::i;:::-;4878:40;4905:12;4878:26;:40::i;2631:155:16:-;-1:-1:-1;;;;;;;;;;;1790:8:16;;;2060:65;;;2098:16;;-1:-1:-1;;;2098:16:16;;;;;;;;;;;2060:65;-1:-1:-1;;;;;;;;;;;2741:15:16;;-1:-1:-1;;2741:15:16::1;2752:4;2741:15;::::0;;2771:8:::1;::::0;::::1;::::0;-1:-1:-1;;2771:8:16::1;2672:114;2631:155::o:0;3234:142:9:-;3361:8;3354:15;;3276:13;;-1:-1:-1;;;;;;;;;;;13752:23:9;3354:15;;;:::i;4048:382:22:-;4170:14;4329:35;;;:21;:35;;;;;;;;4306:58;;;;;;;;;-1:-1:-1;;;;;4306:58:22;;;;;;;;;;;;;;4329:21;4306:58;;;;4186:17;;4170:14;;;;-1:-1:-1;;;;;;;;;;;9223:26:22;4170:14;;4329:35;;4306:58;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4382:3;:10;;;4394:3;:8;;;4404:3;:9;;;4415:3;:7;;;4374:49;;;;;;;;;;4048:382;;;;;:::o;12890:384:9:-;-1:-1:-1;;;;;13009:18:9;;12956:22;13009:18;;;:11;:18;;;;;:29;;-1:-1:-1;;;;;;;;;;;13752:23:9;13031:7;;13009:18;:29;;13031:7;;13009:29;:::i;:::-;;;;-1:-1:-1;;13181:13:9;;;:24;;;;;;;13231:36;;1912:25:38;;;-1:-1:-1;;;;;;;13231:36:9;;;;;1900:2:38;1885:18;13231:36:9;1766:177:38;7263:514:9;7345:4;-1:-1:-1;;;;;7365:19:9;;;;:40;;-1:-1:-1;;;;;;7388:17:9;;;7365:40;7361:66;;;7414:13;;-1:-1:-1;;;7414:13:9;;;;;;;;;;;7361:66;-1:-1:-1;;;;;7491:18:9;;7438:22;7491:18;;;:11;:18;;;;;:29;;-1:-1:-1;;;;;;;;;;;13752:23:9;7513:7;;7491:18;:29;;7513:7;;7491:29;:::i;:::-;;;;-1:-1:-1;;;;;;;7666:16:9;;;;;;;:11;;;:16;;;;;;;:27;;;;;;7719:29;7666:16;;7719:29;;;;;;;7686:7;1912:25:38;;1900:2;1885:18;;1766:177;9147:1718:9;9418:15;9406:9;:27;9402:63;;;9442:23;;-1:-1:-1;;;9442:23:9;;;;;;;;;;;9402:63;-1:-1:-1;;;;;9708:16:9;;9476:22;9708:16;;;:8;:16;;;;;;;9773:1;9757:17;;;9738:36;;;-1:-1:-1;;;;;;;;;;;13752:23:9;9708:16;;9965:19;:17;:19::i;:::-;10049:451;;;10093:165;10049:451;;;20895:25:38;-1:-1:-1;;;;;20956:55:38;;;20936:18;;;20929:83;;;;21048:55;;;21028:18;;;21021:83;21120:18;;;21113:34;;;21163:19;;;21156:35;;;21207:19;;;21200:35;;;20867:19;;10049:451:9;;;;;;;;;;;;10010:516;;;;;;9887:661;;;;;;;;-1:-1:-1;;;21504:27:38;;21556:1;21547:11;;21540:27;;;;21592:2;21583:12;;21576:28;21629:2;21620:12;;21246:392;9887:661:9;;;;-1:-1:-1;;9887:661:9;;;;;;;;;9856:710;;9887:661;9856:710;;;;9829:811;;;;;;;;;21870:25:38;21943:4;21931:17;;21911:18;;;21904:45;21965:18;;;21958:34;;;22008:18;;;22001:34;;;21842:19;;9829:811:9;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;9829:811:9;;-1:-1:-1;;9829:811:9;;;-1:-1:-1;;;;;;;10659:31:9;;;;:62;;;10715:6;-1:-1:-1;;;;;10694:27:9;:17;-1:-1:-1;;;;;10694:27:9;;;10659:62;10655:90;;;10730:15;;-1:-1:-1;;;10730:15:9;;;;;;;;;;;10655:90;-1:-1:-1;;;;;;;10760:19:9;;;;;;;:11;;;:19;;;;;;;;:29;;;;;;;;;;;;;:38;;;10824:34;;1912:25:38;;;10824:34:9;;1885:18:38;10824:34:9;;;;;;;9338:1527;9147:1718;;;;;;;:::o;3128:220:19:-;-1:-1:-1;;;;;;;;;;;3287:54:19;;-1:-1:-1;;;;;;3287:54:19;-1:-1:-1;;;;;3287:54:19;;;;;;;;;;3128:220::o;11409:540:9:-;11780:24;;11467:7;;-1:-1:-1;;;;;;;;;;;13752:23:9;11617:141;;11780:24;;13752:23;;11780:24;:::i;:::-;;;;;;;;;;11585:343;;;23109:25:38;;;;23150:18;;23143:34;;;;11826:14:9;23193:18:38;;;23186:34;11862:13:9;23236:18:38;;;23229:34;11905:4:9;23279:19:38;;;23272:84;23081:19;;11585:343:9;;;;;;;;;;;;11558:384;;;;;;11539:403;;;11409:540;:::o;9155:205:25:-;9212:6;9222:1;9212:11;9208:38;;9232:14;;-1:-1:-1;;;9232:14:25;;;;;;;;;;;9208:38;9337:7;:16;9155:205::o;6278:303:27:-;6398:51;6423:18;6443:5;6398:24;:51::i;:::-;6459:53;6486:18;6506:5;6459:26;:53::i;:::-;6522:52;6548:18;6568:5;6522:25;:52::i;5197:262:5:-;5328:29;:27;:29::i;:::-;-1:-1:-1;;;;;5314:43:5;:10;-1:-1:-1;;;;;5314:43:5;;5310:143;;5400:10;5412:29;:27;:29::i;:::-;5380:62;;-1:-1:-1;;;5380:62:5;;-1:-1:-1;;;;;23559:55:38;;;5380:62:5;;;23541:74:38;23651:55;;23631:18;;;23624:83;23514:18;;5380:62:5;23367:346:38;7596:181:25;7727:43;7744:18;7764:5;7727:16;:43::i;10072:897::-;10160:26;10188:22;10659:3;10644:5;:12;:18;10640:80;;;10685:24;;-1:-1:-1;;;10685:24:25;;;;;;;;;;;10640:80;10909:12;;10894:28;;10909:5;;10906:1;;10894:11;:28::i;:::-;10870:92;;;;;;;;;;;;:::i;:::-;10836:126;;;;-1:-1:-1;10072:897:25;-1:-1:-1;;10072:897:25:o;8324:415:22:-;8400:25;8463:24;;;:10;:24;;;;;;-1:-1:-1;;;;;;;;;;;9223:26:22;8463:29;8459:274;;8556:24;;;;:10;;;;:24;;;;;;;;8549:31;;;8645:21;;;;:35;;;;;8638:42;;-1:-1:-1;;;;;;8638:42:22;;;;;;;;;8645:35;;8556:24;8638:42;;;;8556:24;8638:42;:::i;:::-;-1:-1:-1;8638:42:22;;;;;;;;;8700:22;;8709:12;;8700:22;;;8390:349;8324:415;:::o;5380:1479::-;5457:36;5480:12;5457:22;:36::i;:::-;5503:25;5586:35;;;:21;:35;;;;;;;;5563:58;;;;;;;;;-1:-1:-1;;;;;5563:58:22;;;;;;;;;;;;;;5586:21;5563:58;;;;-1:-1:-1;;;;;;;;;;;9223:26:22;5503:25;5563:58;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;5563:58:22;;;-1:-1:-1;;5563:58:22;;;;;;;;;;;5649:10;;5686:9;;;;5726:8;;;;5563:58;;-1:-1:-1;5649:10:22;;5749:21;:30;-1:-1:-1;5745:116:22;;;5802:48;;-1:-1:-1;;;5802:48:22;;;;;8713:25:38;;;5828:21:22;8754:18:38;;;8747:34;8686:18;;5802:48:22;8541:246:38;5745:116:22;6056:24;;;;:10;;;;:24;;;;;;;;6049:31;;;6097:21;;;;:35;;;;;6090:42;;-1:-1:-1;;;;;;6090:42:22;;;;;;;;;6097:35;;6056:24;6090:42;;;;6056:24;6090:42;:::i;:::-;;;;;;;;;6550:13;6569:7;-1:-1:-1;;;;;6569:12:22;6589:6;6597:5;6569:34;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6549:54;;;6619:8;6614:85;;6650:38;;-1:-1:-1;;;6650:38:22;;;;;1912:25:38;;;1885:18;;6650:38:22;1766:177:38;6614:85:22;6736:12;6714:138;6762:7;6783:6;6803:5;9567:15;6714:138;;;;;;;;;:::i;:::-;;;;;;;;5447:1412;;;;;;5380:1479;:::o;5661:171:5:-;5764:12;;:16;5760:66;;5796:19;2830:1:14;-1:-1:-1;;;;;;;;;;;2792:40:14;2649:199;1723:370:28;1838:38;1857:18;1838;:38::i;:::-;1891:37;;-1:-1:-1;;;;;1891:37:28;;;;;;;;1943:12;;:16;1939:148;;1975:52;2001:18;2021:5;1975:25;:52::i;1939:148::-;2058:18;:16;:18::i;6007:243:5:-;6153:1;6138:5;:12;:16;:36;;;;;6159:15;:13;:15::i;:::-;6158:16;6138:36;6134:110;;;6197:36;;-1:-1:-1;;;6197:36:5;;;;;;;;;;;8122:777:25;-1:-1:-1;;;;;;;;;;;11293:13:25;:27;2187:70;;2228:18;;-1:-1:-1;;;2228:18:25;;;;;;;;;;;2187:70;8555:7;;-1:-1:-1;;;;;;;;;;;11713:43:25;8252:36:::1;::::0;8537:25:::1;::::0;:15:::1;:25;:::i;:::-;8507:55;;8573:20;8596:257;8636:4;8755:18;8791:5;8655:155;;;;;;;;;:::i;:::-;;::::0;;-1:-1:-1;;8655:155:25;;::::1;::::0;;;;;;::::1;::::0;::::1;::::0;;-1:-1:-1;;;;;8655:155:25::1;-1:-1:-1::0;;;8655:155:25::1;::::0;;8824:19;8596:18:::1;:257::i;:::-;8864:28:::0;;;-1:-1:-1;;;;8122:777:25:o;726:515:37:-;844:20;910:24;915:4;921:5;:12;910:4;:24::i;:::-;903:31;;953:18;958:6;966:4;953;:18::i;:::-;944:27;-1:-1:-1;1031:13:37;944:27;1031:4;:13;:::i;:::-;1021:24;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1021:24:37;;1011:34;;1217:6;1211:4;1207:17;1198:6;1191:4;1184:5;1180:16;1176:29;1169:4;1160:7;1156:18;1150:75;726:515;;;;;:::o;4873:307:22:-;4951:25;5025:24;;;:10;:24;;;;;;-1:-1:-1;;;;;;;;;;;9223:26:22;5063:9;;;5059:44;;5081:22;;-1:-1:-1;;;5081:22:22;;;;;;;;;;;5059:44;5140:4;9567:15;5117:27;5113:60;;;5153:20;;-1:-1:-1;;;5153:20:22;;;;;;;;;;;2450:288:28;2524:45;2550:18;2524:25;:45::i;:::-;-1:-1:-1;;;;;;;;;;;2675:47:28;2450:288::o;4304:785::-;4415:12;4605:13;4620:24;4648:7;-1:-1:-1;;;;;4648:20:28;4669:5;4648:27;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4604:71;;;;4691:8;4686:368;;4719:18;;:22;4715:296;;4901:11;4895:18;4963:15;4949:11;4945:2;4941:20;4934:45;4715:296;5031:12;;-1:-1:-1;;;5031:12:28;;;;;;;;;;;2152:122;2202:9;:13;2198:70;;2238:19;;-1:-1:-1;;;2238:19:28;;;;;;;;;;;7268:920:22;7395:19;7454:4;9567:15;7430:28;7426:84;;7481:18;;-1:-1:-1;;;7481:18:22;;;;;;;;;;;7426:84;-1:-1:-1;;;;;;;;;;;7702:20:22;;7595:9;;9223:26;7519:25;7702:20;;;:::i;:::-;;;;-1:-1:-1;;7754:18:22;;;7784:23;;;:10;;;;:23;;;;;;;;:30;;;7861:125;;;;;;;-1:-1:-1;;;;;7861:125:22;;;;;;;;;;;;;;;;;;;;;;;7824:34;;;:21;;;;:34;;;;;;;:162;;;;-1:-1:-1;;;;;;7824:162:22;;;;;;;;;;;;;;;;;;;7754:18;;-1:-1:-1;7861:125:22;;7824:162;;;;;;;;:::i;:::-;;;;;;;;;;;;;8082:11;8062:119;8107:7;8128:6;8148:5;8167:4;8062:119;;;;;;;;;:::i;:::-;;;;;;;;7416:772;;7268:920;;;;;:::o;1490:110:37:-;1550:7;1581:2;1576;:7;:17;;1591:2;1576:17;;;-1:-1:-1;1586:2:37;;1490:110;-1:-1:-1;1490:110:37:o;3163:759:28:-;3335:18;-1:-1:-1;;;;;3335:30:28;;3369:1;3335:35;3331:121;;3393:48;;-1:-1:-1;;;3393:48:28;;-1:-1:-1;;;;;6908:55:38;;3393:48:28;;;6890:74:38;6863:18;;3393:48:28;6744:226:38;3331:121:28;3603:18;-1:-1:-1;;;;;3585:51:28;;:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;3585:53:28;;;;;;;;-1:-1:-1;;3585:53:28;;;;;;;;;;;;:::i;:::-;;;3581:335;;3857:48;;-1:-1:-1;;;3857:48:28;;-1:-1:-1;;;;;6908:55:38;;3857:48:28;;;6890:74:38;6863:18;;3857:48:28;6744:226:38;3581:335:28;-1:-1:-1;;;;;;;;;;;3702:27:28;;3698:121;;3756:48;;-1:-1:-1;;;3756:48:28;;-1:-1:-1;;;;;6908:55:38;;3756:48:28;;;6890:74:38;6863:18;;3756:48:28;6744:226:38;-1:-1:-1;;;;;;;:::i;:::-;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;14:289:38:-;56:3;94:5;88:12;121:6;116:3;109:19;177:6;170:4;163:5;159:16;152:4;147:3;143:14;137:47;229:1;222:4;213:6;208:3;204:16;200:27;193:38;292:4;285:2;281:7;276:2;268:6;264:15;260:29;255:3;251:39;247:50;240:57;;;14:289;;;;:::o;308:220::-;457:2;446:9;439:21;420:4;477:45;518:2;507:9;503:18;495:6;477:45;:::i;533:154::-;-1:-1:-1;;;;;612:5:38;608:54;601:5;598:65;588:93;;677:1;674;667:12;692:118;778:5;771:13;764:21;757:5;754:32;744:60;;800:1;797;790:12;815:382;880:6;888;941:2;929:9;920:7;916:23;912:32;909:52;;;957:1;954;947:12;909:52;996:9;983:23;1015:31;1040:5;1015:31;:::i;:::-;1065:5;-1:-1:-1;1122:2:38;1107:18;;1094:32;1135:30;1094:32;1135:30;:::i;:::-;1184:7;1174:17;;;815:382;;;;;:::o;1202:367::-;1270:6;1278;1331:2;1319:9;1310:7;1306:23;1302:32;1299:52;;;1347:1;1344;1337:12;1299:52;1386:9;1373:23;1405:31;1430:5;1405:31;:::i;:::-;1455:5;1533:2;1518:18;;;;1505:32;;-1:-1:-1;;;1202:367:38:o;1948:508::-;2025:6;2033;2041;2094:2;2082:9;2073:7;2069:23;2065:32;2062:52;;;2110:1;2107;2100:12;2062:52;2149:9;2136:23;2168:31;2193:5;2168:31;:::i;:::-;2218:5;-1:-1:-1;2275:2:38;2260:18;;2247:32;2288:33;2247:32;2288:33;:::i;:::-;1948:508;;2340:7;;-1:-1:-1;;;2420:2:38;2405:18;;;;2392:32;;1948:508::o;2461:127::-;2522:10;2517:3;2513:20;2510:1;2503:31;2553:4;2550:1;2543:15;2577:4;2574:1;2567:15;2593:275;2664:2;2658:9;2729:2;2710:13;;-1:-1:-1;;2706:27:38;2694:40;;2764:18;2749:34;;2785:22;;;2746:62;2743:88;;;2811:18;;:::i;:::-;2847:2;2840:22;2593:275;;-1:-1:-1;2593:275:38:o;2873:187::-;2922:4;2955:18;2947:6;2944:30;2941:56;;;2977:18;;:::i;:::-;-1:-1:-1;3043:2:38;3022:15;-1:-1:-1;;3018:29:38;3049:4;3014:40;;2873:187::o;3065:338::-;3130:5;3159:53;3175:36;3204:6;3175:36;:::i;:::-;3159:53;:::i;:::-;3150:62;;3235:6;3228:5;3221:21;3275:3;3266:6;3261:3;3257:16;3254:25;3251:45;;;3292:1;3289;3282:12;3251:45;3341:6;3336:3;3329:4;3322:5;3318:16;3305:43;3395:1;3388:4;3379:6;3372:5;3368:18;3364:29;3357:40;3065:338;;;;;:::o;3408:222::-;3451:5;3504:3;3497:4;3489:6;3485:17;3481:27;3471:55;;3522:1;3519;3512:12;3471:55;3544:80;3620:3;3611:6;3598:20;3591:4;3583:6;3579:17;3544:80;:::i;3635:114::-;3719:4;3712:5;3708:16;3701:5;3698:27;3688:55;;3739:1;3736;3729:12;3754:1149;3886:6;3894;3902;3910;3918;3926;3979:3;3967:9;3958:7;3954:23;3950:33;3947:53;;;3996:1;3993;3986:12;3947:53;4036:9;4023:23;4069:18;4061:6;4058:30;4055:50;;;4101:1;4098;4091:12;4055:50;4124;4166:7;4157:6;4146:9;4142:22;4124:50;:::i;:::-;4114:60;;;4227:2;4216:9;4212:18;4199:32;4256:18;4246:8;4243:32;4240:52;;;4288:1;4285;4278:12;4240:52;4311;4355:7;4344:8;4333:9;4329:24;4311:52;:::i;:::-;4301:62;;;4413:2;4402:9;4398:18;4385:32;4426:29;4449:5;4426:29;:::i;:::-;4474:5;-1:-1:-1;4532:2:38;4517:18;;4504:32;4561:18;4548:32;;4545:52;;;4593:1;4590;4583:12;4545:52;4616;4660:7;4649:8;4638:9;4634:24;4616:52;:::i;:::-;4606:62;;;4720:3;4709:9;4705:19;4692:33;4734;4759:7;4734:33;:::i;:::-;3754:1149;;;;-1:-1:-1;3754:1149:38;;;;;4866:3;4851:19;;;4838:33;;-1:-1:-1;;3754:1149:38:o;4908:247::-;4967:6;5020:2;5008:9;4999:7;4995:23;4991:32;4988:52;;;5036:1;5033;5026:12;4988:52;5075:9;5062:23;5094:31;5119:5;5094:31;:::i;:::-;5144:5;4908:247;-1:-1:-1;;;4908:247:38:o;5349:585::-;5426:6;5434;5487:2;5475:9;5466:7;5462:23;5458:32;5455:52;;;5503:1;5500;5493:12;5455:52;5542:9;5529:23;5561:31;5586:5;5561:31;:::i;:::-;5611:5;-1:-1:-1;5667:2:38;5652:18;;5639:32;5694:18;5683:30;;5680:50;;;5726:1;5723;5716:12;5680:50;5749:22;;5802:4;5794:13;;5790:27;-1:-1:-1;5780:55:38;;5831:1;5828;5821:12;5780:55;5854:74;5920:7;5915:2;5902:16;5897:2;5893;5889:11;5854:74;:::i;:::-;5844:84;;;5349:585;;;;;:::o;6121:618::-;6307:2;6319:21;;;6389:13;;6292:18;;;6411:22;;;6259:4;;6490:15;;;6464:2;6449:18;;;6259:4;6533:180;6547:6;6544:1;6541:13;6533:180;;;6612:13;;6627:4;6608:24;6596:37;;6662:2;6688:15;;;;6653:12;;;;6569:1;6562:9;6533:180;;;-1:-1:-1;6730:3:38;;6121:618;-1:-1:-1;;;;;6121:618:38:o;7496:322::-;7565:6;7618:2;7606:9;7597:7;7593:23;7589:32;7586:52;;;7634:1;7631;7624:12;7586:52;7674:9;7661:23;7707:18;7699:6;7696:30;7693:50;;;7739:1;7736;7729:12;7693:50;7762;7804:7;7795:6;7784:9;7780:22;7762:50;:::i;7823:226::-;7882:6;7935:2;7923:9;7914:7;7910:23;7906:32;7903:52;;;7951:1;7948;7941:12;7903:52;-1:-1:-1;7996:23:38;;7823:226;-1:-1:-1;7823:226:38:o;8054:482::-;-1:-1:-1;;;;;8289:6:38;8285:55;8274:9;8267:74;8377:3;8372:2;8361:9;8357:18;8350:31;8248:4;8398:46;8439:3;8428:9;8424:19;8416:6;8398:46;:::i;:::-;8475:2;8460:18;;8453:34;;;;-1:-1:-1;8518:2:38;8503:18;8496:34;8390:54;8054:482;-1:-1:-1;;8054:482:38:o;8792:289::-;8967:2;8956:9;8949:21;8930:4;8987:45;9028:2;9017:9;9013:18;9005:6;8987:45;:::i;:::-;8979:53;;9068:6;9063:2;9052:9;9048:18;9041:34;8792:289;;;;;:::o;9086:1009::-;9197:6;9205;9213;9221;9229;9237;9245;9298:3;9286:9;9277:7;9273:23;9269:33;9266:53;;;9315:1;9312;9305:12;9266:53;9354:9;9341:23;9373:31;9398:5;9373:31;:::i;:::-;9423:5;-1:-1:-1;9480:2:38;9465:18;;9452:32;9493:33;9452:32;9493:33;:::i;:::-;9545:7;-1:-1:-1;9625:2:38;9610:18;;9597:32;;-1:-1:-1;9728:2:38;9713:18;;9700:32;;-1:-1:-1;9810:3:38;9795:19;;9782:33;9824:31;9782:33;9824:31;:::i;:::-;9086:1009;;;;-1:-1:-1;9086:1009:38;;;;9874:7;9954:3;9939:19;;9926:33;;-1:-1:-1;10058:3:38;10043:19;;;10030:33;;9086:1009;-1:-1:-1;;9086:1009:38:o;10100:388::-;10168:6;10176;10229:2;10217:9;10208:7;10204:23;10200:32;10197:52;;;10245:1;10242;10235:12;10197:52;10284:9;10271:23;10303:31;10328:5;10303:31;:::i;:::-;10353:5;-1:-1:-1;10410:2:38;10395:18;;10382:32;10423:33;10382:32;10423:33;:::i;10896:245::-;10963:6;11016:2;11004:9;10995:7;10991:23;10987:32;10984:52;;;11032:1;11029;11022:12;10984:52;11064:9;11058:16;11083:28;11105:5;11083:28;:::i;11146:380::-;11225:1;11221:12;;;;11268;;;11289:61;;11343:4;11335:6;11331:17;11321:27;;11289:61;11396:2;11388:6;11385:14;11365:18;11362:38;11359:161;;11442:10;11437:3;11433:20;11430:1;11423:31;11477:4;11474:1;11467:15;11505:4;11502:1;11495:15;11359:161;;11146:380;;;:::o;11657:518::-;11759:2;11754:3;11751:11;11748:421;;;11795:5;11792:1;11785:16;11839:4;11836:1;11826:18;11909:2;11897:10;11893:19;11890:1;11886:27;11880:4;11876:38;11945:4;11933:10;11930:20;11927:47;;;-1:-1:-1;11968:4:38;11927:47;12023:2;12018:3;12014:12;12011:1;12007:20;12001:4;11997:31;11987:41;;12078:81;12096:2;12089:5;12086:13;12078:81;;;12155:1;12141:16;;12122:1;12111:13;12078:81;;;12082:3;;11657:518;;;:::o;12351:1299::-;12477:3;12471:10;12504:18;12496:6;12493:30;12490:56;;;12526:18;;:::i;:::-;12555:97;12645:6;12605:38;12637:4;12631:11;12605:38;:::i;:::-;12599:4;12555:97;:::i;:::-;12701:4;12732:2;12721:14;;12749:1;12744:649;;;;13437:1;13454:6;13451:89;;;-1:-1:-1;13506:19:38;;;13500:26;13451:89;-1:-1:-1;;12308:1:38;12304:11;;;12300:24;12296:29;12286:40;12332:1;12328:11;;;12283:57;13553:81;;12714:930;;12744:649;11604:1;11597:14;;;11641:4;11628:18;;-1:-1:-1;;12780:20:38;;;12898:222;12912:7;12909:1;12906:14;12898:222;;;12994:19;;;12988:26;12973:42;;13101:4;13086:20;;;;13054:1;13042:14;;;;12928:12;12898:222;;;12902:3;13148:6;13139:7;13136:19;13133:201;;;13209:19;;;13203:26;-1:-1:-1;;13292:1:38;13288:14;;;13304:3;13284:24;13280:37;13276:42;13261:58;13246:74;;13133:201;-1:-1:-1;;;;13380:1:38;13364:14;;;13360:22;13347:36;;-1:-1:-1;12351:1299:38:o;13655:742::-;13823:4;13871:2;13860:9;13856:18;-1:-1:-1;;;;;13905:6:38;13901:55;13890:9;13883:74;13993:2;13988;13977:9;13973:18;13966:30;14016:6;14051;14045:13;14082:6;14074;14067:22;14120:2;14109:9;14105:18;14098:25;;14158:2;14150:6;14146:15;14132:29;;14179:1;14189:182;14203:6;14200:1;14197:13;14189:182;;;14268:13;;14283:6;14264:26;14252:39;;14320:2;14346:15;;;;14311:12;;;;14225:1;14218:9;14189:182;;;-1:-1:-1;14388:3:38;;13655:742;-1:-1:-1;;;;;;13655:742:38:o;14402:997::-;14495:6;14548:2;14536:9;14527:7;14523:23;14519:32;14516:52;;;14564:1;14561;14554:12;14516:52;14597:9;14591:16;14630:18;14622:6;14619:30;14616:50;;;14662:1;14659;14652:12;14616:50;14685:22;;14738:4;14730:13;;14726:27;-1:-1:-1;14716:55:38;;14767:1;14764;14757:12;14716:55;14800:2;14794:9;14826:18;14818:6;14815:30;14812:56;;;14848:18;;:::i;:::-;14894:6;14891:1;14887:14;14921:28;14945:2;14941;14937:11;14921:28;:::i;:::-;14983:19;;;15027:2;15057:11;;;15053:20;;;15018:12;;;;15085:19;;;15082:39;;;15117:1;15114;15107:12;15082:39;15149:2;15145;15141:11;15130:22;;15161:208;15177:6;15172:3;15169:15;15161:208;;;15250:3;15244:10;15231:23;;15267:29;15290:5;15267:29;:::i;:::-;15309:18;;;15356:2;15194:12;;;;15347;;;;15161:208;;;15388:5;14402:997;-1:-1:-1;;;;;;;14402:997:38:o;15404:247::-;15472:6;15525:2;15513:9;15504:7;15500:23;15496:32;15493:52;;;15541:1;15538;15531:12;15493:52;15573:9;15567:16;15592:29;15615:5;15592:29;:::i;15656:127::-;15717:10;15712:3;15708:20;15705:1;15698:31;15748:4;15745:1;15738:15;15772:4;15769:1;15762:15;15788:383;15985:2;15974:9;15967:21;15948:4;16011:45;16052:2;16041:9;16037:18;16029:6;16011:45;:::i;:::-;16104:9;16096:6;16092:22;16087:2;16076:9;16072:18;16065:50;16132:33;16158:6;16150;16132:33;:::i;:::-;16124:41;15788:383;-1:-1:-1;;;;;15788:383:38:o;16176:179::-;16254:13;;16307:22;16296:34;;16286:45;;16276:73;;16345:1;16342;16335:12;16360:571;16463:6;16471;16479;16487;16495;16548:3;16536:9;16527:7;16523:23;16519:33;16516:53;;;16565:1;16562;16555:12;16516:53;16588:39;16617:9;16588:39;:::i;:::-;16667:2;16652:18;;16646:25;16733:2;16718:18;;16712:25;16827:2;16812:18;;16806:25;16578:49;;-1:-1:-1;16646:25:38;;-1:-1:-1;16712:25:38;-1:-1:-1;16806:25:38;-1:-1:-1;16876:49:38;16920:3;16905:19;;16876:49;:::i;:::-;16866:59;;16360:571;;;;;;;;:::o;16936:230::-;17006:6;17059:2;17047:9;17038:7;17034:23;17030:32;17027:52;;;17075:1;17072;17065:12;17027:52;-1:-1:-1;17120:16:38;;16936:230;-1:-1:-1;16936:230:38:o;17171:341::-;17246:5;17275:53;17291:36;17320:6;17291:36;:::i;17275:53::-;17266:62;;17351:6;17344:5;17337:21;17391:3;17382:6;17377:3;17373:16;17370:25;17367:45;;;17408:1;17405;17398:12;17367:45;17450:6;17445:3;17438:4;17431:5;17427:16;17421:36;17504:1;17497:4;17488:6;17481:5;17477:18;17473:29;17466:40;17171:341;;;;;:::o;17517:235::-;17570:5;17623:3;17616:4;17608:6;17604:17;17600:27;17590:55;;17641:1;17638;17631:12;17590:55;17663:83;17742:3;17733:6;17727:13;17720:4;17712:6;17708:17;17663:83;:::i;17757:335::-;17836:6;17889:2;17877:9;17868:7;17864:23;17860:32;17857:52;;;17905:1;17902;17895:12;17857:52;17938:9;17932:16;17971:18;17963:6;17960:30;17957:50;;;18003:1;18000;17993:12;17957:50;18026:60;18078:7;18069:6;18058:9;18054:22;18026:60;:::i;18097:458::-;18177:6;18230:2;18218:9;18209:7;18205:23;18201:32;18198:52;;;18246:1;18243;18236:12;18198:52;18279:9;18273:16;18312:18;18304:6;18301:30;18298:50;;;18344:1;18341;18334:12;18298:50;18367:22;;18420:4;18412:13;;18408:27;-1:-1:-1;18398:55:38;;18449:1;18446;18439:12;18398:55;18472:77;18541:7;18536:2;18530:9;18525:2;18521;18517:11;18472:77;:::i;18887:301::-;19016:3;19054:6;19048:13;19100:6;19093:4;19085:6;19081:17;19076:3;19070:37;19162:1;19126:16;;19151:13;;;-1:-1:-1;19126:16:38;18887:301;-1:-1:-1;18887:301:38:o;19193:127::-;19254:10;19249:3;19245:20;19242:1;19235:31;19285:4;19282:1;19275:15;19309:4;19306:1;19299:15;19325:128;19392:9;;;19413:11;;;19410:37;;;19427:18;;:::i;19458:125::-;19523:9;;;19544:10;;;19541:36;;;19557:18;;:::i;22046:799::-;22176:3;22205:1;22238:6;22232:13;22268:36;22294:9;22268:36;:::i;:::-;22335:1;22320:17;;22346:133;;;;22493:1;22488:332;;;;22313:507;;22346:133;-1:-1:-1;;22379:24:38;;22367:37;;22452:14;;22445:22;22433:35;;22424:45;;;-1:-1:-1;22346:133:38;;22488:332;22519:6;22516:1;22509:17;22567:4;22564:1;22554:18;22594:1;22608:166;22622:6;22619:1;22616:13;22608:166;;;22702:14;;22689:11;;;22682:35;22758:1;22745:15;;;;22644:4;22637:12;22608:166;;;22612:3;;22803:6;22798:3;22794:16;22787:23;;22313:507;-1:-1:-1;22836:3:38;;22046:799;-1:-1:-1;;;;;22046:799:38:o;23718:471::-;23814:6;23822;23875:2;23863:9;23854:7;23850:23;23846:32;23843:52;;;23891:1;23888;23881:12;23843:52;23923:9;23917:16;23942:31;23967:5;23942:31;:::i;:::-;24041:2;24026:18;;24020:25;23992:5;;-1:-1:-1;24068:18:38;24057:30;;24054:50;;;24100:1;24097;24090:12;24054:50;24123:60;24175:7;24166:6;24155:9;24151:22;24123:60;:::i;24194:482::-;-1:-1:-1;;;;;24429:6:38;24425:55;24414:9;24407:74;24517:6;24512:2;24501:9;24497:18;24490:34;24560:3;24555:2;24544:9;24540:18;24533:31;24388:4;24581:46;24622:3;24611:9;24607:19;24599:6;24581:46;:::i;:::-;24573:54;;24663:6;24658:2;24647:9;24643:18;24636:34;24194:482;;;;;;;:::o;24681:338::-;-1:-1:-1;;;;;24860:6:38;24856:55;24845:9;24838:74;24948:2;24943;24932:9;24928:18;24921:30;24819:4;24968:45;25009:2;24998:9;24994:18;24986:6;24968:45;:::i;25024:135::-;25063:3;25084:17;;;25081:43;;25104:18;;:::i;:::-;-1:-1:-1;25151:1:38;25140:13;;25024:135::o","linkReferences":{},"cborAuxdata":{"1":{"value":"0xa264697066735822122035e0410d4d866dbce71da568bdb6a948e20748cc7ea05eb3930bbfd8a939035964736f6c634300081e0033","offset":17020}},"immutableReferences":{"3802":[{"start":8155,"length":32},{"start":8196,"length":32},{"start":9175,"length":32}]},"transformations":[{"id":"3802","type":"replace","offset":8155,"reason":"immutable"},{"id":"3802","type":"replace","offset":8196,"reason":"immutable"},{"id":"3802","type":"replace","offset":9175,"reason":"immutable"}],"transformationValues":{"immutables":{"3802":"0x0000000000000000000000007030fe438be6ed196b8886616bbf5a245c267339"}}},"deployment":{"transactionHash":"0xf27b1d0e942b4539f3b4f9c939a83759389e20a5f372462aab70d638b63c804e","blockNumber":"24877962","transactionIndex":"153","deployer":"0x61776319Fc4C120E9b1ec41306f2dB968bE1e95f"},"sources":{"apps/tokenization/SygFactory/interfaces/ISygFactory.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.30;\n\n/**\n * @custom:security-contact blockchain@sygnum.com\n * @title ISygFactory\n * @notice Interface for SygFactory contract\n * @dev Defines all public and external SygFactory functions\n */\ninterface ISygFactory {\n    /* ======== INITIALIZATION FUNCTIONS ======== */\n\n    /**\n     * @notice Initializes the SygFactory contract\n     * @param _initialImplementation The initial implementation address\n     * @param _destroyedImplementation The destroyed implementation address for SygTokenDestroyed\n     * @param _platformAdmin The address to be assigned the PLATFORM_ADMIN role\n     * @param _roleManager The address to be assigned the ROLE_MANAGER role\n     * @param _timelockDelaySeconds The delay in seconds before upgrades can be executed\n     */\n    function initialize(\n        address _initialImplementation,\n        address _destroyedImplementation,\n        address _platformAdmin,\n        address _roleManager,\n        uint256 _timelockDelaySeconds\n    ) external;\n\n    /* ======== ROLE CHECKING FUNCTIONS (from RolesManager) ======== */\n\n    /**\n     * @notice Checks if an account has role manager role within any of the specified groups\n     * @param _account The account address to check\n     * @param _groupIds The group IDs to check against\n     * @return True if the account has role manager role within any of the specified groups\n     */\n    function isRoleManager(address _account, uint16[] memory _groupIds) external view returns (bool);\n\n    /**\n     * @notice Checks if an account has operator role within any of the specified groups\n     * @param _account The account address to check\n     * @param _groupIds The group IDs to check against\n     * @return True if the account has operator role within any of the specified groups\n     */\n    function isOperator(address _account, uint16[] memory _groupIds) external view returns (bool);\n\n    /**\n     * @notice Checks if an account has system role within any of the specified groups\n     * @param _account The account address to check\n     * @param _groupIds The group IDs to check against\n     * @return True if the account has system role within any of the specified groups\n     */\n    function isSystem(address _account, uint16[] memory _groupIds) external view returns (bool);\n\n    /**\n     * @notice Checks if an account has pauser role within any of the specified groups\n     * @param _account The account address to check\n     * @param _groupIds The group IDs to check against\n     * @return True if the account has pauser role within any of the specified groups\n     */\n    function isPauser(address _account, uint16[] memory _groupIds) external view returns (bool);\n\n    /**\n     * @notice Checks if an account has minter/burner role within any of the specified groups\n     * @param _account The account address to check\n     * @param _groupIds The group IDs to check against\n     * @return True if the account has minter/burner role within any of the specified groups\n     */\n    function isMinterBurner(address _account, uint16[] memory _groupIds) external view returns (bool);\n\n    /**\n     * @notice Checks if an account has token user manager role within any of the specified groups\n     * @param _account The account address to check\n     * @param _groupIds The group IDs to check against\n     * @return True if the account has token user manager role within any of the specified groups\n     */\n    function isTokenUserManager(address _account, uint16[] memory _groupIds) external view returns (bool);\n\n    /**\n     * @notice Checks if an account has token role within any of the specified groups\n     * @param _account The account address to check\n     * @param _groupIds The group IDs to check against\n     * @return True if the account has token role within any of the specified groups\n     */\n    function isToken(address _account, uint16[] memory _groupIds) external view returns (bool);\n\n    /**\n     * @notice Checks if an account has token user role within any of the specified groups\n     * @param _account The account address to check\n     * @param _groupIds The group IDs to check against\n     * @return True if the account has token user role within any of the specified groups\n     */\n    function isTokenUser(address _account, uint16[] memory _groupIds) external view returns (bool);\n\n    /* ======== USER MANAGEMENT FUNCTIONS (from RolesManager) ======== */\n\n    /**\n     * @notice Updates role manager role for an account within a specific group\n     * @param _groupId The group ID for the account\n     * @param _account The account address to update\n     * @param _roleManager Whether to grant (true) or revoke (false) role manager role\n     */\n    function updateRoleManager(uint16 _groupId, address _account, bool _roleManager) external;\n\n    /**\n     * @notice Updates operator role for an account within a specific group\n     * @param _groupId The group ID for the account\n     * @param _account The account address to update\n     * @param _operator Whether to grant (true) or revoke (false) operator role\n     */\n    function updateOperator(uint16 _groupId, address _account, bool _operator) external;\n\n    /**\n     * @notice Updates system role for an account within a specific group\n     * @param _groupId The group ID for the account\n     * @param _account The account address to update\n     * @param _system Whether to grant (true) or revoke (false) system role\n     */\n    function updateSystem(uint16 _groupId, address _account, bool _system) external;\n\n    /**\n     * @notice Updates pauser role for an account within a specific group\n     * @param _groupId The group ID for the account\n     * @param _account The account address to update\n     * @param _pauser Whether to grant (true) or revoke (false) pauser role\n     */\n    function updatePauser(uint16 _groupId, address _account, bool _pauser) external;\n\n    /**\n     * @notice Updates minter/burner role for an account within a specific group\n     * @param _groupId The group ID for the account\n     * @param _account The account address to update\n     * @param _minterBurner Whether to grant (true) or revoke (false) minter/burner role\n     */\n    function updateMinterBurner(uint16 _groupId, address _account, bool _minterBurner) external;\n\n    /**\n     * @notice Updates token user manager role for an account within a specific group\n     * @param _groupId The group ID for the account\n     * @param _account The account address to update\n     * @param _tokenUserManager Whether to grant (true) or revoke (false) token user manager role\n     */\n    function updateTokenUserManager(uint16 _groupId, address _account, bool _tokenUserManager) external;\n\n    /**\n     * @notice Updates token user role for an account within a specific group\n     * @param _groupId The group ID for the account\n     * @param _account The account address to update\n     * @param _tokenUser Whether to grant (true) or revoke (false) token user role\n     */\n    function updateTokenUser(uint16 _groupId, address _account, bool _tokenUser) external;\n\n    /**\n     * @notice Blacklist a user from the token user role within a specific group\n     * @param _groupId The group ID for the account\n     * @param _account The account address to blacklist / unblacklist\n     * @param _blacklistTokenUser Whether to blacklist (true) or revoke the blacklist (false)\n     */\n    function blacklistTokenUser(uint16 _groupId, address _account, bool _blacklistTokenUser) external;\n\n    /* ======== TOKEN MANAGEMENT FUNCTIONS (from TokenManager) ======== */\n\n    /**\n     * @notice Gets the current SygToken implementation address\n     * @return implementationAddress The implementation address\n     */\n    function getSygTokenImplementation() external view returns (address implementationAddress);\n\n    /**\n     * @notice Updates the SygToken implementation address\n     * @param _newImplementation The new implementation address\n     */\n    function updateSygTokenImplementation(address _newImplementation) external;\n\n    /**\n     * @notice Deploys a new token with specified token configuration and group IDs\n     * @param _name The name of the token\n     * @param _symbol The symbol of the token\n     * @param _decimals The number of decimals for the token\n     * @param _tokenURI The URI for token metadata\n     * @param _groupIds The manual group IDs for the token (must be in range 0-1000), maximum 15 IDs\n     * @return _token The deployed token address\n     */\n    function deployToken(\n        string memory _name,\n        string memory _symbol,\n        uint8 _decimals,\n        string memory _tokenURI,\n        uint16[] memory _groupIds\n    ) external returns (address _token);\n\n    /**\n     * @notice Updates group IDs for a token\n     * @param _token The token address\n     * @param _groupIds The new group IDs for the token, maximum 15 IDs\n     */\n    function updateTokenGroupIds(address _token, uint16[] memory _groupIds) external;\n\n    /**\n     * @notice Enables a custom group ID for a token\n     * @param _token The token address\n     */\n    function enableCustomGroupId(address _token) external;\n\n    /**\n     * @notice Upgrades a token to the latest implementation\n     * @param _token The token address to upgrade\n     * @param _data The data to call on upgrade\n     */\n    function upgradeToken(address _token, bytes memory _data) external;\n\n    /**\n     * @notice Executes a scheduled token upgrade after the timelock delay\n     * @param _token The token address to complete the upgrade for\n     */\n    function executeTokenUpgrade(address _token) external;\n\n    /**\n     * @notice Cancels a scheduled token upgrade\n     * @param _token The token address to cancel the upgrade for\n     */\n    function cancelTokenUpgrade(address _token) external;\n\n    /**\n     * @notice Destroys a token by upgrading it to the destroyed implementation\n     * @dev For asynchronous upgrades, use executeTokenUpgrade to complete the destruction\n     * @param _token The token address to destroy\n     */\n    function destroyToken(address _token) external;\n\n    /**\n     * @notice Gets token information with properly formatted group IDs\n     * @param _tokenAddress The address of the token\n     * @return tokenAddress The token address\n     * @return groupIds Dynamic array containing only the actual group IDs\n     * @return implementationAddress The implementation address\n     * @return customGroupId The custom group ID (0 if not enabled)\n     */\n    function getTokenInfo(address _tokenAddress) external view returns (\n        address tokenAddress,\n        uint16[] memory groupIds,\n        address implementationAddress,\n        uint16 customGroupId\n    );\n\n    /**\n     * @notice Gets the destroyed implementation address for SygToken\n     * @return The address of the SygTokenDestroyed implementation\n     */\n    function getSygTokenDestroyedImplementation() external view returns (address);\n}\n"},"apps/tokenization/SygToken/contracts/ChainlinkDataFeed.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.30;\n\nimport {AggregatorV3Interface} from \"libs/external/chainlink-local/src/data-feeds/interfaces/AggregatorV3Interface.sol\";\nimport {IBundleAggregatorProxy} from\n    \"libs/external/chainlink-evm/contracts/src/v0.8/data-feeds/interfaces/IBundleAggregatorProxy.sol\";\nimport {PausableCore} from \"libs/Pausable/PausableCore.sol\";\nimport {PermissionedCore} from \"libs/Permissioned/PermissionedCore.sol\";\nimport {StorageLayout} from \"./storage/StorageLayout.sol\";\n\n/**\n * @custom:security-contact blockchain@sygnum.com\n * @title ChainlinkDataFeed\n * @author SYGNUM AG - Blockchain team 3301\n * @notice Contract for interacting with Chainlink price feed oracles\n * @dev Provides type-safe functions to fetch price data from AggregatorV3Interface or bundle data from\n *      IBundleAggregatorProxy. Consumers must call the correct function for the configured oracle type.\n */\nabstract contract ChainlinkDataFeed is StorageLayout, PausableCore, PermissionedCore {\n    /* ======== ERRORS ======== */\n\n    error InvalidOracle(address _oracleAddress);\n    error IncompleteRound();\n    error InvalidPrice();\n    error SameOracleAddress(address _oracleAddress);\n\n    /* ======== EVENTS ======== */\n\n    event PriceFeedOracleUpdated(address indexed previousOracle, address indexed newOracle);\n\n    /* ======== EXTERNAL/PUBLIC STATE-CHANGING FUNCTIONS ======== */\n\n    /**\n     * @notice Updates the price feed oracle address\n     * @dev Can be set to zero to disable price feed.\n     * @param _newPriceFeedOracleAddress The new oracle address (can be zero)\n     */\n    function updatePricefeedOracleAddress(address _newPriceFeedOracleAddress) external requiresAuth {\n        address _previousOracle = getPriceFeedOracleAddress;\n        if (_previousOracle == _newPriceFeedOracleAddress) {\n            revert SameOracleAddress(_newPriceFeedOracleAddress);\n        }\n        getPriceFeedOracleAddress = _newPriceFeedOracleAddress;\n        emit PriceFeedOracleUpdated(_previousOracle, _newPriceFeedOracleAddress);\n    }\n\n    /* ======== EXTERNAL/PUBLIC VIEW/PURE FUNCTIONS ======== */\n\n    /**\n     * @notice Gets the latest asset price from an AggregatorV3Interface oracle\n     * @dev Only works when the configured oracle is an AggregatorV3Interface (not a bundle feed).\n     *      Reverts with InvalidOracle if oracle is not set or is a bundle aggregator.\n     * @return _price The latest price as int256 (guaranteed positive)\n     * @return _updatedAt The timestamp of the last price update\n     */\n    function getPrice() external view returns (int256 _price, uint256 _updatedAt) {\n        if (getPriceFeedOracleAddress == address(0) || _isBundleAggregator(getPriceFeedOracleAddress)) {\n            revert InvalidOracle(getPriceFeedOracleAddress);\n        }\n\n        (, _price,, _updatedAt,) = AggregatorV3Interface(getPriceFeedOracleAddress).latestRoundData();\n\n        if (_updatedAt == 0) {\n            revert IncompleteRound();\n        }\n\n        if (_price <= 0) {\n            revert InvalidPrice();\n        }\n    }\n\n    /**\n     * @notice Gets the latest bundle data from an IBundleAggregatorProxy oracle\n     * @dev Only works when the configured oracle is an IBundleAggregatorProxy (not a V3 price feed).\n     *      Reverts with InvalidOracle if oracle is not set or is an AggregatorV3Interface.\n     *      The returned bytes are an opaque payload whose schema depends on the specific feed being queried.\n     *      The caller is responsible for decoding the payload according to that feed's documentation.\n     * @return _bundleData The raw bundle data bytes\n     * @return _updatedAt The timestamp of the last bundle update\n     */\n    function getBundleData() external view returns (bytes memory _bundleData, uint256 _updatedAt) {\n        if (getPriceFeedOracleAddress == address(0) || !_isBundleAggregator(getPriceFeedOracleAddress)) {\n            revert InvalidOracle(getPriceFeedOracleAddress);\n        }\n\n        IBundleAggregatorProxy _bundleFeed = IBundleAggregatorProxy(getPriceFeedOracleAddress);\n        _updatedAt = _bundleFeed.latestBundleTimestamp();\n        _bundleData = _bundleFeed.latestBundle();\n    }\n\n    /**\n     * @notice Gets the number of decimals for the price feed\n     * @dev Automatically detects if the oracle is an AggregatorV3Interface or IBundleAggregatorProxy\n     * @dev For AggregatorV3Interface, returns a single-element array\n     * @dev For IBundleAggregatorProxy, returns the bundleDecimals() array as-is\n     * @dev Reverts if oracle address is zero\n     * @return _decimals The decimals array\n     */\n    function getPriceFeedDecimals() external view returns (uint8[] memory) {\n        if (getPriceFeedOracleAddress == address(0)) {\n            revert InvalidOracle(address(0));\n        }\n\n        if (_isBundleAggregator(getPriceFeedOracleAddress)) {\n            return IBundleAggregatorProxy(getPriceFeedOracleAddress).bundleDecimals();\n        }\n\n        uint8[] memory _decimals = new uint8[](1);\n        _decimals[0] = AggregatorV3Interface(getPriceFeedOracleAddress).decimals();\n        return _decimals;\n    }\n\n    /**\n     * @notice Gets the description of the price feed\n     * @dev Works with both AggregatorV3Interface and IBundleAggregatorProxy (both have description())\n     * @dev Reverts if oracle address is zero\n     * @return The description string\n     */\n    function getPriceFeedDescription() external view returns (string memory) {\n        if (getPriceFeedOracleAddress == address(0)) {\n            revert InvalidOracle(address(0));\n        }\n\n        AggregatorV3Interface _priceFeed = AggregatorV3Interface(getPriceFeedOracleAddress);\n        return _priceFeed.description();\n    }\n\n    /* ======== PRIVATE VIEW/PURE FUNCTIONS ======== */\n\n    /**\n     * @notice Checks if the oracle address implements IBundleAggregatorProxy\n     * @dev Uses try/catch on bundleDecimals() to detect bundle interface\n     * @param _oracleAddress The oracle address to check\n     * @return True if the oracle implements IBundleAggregatorProxy\n     */\n    function _isBundleAggregator(address _oracleAddress) private view returns (bool) {\n        try IBundleAggregatorProxy(_oracleAddress).bundleDecimals() returns (uint8[] memory) {\n            return true;\n        } catch {\n            return false;\n        }\n    }\n}\n"},"apps/tokenization/SygToken/contracts/ERC20SygToken.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.30;\n\nimport {ERC20} from \"libs/ERC20/ERC20.sol\";\nimport {RolesManager} from \"./RolesManager.sol\";\n\n/**\n * @custom:security-contact blockchain@sygnum.com\n * @title ERC20SygToken\n * @author SYGNUM AG - Blockchain team 3301\n * @notice ERC20 implementation with role-based access control and whitelist restrictions\n * @dev This contract extends ERC20 to add TOKEN_USER checks for transfers and approvals,\n *      and provides mint/burn functions restricted to authorized roles.\n *      All transfer operations respect the paused state.\n */\nabstract contract ERC20SygToken is ERC20, RolesManager {\n    /* ======== ERRORS ======== */\n\n    error NotTokenUser(address account);\n\n    /* ======== MODIFIERS ======== */\n\n    /**\n     * @notice Modifier to check if an address is a whitelisted token user\n     * @param _account The address to check\n     */\n    modifier onlyTokenUser(address _account) {\n        if (!this.isTokenUser(_account)) {\n            revert NotTokenUser(_account);\n        }\n        _;\n    }\n\n    /* ======== EXTERNAL/PUBLIC VIEW/PURE FUNCTIONS ======== */\n\n    /**\n     * @notice Transfers tokens from caller to recipient\n     * @dev Overrides ERC20 transfer to add TOKEN_USER whitelist checks and pause protection\n     * @param _to The recipient address\n     * @param _amount The amount to transfer\n     * @return True if transfer succeeded\n     */\n    function transfer(\n        address _to,\n        uint256 _amount\n    ) public virtual override requiresAuth onlyTokenUser(_to) whenNotPaused returns (bool) {\n        return _transfer(msg.sender, _to, _amount);\n    }\n\n    /**\n     * @notice Transfers tokens from one address to another using allowance\n     * @dev Overrides ERC20 transferFrom to add TOKEN_USER whitelist checks and pause protection\n     * @param _from The sender address\n     * @param _to The recipient address\n     * @param _amount The amount to transfer\n     * @return True if transfer succeeded\n     */\n    function transferFrom(\n        address _from,\n        address _to,\n        uint256 _amount\n    ) public override requiresAuth onlyTokenUser(_from) onlyTokenUser(_to) whenNotPaused returns (bool) {\n        return _transferFrom(_from, _to, _amount);\n    }\n\n    /**\n     * @notice Approves a spender to transfer tokens on behalf of caller\n     * @dev Overrides ERC20 approve to add pause protection\n     * @param _spender The address allowed to spend tokens\n     * @param _amount The amount of tokens the spender is allowed to spend\n     * @return True if approval succeeded\n     */\n    function approve(\n        address _spender,\n        uint256 _amount\n    ) public virtual override requiresAuth whenNotPaused returns (bool) {\n        return _approve(msg.sender, _spender, _amount);\n    }\n\n    /* ======== EXTERNAL/PUBLIC STATE-CHANGING FUNCTIONS ======== */\n\n    /**\n     * @notice EIP-2612 permit function to approve spending via signed message\n     * @dev Overrides ERC20 permit to add TOKEN_USER check for owner and pause protection\n     * @param _owner The token owner's address\n     * @param _spender The spender's address\n     * @param _value The amount of tokens to approve\n     * @param _deadline The timestamp after which the signature is no longer valid\n     * @param _v The recovery byte of the signature\n     * @param _r The first 32 bytes of the signature\n     * @param _s The second 32 bytes of the signature\n     */\n    function permit(\n        address _owner,\n        address _spender,\n        uint256 _value,\n        uint256 _deadline,\n        uint8 _v,\n        bytes32 _r,\n        bytes32 _s\n    ) public override requiresAuth onlyTokenUser(_owner) whenNotPaused {\n        _permit(_owner, _spender, _value, _deadline, _v, _r, _s);\n    }\n\n    /**\n     * @notice Mints new tokens to a specified address\n     * @param _to The address to mint tokens to (must be TOKEN_USER)\n     * @param _amount The amount of tokens to mint\n     */\n    function mint(address _to, uint256 _amount) external requiresAuth onlyTokenUser(_to) whenNotPaused {\n        _mint(_to, _amount);\n    }\n\n    /**\n     * @notice Burns tokens from a specified address\n     * @param _from The address to burn tokens from\n     * @param _amount The amount of tokens to burn\n     */\n    function burn(address _from, uint256 _amount) external requiresAuth onlyTokenUser(_from) whenNotPaused {\n        _burn(_from, _amount);\n    }\n}\n"},"apps/tokenization/SygToken/contracts/PausableSygToken.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.30;\n\nimport {PausableCore} from \"libs/Pausable/PausableCore.sol\";\nimport {PermissionedCore} from \"libs/Permissioned/PermissionedCore.sol\";\nimport {IPausable} from \"libs/Pausable/interfaces/IPausable.sol\";\n\n/**\n * @custom:security-contact blockchain@sygnum.com\n * @title PausableSygToken\n * @author SYGNUM AG - Blockchain team 3301\n * @notice Pausable contract with role-based access control for pause/unpause operations\n * @dev This contract extends PausableCore to add authorization checks for pause/unpause operations.\n *      Only accounts with appropriate permissions can pause or unpause the contract.\n */\nabstract contract PausableSygToken is PausableCore, PermissionedCore, IPausable {\n    /* ======== EXTERNAL/PUBLIC VIEW FUNCTIONS ======== */\n\n    /**\n     * @notice Returns whether the contract is paused\n     * @return Boolean True if the contract is paused, false otherwise\n     */\n    function isPaused() public view returns (bool) {\n        return _isPaused();\n    }\n\n    /* ======== EXTERNAL/PUBLIC STATE-CHANGING FUNCTIONS ======== */\n\n    /**\n     * @notice Pauses the contract\n     * @dev Requires pauser authorization to execute\n     */\n    function pause() external requiresAuth {\n        _pause();\n    }\n\n    /**\n     * @notice Unpauses the contract\n     * @dev Requires pauser authorization to execute\n     */\n    function unpause() external requiresAuth {\n        _unpause();\n    }\n}\n"},"apps/tokenization/SygToken/contracts/RolesManager.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.30;\n\nimport {PausableCore} from \"libs/Pausable/PausableCore.sol\";\nimport {Permissioned} from \"libs/Permissioned/Permissioned.sol\";\nimport {ISygFactory} from \"apps/tokenization/SygFactory/interfaces/ISygFactory.sol\";\n\n/**\n * @custom:security-contact blockchain@sygnum.com\n * @title RolesManager\n * @author SYGNUM AG - Blockchain team 3301\n * @notice Manages role checking and user management by delegating to SygFactory\n * @dev This contract provides role-based access control functions that delegate to the permission manager (SygFactory).\n *      SygFactory automatically determines the applicable groups based on msg.sender (this token contract).\n */\nabstract contract RolesManager is PausableCore, Permissioned {\n    /* ======== EVENTS ======== */\n\n    event MinterBurnerUpdated(address indexed account, bool minterBurner);\n    event TokenUserManagerUpdated(address indexed account, bool tokenUserManager);\n    event TokenUserUpdated(address indexed account, bool tokenUser);\n    event TokenUserBlacklisted(address indexed account, bool blacklist);\n\n    /* ======== EXTERNAL/PUBLIC VIEW/PURE FUNCTIONS ======== */\n\n    /**\n     * @notice Checks if an account is a role manager\n     * @dev Groups are automatically determined by SygFactory based on this token's address.\n     *      Returns true only if the account is whitelisted in at least one group AND not blacklisted\n     *      in any group (blacklist supersedes whitelist).\n     * @param _account The account address to check\n     * @return True if the account is a role manager\n     */\n    function isRoleManager(address _account) external view returns (bool) {\n        return ISygFactory(getPermissionManagerAddress()).isRoleManager(_account, new uint16[](0));\n    }\n\n    /**\n     * @notice Checks if an account is an operator\n     * @dev Groups are automatically determined by SygFactory based on this token's address.\n     *      Returns true only if the account is whitelisted in at least one group AND not blacklisted\n     *      in any group (blacklist supersedes whitelist).\n     * @param _account The account address to check\n     * @return True if the account is an operator\n     */\n    function isOperator(address _account) external view returns (bool) {\n        return ISygFactory(getPermissionManagerAddress()).isOperator(_account, new uint16[](0));\n    }\n\n    /**\n     * @notice Checks if an account is a system account\n     * @dev Groups are automatically determined by SygFactory based on this token's address.\n     *      Returns true only if the account is whitelisted in at least one group AND not blacklisted\n     *      in any group (blacklist supersedes whitelist).\n     * @param _account The account address to check\n     * @return True if the account is a system account\n     */\n    function isSystem(address _account) external view returns (bool) {\n        return ISygFactory(getPermissionManagerAddress()).isSystem(_account, new uint16[](0));\n    }\n\n    /**\n     * @notice Checks if an account is a pauser\n     * @dev Groups are automatically determined by SygFactory based on this token's address.\n     *      Returns true only if the account is whitelisted in at least one group AND not blacklisted\n     *      in any group (blacklist supersedes whitelist).\n     * @param _account The account address to check\n     * @return True if the account is a pauser\n     */\n    function isPauser(address _account) external view returns (bool) {\n        return ISygFactory(getPermissionManagerAddress()).isPauser(_account, new uint16[](0));\n    }\n\n    /**\n     * @notice Checks if an account is a minter/burner\n     * @dev Groups are automatically determined by SygFactory based on this token's address.\n     *      Returns true only if the account is whitelisted in at least one group AND not blacklisted\n     *      in any group (blacklist supersedes whitelist).\n     * @param _account The account address to check\n     * @return True if the account is a minter/burner\n     */\n    function isMinterBurner(address _account) external view returns (bool) {\n        return ISygFactory(getPermissionManagerAddress()).isMinterBurner(_account, new uint16[](0));\n    }\n\n    /**\n     * @notice Checks if an account is a token user manager\n     * @dev Groups are automatically determined by SygFactory based on this token's address.\n     *      Returns true only if the account is whitelisted in at least one group AND not blacklisted\n     *      in any group (blacklist supersedes whitelist).\n     * @param _account The account address to check\n     * @return True if the account is a token user manager\n     */\n    function isTokenUserManager(address _account) external view returns (bool) {\n        return ISygFactory(getPermissionManagerAddress()).isTokenUserManager(_account, new uint16[](0));\n    }\n\n    /**\n     * @notice Checks if an account is a token user\n     * @dev Groups are automatically determined by SygFactory based on this token's address.\n     *      Returns true only if the account is whitelisted in at least one group AND not blacklisted\n     *      in any group (blacklist supersedes whitelist).\n     * @param _account The account address to check\n     * @return True if the account is a token user\n     */\n    function isTokenUser(address _account) external view returns (bool) {\n        return ISygFactory(getPermissionManagerAddress()).isTokenUser(_account, new uint16[](0));\n    }\n\n    /* ======== EXTERNAL/PUBLIC STATE-CHANGING FUNCTIONS ======== */\n\n    /**\n     * @notice Updates the minter/burner status for a given account by calling SygFactory\n     * @param _account The address of the account to update\n     * @param _minterBurner True to give minter/burner role to the account, false to remove minter/burner role\n     */\n    function updateMinterBurner(address _account, bool _minterBurner) external requiresAuth whenNotPaused {\n        ISygFactory(getPermissionManagerAddress()).updateMinterBurner(0, _account, _minterBurner);\n        emit MinterBurnerUpdated(_account, _minterBurner);\n    }\n\n    /**\n     * @notice Updates the token user manager status for a given account by calling SygFactory\n     * @param _account The address of the account to update\n     * @param _tokenUserManager True to give token user manager role to the account, false to remove token user manager role\n     */\n    function updateTokenUserManager(address _account, bool _tokenUserManager) external requiresAuth whenNotPaused {\n        ISygFactory(getPermissionManagerAddress()).updateTokenUserManager(0, _account, _tokenUserManager);\n        emit TokenUserManagerUpdated(_account, _tokenUserManager);\n    }\n\n    /**\n     * @notice Updates the token user status for a given account by calling SygFactory\n     * @dev Requires custom group ID to be enabled (customGroupId != 0)\n     * @param _account The address of the account to update\n     * @param _tokenUser True to give token user role to the account, false to remove token user role\n     */\n    function updateTokenUser(address _account, bool _tokenUser) external requiresAuth whenNotPaused {\n        ISygFactory(getPermissionManagerAddress()).updateTokenUser(0, _account, _tokenUser);\n        emit TokenUserUpdated(_account, _tokenUser);\n    }\n\n    /**\n     * @notice Blacklist a user from the token user role for a given account by calling SygFactory\n     * @dev Requires custom group ID to be enabled (customGroupId != 0)\n     * @param _account The address of the account to update\n     * @param _blacklist True to blacklist the user from the token user role, false to unblacklist the user from the token user role\n     */\n    function blacklistTokenUser(address _account, bool _blacklist) external requiresAuth whenNotPaused {\n        ISygFactory(getPermissionManagerAddress()).blacklistTokenUser(0, _account, _blacklist);\n        emit TokenUserBlacklisted(_account, _blacklist);\n    }\n}\n"},"apps/tokenization/SygToken/contracts/SygToken.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.30;\n\nimport {StorageLayout} from './storage/StorageLayout.sol';\nimport {Initializable} from \"libs/Initializable/Initializable.sol\";\nimport {ERC20SygToken} from \"./ERC20SygToken.sol\";\nimport {UUPSTimelockUpgradeable} from \"libs/UUPS/UUPSTimelockUpgradeable.sol\";\nimport {ChainlinkDataFeed} from \"./ChainlinkDataFeed.sol\";\nimport {ISygFactory} from \"apps/tokenization/SygFactory/interfaces/ISygFactory.sol\";\nimport {PausableSygToken} from \"./PausableSygToken.sol\";\nimport {FundRecoveryCore} from \"libs/FundRecovery/FundRecoveryCore.sol\";\n\n/**\n * @title SygToken\n * @author SYGNUM AG - Blockchain team 3301\n * @notice Tokenization contract for creating and managing digital assets with role-based permissions\n * @dev This contract combines ERC20 functionality with permission management for controlled tokenization.\n *      It supports features like minting, burning, and transfer restrictions based on user roles.\n *      Uses UUPSTimelockUpgradeable for secure, delayed upgrades.\n */\n // TODO: Inherit from ISygToken\n/**\n * @custom:security-contact blockchain@sygnum.com\n */\ncontract SygToken is Initializable, ERC20SygToken, UUPSTimelockUpgradeable, ChainlinkDataFeed, PausableSygToken, FundRecoveryCore {\n    /* ======== ERRORS ======== */\n\n    error ContractNotInitializedAfterUpgrade();\n    error UnauthorizedUpgrade(address caller, address expectedPermissionManager);\n    error SameTokenURI(string _tokenURI);\n\n    /* ======== EVENTS ======== */\n\n    event TokenURIUpdated(string previousTokenURI, string newTokenURI);\n    event ForcedTransfer(address indexed from, address indexed to, uint256 amount);\n\n    /* ======== INITIALIZER ======== */\n\n    /**\n     * @notice Initializes the SygToken contract\n     * @param _name The name of the token\n     * @param _symbol The symbol of the token\n     * @param _decimals The number of decimals for the token\n     * @param _tokenURI The URI for the token metadata\n     * @param _permissionManagerAddress Address of the permission manager contract\n     * @param _timelockDelaySeconds The delay in seconds before upgrades can be executed\n     */\n    function initialize(\n        string memory _name,\n        string memory _symbol,\n        uint8 _decimals,\n        string memory _tokenURI,\n        address _permissionManagerAddress,\n        uint256 _timelockDelaySeconds\n    ) public onlyProxy initializer {\n        _erc20_init(_name, _symbol, _decimals);\n        _permissioned_init(_permissionManagerAddress);\n        _UUPSTimelock_init(_timelockDelaySeconds);\n        if (bytes(getTokenURI).length == 0) {\n            getTokenURI = _tokenURI;\n        }\n    }\n\n    /* ======== EXTERNAL/PUBLIC STATE-CHANGING FUNCTIONS ======== */\n\n    /**\n     * @notice Forcefully transfers tokens from any account to a whitelisted receiver\n     * @param _from The sender address\n     * @param _to The recipient address (must be TOKEN_USER)\n     * @param _amount The amount to transfer\n     */\n    function forcedTransfer(address _from, address _to, uint256 _amount) external onlyTokenUser(_to) requiresAuth whenNotPaused {\n        _transfer(_from, _to, _amount);\n        emit ForcedTransfer(_from, _to, _amount);\n    }\n\n    /**\n     * @notice Updates the token URI\n     * @param _newTokenURI The new token URI\n     */\n    function updateTokenURI(string memory _newTokenURI) external requiresAuth whenNotPaused {\n        string memory _previousTokenURI = getTokenURI;\n        if (keccak256(bytes(_previousTokenURI)) == keccak256(bytes(_newTokenURI))) {\n            revert SameTokenURI(_newTokenURI);\n        }\n        getTokenURI = _newTokenURI;\n        emit TokenURIUpdated(_previousTokenURI, _newTokenURI);\n    }\n\n    /**\n     * @notice Recovers funds from the contract\n     * @dev If _token is address(0), recovers native token (ETH), else recovers ERC20 tokens\n     * For ERC-20 tokens, the emitted amounts include both the requested amount and the actual amount received,\n     * which may differ for fee-on-transfer tokens.\n     * @param _token The token address (zero for native)\n     * @param _to The recipient address\n     * @param _amount The amount to recover (in wei for native ETH, in token's smallest unit for ERC-20)\n     */\n    function recoverFunds(address _token, address payable _to, uint256 _amount) external requiresAuth whenNotPaused {\n        _recoverFunds(_token, _to, _amount);\n    }\n\n    /* ======== VIEW FUNCTIONS ======== */\n\n    /**\n     * @notice Marker function to identify SygToken implementations\n     * @dev This function provides a reliable way to check if a contract is a SygToken implementation\n     *      without relying on functions that may revert in certain states (like getPriceFeedDecimals\n     *      when oracle is not configured). This is used by SygTokenChecker for safe interface detection.\n     * @return True, indicating this is a SygToken implementation\n     */\n    function isSygTokenImplementation() external pure returns (bool) {\n        return true;\n    }\n\n    /* ======== UUPS UPGRADE HOOKS ======== */\n\n    /**\n     * @notice Authorizes upgrade to a new implementation\n     * @dev Only callable by the permission manager (TokenManager/SygFactory)\n     */\n    function _authorizeUpgrade(\n        address,\n        bytes memory\n    ) internal view virtual override {\n        if (msg.sender != getPermissionManagerAddress()) {\n            revert UnauthorizedUpgrade(msg.sender, getPermissionManagerAddress());\n        }\n    }\n\n    /**\n     * @notice Hook that is called before an upgrade is executed\n     * @dev Resets the initialized state only if upgrade data is provided (indicating re-initialization is needed)\n     */\n    function _preUpgradeToAndCallUUPS(address, bytes memory _data) internal virtual override {\n        if (_data.length > 0) {\n            _resetInitialized();\n        }\n    }\n\n    /**\n     * @notice Hook that is called after an upgrade is executed\n     * @dev Enforces that initialization must happen after upgrade when data is provided\n     */\n    function _postUpgradeToAndCallUUPS(\n        address,\n        bytes memory _data\n    ) internal view virtual override {\n        if (_data.length > 0 && !isInitialized()) {\n            revert ContractNotInitializedAfterUpgrade();\n        }\n    }\n}\n"},"apps/tokenization/SygToken/contracts/storage/StorageLayout.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.30;\n\nimport { StorageLayoutV1 } from \"./StorageLayoutV1.sol\";\n\n/**\n * @custom:security-contact blockchain@sygnum.com\n    * @title StorageLayout\n    * @author SYGNUM AG - Blockchain team 3301\n    * @notice This contract is used to store the state variables of SygToken.sol and all its derivatives. The storage is separated from the logic to allow for a more flexible upgradeability pattern, avoiding storage collisions\n    * @dev CRITICAL: Do NOT add variables directly to this contract!\n    * Always create a new versioned base (StorageLayoutV2, StorageLayoutV3, etc.) that inherits from the previous version.\n    *\n    * Example upgrade path:\n    * 1. Create: abstract contract StorageLayoutV2 is StorageLayoutV1 { newVar; }\n    * 2. Update: abstract contract StorageLayout is StorageLayoutV2 {}\n*/\n\nabstract contract StorageLayout is StorageLayoutV1 {\n    // ⚠️ NEVER ADD VARIABLES HERE! See @dev comment above for upgrade instructions.\n}\n"},"apps/tokenization/SygToken/contracts/storage/StorageLayoutV1.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.30;\n\n/**\n * @custom:security-contact blockchain@sygnum.com\n * @title StorageLayoutV1\n * @notice Version 1 of storage layout for SygToken\n * @dev CRITICAL: Once deployed, NEVER modify this contract!\n */\nabstract contract StorageLayoutV1 {\n    /*/////     SygToken Storage     /////*/\n\n    // Token state management\n    string public getTokenURI;\n\n    // Price feed oracle integration\n    address public getPriceFeedOracleAddress;\n}\n"},"libs/ERC20/ERC20.sol":{"content":"// SPDX-License-Identifier: AGPL-3.0-only\npragma solidity >=0.8.0;\n\nimport {ERC20View} from \"libs/ERC20/ERC20View.sol\";\n\n/**\n * @custom:security-contact blockchain@sygnum.com\n * @title ERC20\n * @author SYGNUM AG - Blockchain team 3301\n * @dev Standard ERC20 implementation that extends ERC20View\n * and exposes the basic ERC20 interface functions.\n */\ncontract ERC20 is ERC20View {\n    /*//////////////////////////////////////////////////////////////\n                        EXTERNAL/PUBLIC FUNCTIONS\n    //////////////////////////////////////////////////////////////*/\n\n    /**\n     * @dev Approves the spender to spend tokens on behalf of the caller.\n     * @param _spender The address allowed to spend tokens\n     * @param _amount The amount of tokens the spender is allowed to spend\n     * @return A boolean indicating whether the operation succeeded\n     */\n    function approve(address _spender, uint256 _amount) public virtual returns (bool) {\n        return _approve(msg.sender, _spender, _amount);\n    }\n\n    /**\n     * @dev Transfers tokens from the caller to the recipient.\n     * @param _to The address to transfer tokens to\n     * @param _amount The amount of tokens to transfer\n     * @return A boolean indicating whether the operation succeeded\n     */\n    function transfer(address _to, uint256 _amount) public virtual returns (bool) {\n        return _transfer(msg.sender, _to, _amount);\n    }\n\n    /**\n     * @dev Transfers tokens from one address to another using the allowance mechanism.\n     * @param _from The address to transfer tokens from\n     * @param _to The address to transfer tokens to\n     * @param _amount The amount of tokens to transfer\n     * @return A boolean indicating whether the operation succeeded\n     */\n    function transferFrom(\n        address _from,\n        address _to,\n        uint256 _amount\n    ) public virtual returns (bool) {\n        return _transferFrom(_from, _to, _amount);\n    }\n\n    /**\n     * @dev EIP-2612 permit function to approve spending via signed message.\n     * @param _owner The token owner's address\n     * @param _spender The spender's address\n     * @param _value The amount of tokens to approve\n     * @param _deadline The timestamp after which the signature is no longer valid\n     * @param _v The recovery byte of the signature\n     * @param _r The first 32 bytes of the signature\n     * @param _s The second 32 bytes of the signature\n     */\n    function permit(\n        address _owner,\n        address _spender,\n        uint256 _value,\n        uint256 _deadline,\n        uint8 _v,\n        bytes32 _r,\n        bytes32 _s\n    ) public virtual {\n        _permit(_owner, _spender, _value, _deadline, _v, _r, _s);\n    }\n}\n"},"libs/ERC20/ERC20Core.sol":{"content":"// SPDX-License-Identifier: AGPL-3.0-only\npragma solidity >=0.8.0;\n\n/*//////////////////////////////////////////////////////////////\n                            CUSTOM ERRORS\n//////////////////////////////////////////////////////////////*/\n\nerror PermitDeadlineExpired();\nerror InvalidSigner();\nerror ZeroAddress();\n\n/**\n * @title ERC20Core\n * @author SYGNUM AG - Blockchain team 3301\n * @notice Core ERC20 implementation with slot storage pattern\n * @dev This contract is a copy of the ERC20 contract from Solmate with a few twist:\n *   1. The variables use slot storage pattern for better encapsulation\n *   2. The contract has been made upgradeable\n *   3. Require statements have been replaced with custom errors\n */\n\n/** Solmate notes: */\n/// @notice Modern and gas efficient ERC20 + EIP-2612 implementation.\n/// @author Solmate (https://github.com/transmissions11/solmate/blob/main/src/tokens/ERC20.sol)\n/// @author Modified from Uniswap (https://github.com/Uniswap/uniswap-v2-core/blob/master/contracts/UniswapV2ERC20.sol)\n/// @dev Do not manually set balances without updating totalSupply, as the sum of all user balances must not exceed it.\n/**\n * @custom:security-contact blockchain@sygnum.com\n */\nabstract contract ERC20Core {\n    /* ======== STATE VARIABLES ======== */\n    \n    /**\n     * @dev ERC20_STORAGE_SLOT is a constant used to locate the ERC20Storage struct in storage.\n     * This ensures a unique storage slot, minimizing collision risks with other storage variables in the contract.\n     * It's calculated as keccak256(abi.encode(uint256(keccak256(\"ERC20Core.ERC20Storage\")) - 1)) & ~bytes32(uint256(0xff)).\n     */\n    bytes32 private constant ERC20_CORE_STORAGE_SLOT =\n        0x67df8e602072ae967fe4567cec1273e29da0bd7a5a1af20d9b5c8d3f0d838500;\n\n    /// @custom:storage-location erc7201:ERC20Core.ERC20Storage\n    struct ERC20Storage {\n        // METADATA STORAGE\n        string name;\n        string symbol;\n        uint8 decimals;\n        // ERC20 STORAGE\n        uint256 totalSupply;\n        mapping(address account => uint256 balance) balanceOf;\n        mapping(address owner => mapping(address spender => uint256 amount)) allowance;\n        // EIP-2612 STORAGE\n        uint256 INITIAL_CHAIN_ID;\n        bytes32 INITIAL_DOMAIN_SEPARATOR;\n        mapping(address account => uint256 nonce) nonces;\n    }\n    /*//////////////////////////////////////////////////////////////\n                                 EVENTS\n    //////////////////////////////////////////////////////////////*/\n\n    event Transfer(address indexed from, address indexed to, uint256 amount);\n\n    event Approval(\n        address indexed owner,\n        address indexed spender,\n        uint256 amount\n    );\n\n    /*//////////////////////////////////////////////////////////////\n                            VIEW FUNCTIONS\n    //////////////////////////////////////////////////////////////*/\n\n    /**\n     * @notice Returns the name of the token\n     * @return The name of the token\n     */\n    function _name() internal view returns (string memory) {\n        ERC20Storage storage $ = _getERC20Storage();\n        return $.name;\n    }\n\n    /**\n     * @notice Returns the symbol of the token\n     * @return The symbol of the token\n     */\n    function _symbol() internal view returns (string memory) {\n        ERC20Storage storage $ = _getERC20Storage();\n        return $.symbol;\n    }\n\n    /**\n     * @notice Returns the decimals of the token\n     * @return The decimals of the token\n     */\n    function _decimals() internal view returns (uint8) {\n        ERC20Storage storage $ = _getERC20Storage();\n        return $.decimals;\n    }\n\n    /**\n     * @notice Returns the total supply of the token\n     * @return The total supply of the token\n     */\n    function _totalSupply() internal view returns (uint256) {\n        ERC20Storage storage $ = _getERC20Storage();\n        return $.totalSupply;\n    }\n\n    /**\n     * @notice Returns the balance of the specified address\n     * @param _account The address to query the balance of\n     * @return The balance of the specified address\n     */\n    function _balanceOf(address _account) internal view returns (uint256) {\n        ERC20Storage storage $ = _getERC20Storage();\n        return $.balanceOf[_account];\n    }\n\n    /**\n     * @notice Returns the allowance of the spender for the owner\n     * @param _owner The address of the token owner\n     * @param _spender The address of the spender\n     * @return The allowance amount\n     */\n    function _allowance(address _owner, address _spender) internal view returns (uint256) {\n        ERC20Storage storage $ = _getERC20Storage();\n        return $.allowance[_owner][_spender];\n    }\n\n    /**\n     * @notice Returns the nonce for the specified address (EIP-2612)\n     * @param _account The address to query the nonce of\n     * @return The nonce of the specified address\n     */\n    function _nonces(address _account) internal view returns (uint256) {\n        ERC20Storage storage $ = _getERC20Storage();\n        return $.nonces[_account];\n    }\n\n    /*//////////////////////////////////////////////////////////////\n                               INITIALIZER\n    //////////////////////////////////////////////////////////////*/\n\n    /**\n     * @notice Initializes the ERC20 token with name, symbol and decimals\n     * @dev Idempotent: Only initializes if INITIAL_CHAIN_ID is not already set (default value is 0).\n     *      This preserves existing state during upgrades - new init data will not override existing values.\n     * @param _tokenName The name of the token\n     * @param _tokenSymbol The symbol of the token\n     * @param _tokenDecimals The number of decimals for the token\n     */\n    function _erc20_init(\n        string memory _tokenName,\n        string memory _tokenSymbol,\n        uint8 _tokenDecimals\n    ) internal {\n        ERC20Storage storage $ = _getERC20Storage();\n        if ($.INITIAL_CHAIN_ID == 0) {\n            $.name = _tokenName;\n            $.symbol = _tokenSymbol;\n            $.decimals = _tokenDecimals;\n\n            $.INITIAL_CHAIN_ID = block.chainid;\n            $.INITIAL_DOMAIN_SEPARATOR = _computeDomainSeparator();\n        }\n    }\n\n    /*//////////////////////////////////////////////////////////////\n                               ERC20 LOGIC\n    //////////////////////////////////////////////////////////////*/\n\n    /**\n     * @notice Internal function to approve spending allowance\n     * @param _owner The address of the token owner\n     * @param _spender The address to approve for spending\n     * @param _amount The amount to approve\n     * @return True if approval was successful\n     */\n    function _approve(address _owner, address _spender, uint256 _amount) internal returns (bool) {\n        if (_owner == address(0) || _spender == address(0)) revert ZeroAddress();\n\n        ERC20Storage storage $ = _getERC20Storage();\n        $.allowance[_owner][_spender] = _amount;\n\n        emit Approval(_owner, _spender, _amount);\n\n        return true;\n    }\n\n    /**\n     * @notice Internal function to transfer tokens between addresses\n     * @param _from The address to transfer from\n     * @param _to The address to transfer to\n     * @param _amount The amount to transfer\n     * @return True if transfer was successful\n     */\n    function _transfer(address _from, address _to, uint256 _amount) internal returns (bool) {\n        if (_from == address(0) || _to == address(0)) revert ZeroAddress();\n\n        ERC20Storage storage $ = _getERC20Storage();\n        $.balanceOf[_from] -= _amount;\n\n        // Cannot overflow because the sum of all user\n        // balances can't exceed the max uint256 value.\n        unchecked {\n            $.balanceOf[_to] += _amount;\n        }\n\n        emit Transfer(_from, _to, _amount);\n\n        return true;\n    }\n\n    /**\n     * @notice Internal function to transfer tokens from one address to another using allowance\n     * @param _from The address to transfer from\n     * @param _to The address to transfer to\n     * @param _amount The amount to transfer\n     * @return True if transfer was successful\n     */\n    function _transferFrom(\n        address _from,\n        address _to,\n        uint256 _amount\n    ) internal returns (bool) {\n        ERC20Storage storage $ = _getERC20Storage();\n        uint256 _allowed = $.allowance[_from][msg.sender]; // Saves gas for limited approvals.\n\n        if (_allowed != type(uint256).max) $.allowance[_from][msg.sender] = _allowed - _amount;\n\n        return _transfer(_from, _to, _amount);\n    }\n\n    /*//////////////////////////////////////////////////////////////\n                             EIP-2612 LOGIC\n    //////////////////////////////////////////////////////////////*/\n\n    /**\n     * @notice Internal function to handle permit signatures for gasless approvals\n     * @param _owner The address of the token owner\n     * @param _spender The address to approve for spending\n     * @param _value The amount to approve\n     * @param _deadline The deadline for the permit\n     * @param _v The recovery id of the signature\n     * @param _r The r component of the signature\n     * @param _s The s component of the signature\n     */\n    function _permit(\n        address _owner,\n        address _spender,\n        uint256 _value,\n        uint256 _deadline,\n        uint8 _v,\n        bytes32 _r,\n        bytes32 _s\n    ) internal {\n        // solhint-disable-next-line not-rely-on-time\n        if (_deadline < block.timestamp) revert PermitDeadlineExpired();\n\n        ERC20Storage storage $ = _getERC20Storage();\n\n        // Unchecked because the only math done is incrementing\n        // the owner's nonce which cannot realistically overflow.\n        unchecked {\n            uint256 _currentNonce = $.nonces[_owner];\n            $.nonces[_owner] = _currentNonce + 1;\n            \n            address _recoveredAddress = ecrecover(\n                keccak256(\n                    abi.encodePacked(\n                        \"\\x19\\x01\",\n                        _DOMAIN_SEPARATOR(),\n                        keccak256(\n                            abi.encode(\n                                keccak256(\n                                    \"Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)\"\n                                ),\n                                _owner,\n                                _spender,\n                                _value,\n                                _currentNonce,\n                                _deadline\n                            )\n                        )\n                    )\n                ),\n                _v,\n                _r,\n                _s\n            );\n\n            if (_recoveredAddress == address(0) || _recoveredAddress != _owner) revert InvalidSigner();\n\n            $.allowance[_owner][_spender] = _value;\n        }\n\n        emit Approval(_owner, _spender, _value);\n    }\n\n    /**\n     * @notice Returns the domain separator for EIP-712 signatures\n     * @return The domain separator hash\n     */\n    function _DOMAIN_SEPARATOR() internal view returns (bytes32) {\n        ERC20Storage storage $ = _getERC20Storage();\n        return\n            block.chainid == $.INITIAL_CHAIN_ID\n                ? $.INITIAL_DOMAIN_SEPARATOR\n                : _computeDomainSeparator();\n    }\n\n    /**\n     * @notice Computes the domain separator for EIP-712 signatures\n     * @return The computed domain separator hash\n     */\n    function _computeDomainSeparator() internal view returns (bytes32) {\n        ERC20Storage storage $ = _getERC20Storage();\n        return\n            keccak256(\n                abi.encode(\n                    keccak256(\n                        \"EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)\"\n                    ),\n                    keccak256(bytes($.name)),\n                    keccak256(\"1\"),\n                    block.chainid,\n                    address(this)\n                )\n            );\n    }\n\n    /*//////////////////////////////////////////////////////////////\n                        INTERNAL MINT/BURN LOGIC\n    //////////////////////////////////////////////////////////////*/\n\n    /**\n     * @notice Internal function to mint tokens to an address\n     * @param _to The address to mint tokens to\n     * @param _amount The amount of tokens to mint\n     */\n    function _mint(address _to, uint256 _amount) internal {\n        ERC20Storage storage $ = _getERC20Storage();\n        $.totalSupply += _amount;\n\n        // Cannot overflow because the sum of all user\n        // balances can't exceed the max uint256 value.\n        unchecked {\n            $.balanceOf[_to] += _amount;\n        }\n\n        emit Transfer(address(0), _to, _amount);\n    }\n\n    /**\n     * @notice Internal function to burn tokens from an address\n     * @param _from The address to burn tokens from\n     * @param _amount The amount of tokens to burn\n     */\n    function _burn(address _from, uint256 _amount) internal {\n        ERC20Storage storage $ = _getERC20Storage();\n        $.balanceOf[_from] -= _amount;\n\n        // Cannot underflow because a user's balance\n        // will never be larger than the total supply.\n        unchecked {\n            $.totalSupply -= _amount;\n        }\n\n        emit Transfer(_from, address(0), _amount);\n    }\n\n    /* ======== PRIVATE VIEW/PURE FUNCTIONS ======== */\n\n    /**\n     * @notice Retrieves the ERC20Storage struct from the storage slot\n     * @return $ The ERC20Storage struct reference\n     */\n    function _getERC20Storage()\n        private\n        pure\n        returns (ERC20Storage storage $)\n    {\n        // Use assembly to simply slot the storage location into a variable\n        // solhint-disable-next-line no-inline-assembly\n        assembly {\n            $.slot := ERC20_CORE_STORAGE_SLOT\n        }\n    }\n}\n"},"libs/ERC20/ERC20View.sol":{"content":"// SPDX-License-Identifier: AGPL-3.0-only\npragma solidity >=0.8.0;\n\nimport {ERC20Core} from \"libs/ERC20/ERC20Core.sol\";\n\n/**\n * @custom:security-contact blockchain@sygnum.com\n * @title ERC20View\n * @author SYGNUM AG - Blockchain team 3301\n * @notice View-only ERC20 implementation that exposes only view functions\n * @dev This contract provides read-only access to ERC20 token state without\n *      state-changing functions. It's designed for contracts that need to query\n *      token information but should not modify state directly.\n */\nabstract contract ERC20View is ERC20Core {\n    /*//////////////////////////////////////////////////////////////\n                        EXTERNAL/PUBLIC VIEW FUNCTIONS\n    //////////////////////////////////////////////////////////////*/\n\n    /**\n     * @notice Returns the name of the token\n     * @return The name of the token\n     */\n    function name() public view returns (string memory) {\n        return _name();\n    }\n\n    /**\n     * @notice Returns the symbol of the token\n     * @return The symbol of the token\n     */\n    function symbol() public view returns (string memory) {\n        return _symbol();\n    }\n\n    /**\n     * @notice Returns the number of decimals used to get its user representation\n     * @return The number of decimals\n     */\n    function decimals() public view returns (uint8) {\n        return _decimals();\n    }\n\n    /**\n     * @notice Returns the amount of tokens in existence\n     * @return The total supply of tokens\n     */\n    function totalSupply() public view returns (uint256) {\n        return _totalSupply();\n    }\n\n    /**\n     * @notice Returns the amount of tokens owned by account\n     * @param _account The address to query the balance of\n     * @return The balance of the specified address\n     */\n    function balanceOf(address _account) public view returns (uint256) {\n        return _balanceOf(_account);\n    }\n\n    /**\n     * @notice Returns the remaining number of tokens that spender will be allowed to spend on behalf of owner\n     * @param _owner The address of the token owner\n     * @param _spender The address of the spender\n     * @return The allowance amount\n     */\n    function allowance(address _owner, address _spender) public view returns (uint256) {\n        return _allowance(_owner, _spender);\n    }\n\n    /**\n     * @notice Returns the current nonce for owner (EIP-2612)\n     * @param _account The address to query the nonce of\n     * @return The nonce of the specified address\n     */\n    function nonces(address _account) public view returns (uint256) {\n        return _nonces(_account);\n    }\n\n    /**\n     * @notice Returns the domain separator used in the encoding of the signature for permits (EIP-2612)\n     * @return The domain separator hash\n     */\n    function DOMAIN_SEPARATOR() public view returns (bytes32) {\n        return _DOMAIN_SEPARATOR();\n    }\n}\n"},"libs/ERC20/interfaces/IERC20.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity >=0.8.0;\n\n/**\n * @custom:security-contact blockchain@sygnum.com\n * @title IERC20\n * @author SYGNUM AG - Blockchain team 3301\n * @dev Interface of the ERC-20 standard as defined in the ERC with extensions:\n *   1. EIP-2612 permit functionality for gasless approvals\n *   2. Standard metadata functions (name, symbol, decimals)\n *\n * This interface matches the implementation in ERC20.sol\n */\ninterface IERC20 {\n    /* ========== EVENTS ========== */\n\n    /**\n     * @dev Emitted when `amount` tokens are moved from one account (`from`) to\n     * another (`to`).\n     *\n     * Note that `amount` may be zero.\n     */\n    event Transfer(address indexed from, address indexed to, uint256 amount);\n\n    /**\n     * @dev Emitted when the allowance of a `spender` for an `owner` is set by\n     * a call to {approve}. `amount` is the new allowance.\n     */\n    event Approval(address indexed owner, address indexed spender, uint256 amount);\n\n    /* ========== STATE VARIABLES ========== */\n\n    /**\n     * @dev Returns the name of the token.\n     * Part of the ERC20 optional metadata extension.\n     */\n    function name() external view returns (string memory);\n\n    /**\n     * @dev Returns the symbol of the token.\n     * Part of the ERC20 optional metadata extension.\n     */\n    function symbol() external view returns (string memory);\n\n    /**\n     * @dev Returns the decimals places of the token.\n     * Part of the ERC20 optional metadata extension.\n     */\n    function decimals() external view returns (uint8);\n\n    /**\n     * @dev Returns the value of tokens in existence.\n     */\n    function totalSupply() external view returns (uint256);\n\n    /**\n     * @dev Returns the value of tokens owned by `account`.\n     */\n    function balanceOf(address _account) external view returns (uint256);\n\n    /**\n     * @dev Returns the remaining number of tokens that `spender` will be\n     * allowed to spend on behalf of `owner` through {transferFrom}. This is\n     * zero by default.\n     *\n     * This value changes when {approve} or {transferFrom} are called.\n     */\n    function allowance(address _owner, address _spender) external view returns (uint256);\n\n    /**\n     * @dev Returns the current nonce for `owner`.\n     * This value is used in EIP-2612 permit function and must be\n     * included whenever a signature is generated.\n     *\n     * Every successful call to {permit} increases the owner's nonce by one,\n     * preventing signature reuse.\n     */\n    function nonces(address _owner) external view returns (uint256);\n    \n    /* ========== FUNCTIONS ========== */\n\n    /**\n     * @dev Moves a `value` amount of tokens from the caller's account to `to`.\n     *\n     * Returns a boolean value indicating whether the operation succeeded.\n     *\n     * Emits a {Transfer} event.\n     */\n    function transfer(address _to, uint256 _value) external returns (bool);\n\n    /**\n     * @dev Sets a `value` amount of tokens as the allowance of `spender` over the\n     * caller's tokens.\n     *\n     * Returns a boolean value indicating whether the operation succeeded.\n     *\n     * IMPORTANT: Beware that changing an allowance with this method brings the risk\n     * that someone may use both the old and the new allowance by unfortunate\n     * transaction ordering. One possible solution to mitigate this race\n     * condition is to first reduce the spender's allowance to 0 and set the\n     * desired value afterwards:\n     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\n     *\n     * Emits an {Approval} event.\n     */\n    function approve(address _spender, uint256 _value) external returns (bool);\n\n    /**\n     * @dev Moves a `value` amount of tokens from `from` to `to` using the\n     * allowance mechanism. `value` is then deducted from the caller's\n     * allowance.\n     *\n     * Returns a boolean value indicating whether the operation succeeded.\n     *\n     * Emits a {Transfer} event.\n     */\n    function transferFrom(address _from, address _to, uint256 _value) external returns (bool);\n\n    /**\n     * @dev EIP-2612 permit function to approve token spending with a signature\n     * instead of msg.sender calling approve directly.\n     *\n     * Sets `value` as the allowance of `spender` over `owner`'s tokens,\n     * given `owner`'s signed approval.\n     *\n     * Requirements:\n     * - `deadline` must not have expired\n     * - `v`, `r` and `s` must form a valid secp256k1 signature from `owner`\n     * - The signature must use the current nonce of `owner` (see {nonces})\n     *\n     * Emits an {Approval} event.\n     */\n    function permit(\n        address _owner,\n        address _spender,\n        uint256 _value,\n        uint256 _deadline,\n        uint8 _v,\n        bytes32 _r,\n        bytes32 _s\n    ) external;\n}"},"libs/FundRecovery/FundRecoveryCore.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.30;\n\nimport {IERC20} from \"libs/ERC20/interfaces/IERC20.sol\";\n\n/**\n * @custom:security-contact blockchain@sygnum.com\n * @title FundRecoveryCore\n * @author SYGNUM AG - Blockchain team 3301\n * @notice Core fund recovery implementation for recovering native tokens and ERC20 tokens\n * @dev This library provides the core logic for recovering funds from contracts.\n *      It handles both native tokens (ETH) and ERC20 tokens, including fee-on-transfer tokens.\n *      Contracts inheriting from this can call the internal _recoverFunds function.\n */\nabstract contract FundRecoveryCore {\n    /* ======== ERRORS ======== */\n\n    error TransferFailed();\n\n    /* ======== EVENTS ======== */\n\n    event FundsRecovered(address indexed token, address indexed to, uint256 requestedAmount, uint256 actualAmountReceived);\n\n    /* ======== INTERNAL STATE-CHANGING FUNCTIONS ======== */\n\n    /**\n     * @notice Recovers funds from the contract\n     * @dev If _token is address(0), recovers native token (ETH), else recovers ERC20 tokens\n     * For ERC-20 tokens, the emitted amounts include both the requested amount and the actual amount received,\n     * which may differ for fee-on-transfer tokens.\n     * @param _token The token address (zero for native)\n     * @param _to The recipient address\n     * @param _amount The amount to recover (in wei for native ETH, in token's smallest unit for ERC-20)\n     */\n    function _recoverFunds(address _token, address payable _to, uint256 _amount) internal {\n        bool _success;\n        uint256 _actualAmountReceived;\n\n        if (_token == address(0)) {\n            // Recover native token (ETH)\n            (_success,) = _to.call{value: _amount}(\"\");\n            if (!_success) {\n                revert TransferFailed();\n            }\n            _actualAmountReceived = _amount;\n        } else {\n            // Recover ERC20 token\n            // Measure actual amount received for fee-on-transfer tokens\n            IERC20 _tokenContract = IERC20(_token);\n            uint256 _balanceBefore = _tokenContract.balanceOf(_to);\n\n            // Use low-level call to handle all token types:\n            // - Tokens that revert\n            // - Tokens that return false\n            // - Non-standard tokens that don't return a value (like USDT)\n            bytes memory _returndata;\n            // solhint-disable-next-line avoid-low-level-calls\n            (_success, _returndata) = _token.call(\n                abi.encodeWithSelector(IERC20.transfer.selector, _to, _amount)\n            );\n            // Check if call succeeded and validate return data\n            // Success means: call succeeded AND (no return data OR return data decodes to true)\n            if (!_success || (_returndata.length > 0 && !abi.decode(_returndata, (bool)))) {\n                revert TransferFailed();\n            }\n\n            uint256 _balanceAfter = _tokenContract.balanceOf(_to);\n\n            _actualAmountReceived = _balanceAfter - _balanceBefore;\n        }\n\n        emit FundsRecovered(_token, _to, _amount, _actualAmountReceived);\n    }\n}\n"},"libs/Initializable/Initializable.sol":{"content":"// SPDX-License-Identifier: UNLICENSED\npragma solidity ^0.8.30;\n\nimport {InitializableView} from \"libs/Initializable/InitializableView.sol\";\n\n/**\n * @custom:security-contact blockchain@sygnum.com\n * @title Initializable\n * @notice Standard Initializable implementation that extends InitializableView\n * and exposes the public interface functions.\n * @dev This contract introduces an `initializer` modifier to prevent re-initialization of contracts,\n * ensuring that critical setup logic is executed only once, which is especially important in upgradeable contracts.\n */\nabstract contract Initializable is InitializableView {\n}\n"},"libs/Initializable/InitializableCore.sol":{"content":"// SPDX-License-Identifier: UNLICENSED\npragma solidity ^0.8.30;\n\n/**\n * @custom:security-contact blockchain@sygnum.com\n * @title InitializableCore\n * @notice Core implementation of initialization functionality with slot storage pattern\n * @dev This contract provides the core initialization logic without exposing public functions.\n * It uses a storage slot to track initialization status, minimizing gas costs and avoiding storage collisions.\n * This is the core implementation that should be inherited by contracts that need custom initialization logic.\n */\nabstract contract InitializableCore {\n    /* ======== Custom Errors ======== */\n    error InvalidInitialization();\n\n    /* ======== Events ======== */\n    event Initialized();\n\n    /* ======== State variables ======== */\n    /**\n     * @dev INITIALIZED_CORE_STORAGE_SLOT is a constant used to locate the initialization status in storage for InitializableCore.\n     * This ensures a unique storage slot for the initialized flag, minimizing collision risks with other storage variables in the contract.\n     * The value is calculated as keccak256(abi.encode(uint256(keccak256(\"InitializableCore.InitializedStorage\")) - 1)) & ~bytes32(uint256(0xff)).\n     * @custom:storage-location erc7201:InitializableCore.InitializedStorage\n     */\n    bytes32 private constant INITIALIZED_CORE_STORAGE_SLOT =\n        0x112dd7b7d700a9bfd03edf4d4ce6f92b1f5f1a2fd81fde871f4db11384aa0b00;\n\n    /* ======== Modifiers ======== */\n    /// @notice Ensures the initializer function can only be called once.\n    modifier initializer() {\n        if (_isInitialized()) {\n            revert InvalidInitialization();\n        }\n        _setInitialized();\n        _;\n    }\n\n    /* ======== Internal Pure/View Functions ======== */\n    /// @notice Checks if the contract has been initialized.\n    /// @return value True if the contract has been initialized, false otherwise.\n    function _isInitialized() internal view returns (bool value) {\n        // solhint-disable-next-line no-inline-assembly\n        assembly ('memory-safe') {\n            value := sload(INITIALIZED_CORE_STORAGE_SLOT)\n        }\n    }\n\n    /* ======== Internal/Private Storage Manipulation Functions ======== */\n    /// @notice Sets the initialized state of the contract.\n    /// @dev Uses assembly for gas efficiency when writing to the storage slot.\n    function _setInitialized() internal {\n        // solhint-disable-next-line no-inline-assembly\n        assembly ('memory-safe') {\n            sstore(INITIALIZED_CORE_STORAGE_SLOT, 1)\n        }\n        emit Initialized();\n    }\n\n    /// @notice Resets the initialized state of the contract.\n    function _resetInitialized() internal {\n        // solhint-disable-next-line no-inline-assembly\n        assembly ('memory-safe') {\n            sstore(INITIALIZED_CORE_STORAGE_SLOT, 0)\n        }\n    }\n}\n"},"libs/UUPS/interface/IERC1822.sol":{"content":"// SPDX-License-Identifier: UNLICENSED\npragma solidity ^0.8.30;\n\n/**\n * @custom:security-contact blockchain@sygnum.com\n * @dev ERC-1822: Universal Upgradeable Proxy Standard (UUPS) documents a method for upgradeability through a simplified\n * proxy whose upgrades are fully controlled by the current implementation.\n */\ninterface IERC1822Proxiable {\n    /**\n     * @dev Returns the storage slot that the proxiable contract assumes is being used to store the implementation\n     * address.\n     *\n     * IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks\n     * bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this\n     * function revert if invoked through a proxy.\n     */\n    function proxiableUUID() external view returns (bytes32);\n}\n"},"libs/UUPS/interface/IERC1967.sol":{"content":"// SPDX-License-Identifier: UNLICENSED\npragma solidity ^0.8.30;\n\n/**\n * @custom:security-contact blockchain@sygnum.com\n * @title IERC1967\n * @dev Interface of ERC1967 events emitted by proxies.\n *\n * These events are emitted when the proxy's implementation, admin, or beacon are changed.\n */\ninterface IERC1967 {\n    /**\n     * @dev Emitted when the implementation is upgraded.\n     * @param implementation The address of the new implementation.\n     */\n    event Upgraded(address indexed implementation);\n}\n"},"libs/UUPS/interface/IUUPSAsynchronousUpgradeable.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.30;\n\nimport \"./IUUPSSynchronousUpgradeable.sol\";\n\n/**\n * @custom:security-contact blockchain@sygnum.com\n * @title IUUPSAsynchronousUpgradeable\n * @author SYGNUM AG - Blockchain team 3301\n * @notice Interface for asynchronous UUPS upgrades with timelock delay\n * @dev Contracts implementing this interface perform upgrades asynchronously,\n *      meaning the upgrade is scheduled when upgradeToAndCall is called and must be\n *      executed later via executeUpgrade after the timelock delay has elapsed.\n *      This provides a safety window for stakeholders to review pending upgrades.\n */\ninterface IUUPSAsynchronousUpgradeable is IUUPSSynchronousUpgradeable {\n    /**\n     * @notice Executes a previously scheduled upgrade after the timelock delay\n     * @dev Can only be called after the timelock delay has elapsed since scheduling\n     */\n    function executeUpgrade() external;\n\n    /**\n     * @notice Cancels a scheduled upgrade operation\n     * @dev Removes the scheduled upgrade before it is executed\n     */\n    function cancelUpgrade() external;\n}\n"},"libs/UUPS/interface/IUUPSSynchronousUpgradeable.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.30;\n\n/**\n * @custom:security-contact blockchain@sygnum.com\n * @title IUUPSSynchronousUpgradeable\n * @author SYGNUM AG - Blockchain team 3301\n * @notice Interface for synchronous UUPS upgrades that complete immediately\n * @dev Contracts implementing this interface perform upgrades synchronously,\n *      meaning the implementation is changed immediately when upgradeToAndCall is called.\n *      This is the classic UUPS upgrade pattern without any delay mechanism.\n */\ninterface IUUPSSynchronousUpgradeable {\n    /**\n     * @notice Upgrades the implementation and optionally executes a function call\n     * @dev The upgrade happens immediately when this function is called\n     * @param _newImplementation The address of the new implementation contract\n     * @param _data Optional calldata to execute after the upgrade\n     */\n    function upgradeToAndCall(address _newImplementation, bytes memory _data) external;\n\n    /**\n     * @notice Returns the current implementation address\n     * @dev Returns the address stored in the ERC-1967 implementation slot\n     * @return The address of the current implementation contract\n     */\n    function getImplementation() external view returns (address);\n}\n"},"libs/external/chainlink-evm/contracts/src/v0.8/data-feeds/interfaces/IBundleAggregatorProxy.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.4;\n\nimport {IBundleBaseAggregator} from \"./IBundleBaseAggregator.sol\";\nimport {ICommonAggregator} from \"./ICommonAggregator.sol\";\n\ninterface IBundleAggregatorProxy is IBundleBaseAggregator, ICommonAggregator {\n  function proposedAggregator() external view returns (address);\n\n  function confirmAggregator(\n    address aggregatorAddress\n  ) external;\n\n  function aggregator() external view returns (address);\n}"},"libs/external/chainlink-evm/contracts/src/v0.8/data-feeds/interfaces/IBundleBaseAggregator.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.4;\n\ninterface IBundleBaseAggregator {\n  function latestBundle() external view returns (bytes memory bundle);\n\n  function bundleDecimals() external view returns (uint8[] memory);\n\n  function latestBundleTimestamp() external view returns (uint256);\n}"},"libs/external/chainlink-evm/contracts/src/v0.8/data-feeds/interfaces/ICommonAggregator.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.4;\n\ninterface ICommonAggregator {\n  function description() external view returns (string memory);\n\n  function version() external view returns (uint256);\n}"},"libs/external/chainlink-local/src/data-feeds/interfaces/AggregatorV3Interface.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\n/// @title AggregatorV3Interface\n/// @notice Interface for accessing detailed data from an aggregator contract, including round data and metadata.\n/// @dev Provides methods to get the latest data, historical data for specific rounds, and metadata such as decimals and description.\ninterface AggregatorV3Interface {\n    /**\n     * @notice Gets the number of decimals used by the aggregator.\n     * @return uint8 - The number of decimals.\n     */\n    function decimals() external view returns (uint8);\n\n    /**\n     * @notice Gets the description of the aggregator.\n     * @return string memory - The description of the aggregator.\n     */\n    function description() external view returns (string memory);\n\n    /**\n     * @notice Gets the version of the aggregator.\n     * @return uint256 - The version of the aggregator.\n     */\n    function version() external view returns (uint256);\n\n    /**\n     * @notice Gets the round data for a specific round ID.\n     * @param _roundId - The round ID to get the data for.\n     * @return roundId - The round ID.\n     * @return answer - The answer for the round.\n     * @return startedAt - The timestamp when the round started.\n     * @return updatedAt - The timestamp when the round was updated.\n     * @return answeredInRound - The round ID in which the answer was computed.\n     * @dev This function should raise \"No data present\" if no data is available for the given round ID.\n     */\n    function getRoundData(uint80 _roundId)\n        external\n        view\n        returns (uint80 roundId, int256 answer, uint256 startedAt, uint256 updatedAt, uint80 answeredInRound);\n\n    /**\n     * @notice Gets the latest round data.\n     * @return roundId - The latest round ID.\n     * @return answer - The latest answer.\n     * @return startedAt - The timestamp when the latest round started.\n     * @return updatedAt - The timestamp when the latest round was updated.\n     * @return answeredInRound - The round ID in which the latest answer was computed.\n     * @dev This function should raise \"No data present\" if no data is available.\n     */\n    function latestRoundData()\n        external\n        view\n        returns (uint80 roundId, int256 answer, uint256 startedAt, uint256 updatedAt, uint80 answeredInRound);\n}"},"libs/utils/bytes/BytesLib.sol":{"content":"// SPDX-License-Identifier: UNLICENSED\npragma solidity ^0.8.30;\n\n/**\n * @custom:security-contact blockchain@sygnum.com\n * @title BytesLib\n * @author Sygnum\n * @notice Library for efficient bytes manipulation operations.\n * @dev Provides utility functions for working with bytes arrays.\n */\nlibrary BytesLib {\n    /**\n     * @notice Slices a bytes array from start to end position.\n     * @dev Sanitizes input by clamping end to buffer length and start to end.\n     *      Uses mcopy for efficient memory copying.\n     * @param _data The bytes array to slice.\n     * @param _start The starting position (inclusive).\n     * @param _end The ending position (exclusive).\n     * @return _result The sliced bytes array.\n     */\n    function slice(\n        bytes memory _data,\n        uint256 _start,\n        uint256 _end\n    ) internal pure returns (bytes memory _result) {\n        // Sanitize inputs\n        _end = _min(_end, _data.length);\n        _start = _min(_start, _end);\n\n        // Allocate and copy\n        _result = new bytes(_end - _start);\n        // solhint-disable-next-line no-inline-assembly\n        assembly (\"memory-safe\") {\n            mcopy(add(_result, 0x20), add(add(_data, 0x20), _start), sub(_end, _start))\n        }\n    }\n\n    /**\n     * @notice Returns the minimum of two numbers.\n     * @dev Internal helper function for sanitizing slice bounds.\n     * @param _a First number.\n     * @param _b Second number.\n     * @return The smaller of the two numbers.\n     */\n    function _min(uint256 _a, uint256 _b) private pure returns (uint256) {\n        return _a < _b ? _a : _b;\n    }\n}\n"},"libs/Initializable/InitializableView.sol":{"content":"// SPDX-License-Identifier: UNLICENSED\npragma solidity ^0.8.30;\n\nimport {InitializableCore} from \"libs/Initializable/InitializableCore.sol\";\n\n/**\n * @custom:security-contact blockchain@sygnum.com\n * @title InitializableView\n * @author SYGNUM AG - Blockchain team 3301\n * @notice View-only Initializable implementation that exposes initialization status\n * @dev This contract provides read-only access to initialization state without\n *      allowing initialization modifications. It's designed for contracts that need\n *      to query initialization status but should not modify state directly.\n */\nabstract contract InitializableView is InitializableCore {\n    /*//////////////////////////////////////////////////////////////\n                        EXTERNAL/PUBLIC VIEW FUNCTIONS\n    //////////////////////////////////////////////////////////////*/\n\n    /**\n     * @notice Returns the initialization status of the contract\n     * @return Whether the contract has been initialized\n     */\n    function isInitialized() public view returns (bool) {\n        return _isInitialized();\n    }\n}\n"},"libs/Pausable/PausableCore.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.28;\n\n/**\n * @custom:security-contact blockchain@sygnum.com\n * @title PausableCore\n * @notice Core pausing implementation with slot storage pattern\n * @dev This contract provides the core pausing logic without any authorization assumptions.\n * Contracts inheriting from this will be able to pause and unpause functionality\n * using the whenNotPaused and whenPaused modifiers. This is the core implementation\n * that should be inherited by contracts that need pausing functionality.\n */\nabstract contract PausableCore {\n    /* ======== STATE VARIABLES ======== */\n\n    /**\n     * @dev PAUSABLE_CORE_STORAGE_SLOT is a constant used to locate the PausableStorage struct in storage for PausableCore.\n     * This ensures a unique storage slot for the paused state, minimizing collision risks with other storage variables in the contract.\n     * The value is calculated as keccak256(abi.encode(uint256(keccak256(\"PausableCore.PausableStorage\")) - 1)) & ~bytes32(uint256(0xff)).\n     */\n    bytes32 private constant PAUSABLE_CORE_STORAGE_SLOT =\n        0xfedd7b171e5aaf71411eb61c81513b977191128c387240284b4edb396fcbdb00;\n\n    /// @custom:storage-location erc7201:PausableCore.PausableStorage\n    struct PausableStorage {\n        bool paused;\n    }\n\n    /* ========== ERRORS ========== */\n\n    error ContractPaused();\n    error ContractNotPaused();\n\n    /* ========== EVENTS ========== */\n\n    event Paused();\n    event Unpaused();\n\n    /* ========== INTERNAL VIEW FUNCTIONS ========== */\n\n    /**\n     * @notice Returns the current pause state\n     * @return True if the contract is paused, false otherwise\n     */\n    function _isPaused() internal view returns (bool) {\n        PausableStorage storage $ = _getPausableStorage();\n        return $.paused;\n    }\n\n    /* ========== MODIFIERS ========== */\n\n    /**\n     * @notice Modifier to make a function callable only when the contract is not paused\n     * @dev Reverts with ContractPaused if the contract is paused\n     */\n    modifier whenNotPaused() {\n        if (_isPaused()) {\n            revert ContractPaused();\n        }\n        _;\n    }\n\n    /**\n     * @notice Modifier to make a function callable only when the contract is paused\n     * @dev Reverts with ContractNotPaused if the contract is not paused\n     */\n    modifier whenPaused() {\n        if (!_isPaused()) {\n            revert ContractNotPaused();\n        }\n        _;\n    }\n\n    /* ========== INTERNAL STATE-CHANGING FUNCTIONS ========== */\n\n    /**\n     * @notice Pauses the contract\n     * @dev Sets the paused state to true and emits a Paused event\n     */\n    function _pause() internal whenNotPaused {\n        PausableStorage storage $ = _getPausableStorage();\n        $.paused = true;\n        emit Paused();\n    }\n\n    /**\n     * @notice Unpauses the contract\n     * @dev Sets the paused state to false and emits an Unpaused event\n     */\n    function _unpause() internal whenPaused {\n        PausableStorage storage $ = _getPausableStorage();\n        $.paused = false;\n        emit Unpaused();\n    }\n\n    /* ======== PRIVATE VIEW/PURE FUNCTIONS ======== */\n\n    /**\n     * @notice Retrieves the PausableStorage struct from the storage slot\n     * @dev Returns the PausableStorage struct\n     */\n    function _getPausableStorage()\n        private\n        pure\n        returns (PausableStorage storage $)\n    {\n        // Use assembly to simply slot the storage location into a variable\n        // solhint-disable-next-line no-inline-assembly\n        assembly {\n            $.slot := PAUSABLE_CORE_STORAGE_SLOT\n        }\n    }\n}\n"},"libs/Pausable/interfaces/IPausable.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.28;\n\n/**\n * @custom:security-contact blockchain@sygnum.com\n * @title IPausable\n * @notice Interface for pausable functionality\n * @dev Defines the external interface for contracts that can be paused and unpaused\n */\ninterface IPausable {\n    /* ======== VIEW FUNCTIONS ======== */\n\n    /**\n     * @notice Returns whether the contract is paused\n     * @return True if the contract is paused, false otherwise\n     */\n    function isPaused() external view returns (bool);\n\n    /* ======== STATE-CHANGING FUNCTIONS ======== */\n\n    /**\n     * @notice Pauses the contract\n     * @dev Only callable by authorized accounts (e.g., pausers)\n     */\n    function pause() external;\n\n    /**\n     * @notice Unpauses the contract\n     * @dev Only callable by authorized accounts (e.g., pausers)\n     */\n    function unpause() external;\n}"},"libs/Permissioned/Permissioned.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.28;\n\nimport {PermissionedView} from \"libs/Permissioned/PermissionedView.sol\";\n\n/**\n * @custom:security-contact blockchain@sygnum.com\n * @title Permissioned\n * @notice Standard Permissioned implementation that extends PermissionedView\n * and exposes the public interface functions.\n * @dev Contracts inheriting from this will be able to perform role-based access control checks\n * using the requiresAuth modifier\n */\nabstract contract Permissioned is PermissionedView {\n    /* ========== EXTERNAL/PUBLIC STATE-CHANGING FUNCTIONS ========== */\n\n    /**\n     * @notice Sets the permission manager address\n     * @param _permissionManagerAddress The new permission manager address\n     */\n    function setPermissionManagerAddress(address _permissionManagerAddress) public requiresAuth {\n        _setPermissionManagerAddress(_permissionManagerAddress);\n    }\n}\n"},"libs/Permissioned/PermissionedCore.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.28;\n\n/**\n * @custom:security-contact blockchain@sygnum.com\n * @title PermissionedCore\n * @notice Core permission implementation with slot storage pattern\n * @dev This contract provides the core role-based access control logic without exposing public functions.\n * Contracts inheriting from this will be able to perform role-based access control checks\n * using the requiresAuth modifier. This is the core implementation that should be inherited by contracts\n * that need custom permission logic.\n */\nabstract contract PermissionedCore {\n    /* ======== STATE VARIABLES ======== */\n    \n    /**\n     * @dev PERMISSIONED_CORE_STORAGE_SLOT is a constant used to locate the PermissionedStorage struct in storage for PermissionedCore.\n     * This ensures a unique storage slot for the permission manager address, minimizing collision risks with other storage variables in the contract.\n     * The value is calculated as keccak256(abi.encode(uint256(keccak256(\"PermissionedCore.PermissionedStorage\")) - 1)) & ~bytes32(uint256(0xff)).\n     */\n    bytes32 private constant PERMISSIONED_CORE_STORAGE_SLOT =\n        0x1fa5656f3245be71aa51744436d19e5d46b909e499930c5c32c93901cab52900;\n\n    /// @custom:storage-location erc7201:PermissionedCore.PermissionedStorage\n    struct PermissionedStorage {\n        address permissionManagerAddress;\n    }\n\n    /* ========== ERRORS ========== */\n\n    error Unauthorized();\n\n    /* ========== MODIFIERS ========== */\n\n    /**\n     * @notice Authorization modifier that delegates to the PermissionManager\n     * @dev Calls _isAuthorized which makes a staticcall to the PermissionManager's canCall function\n     */\n    modifier requiresAuth() {\n        _isAuthorized(msg.sender, msg.sig);\n        _;\n    }\n\n    /* ========== INTERNAL VIEW FUNCTIONS ========== */\n\n    /**\n     * @notice Returns the address of the permission manager\n     * @return The address of the permission manager\n     */\n    function _getPermissionManagerAddress() internal view returns (address) {\n        PermissionedStorage storage $ = _getPermissionedStorage();\n        return $.permissionManagerAddress;\n    }\n\n    /* ========== INTERNAL INITIALIZER ========== */\n\n    /**\n     * @notice Initializes the permission system with a permission manager\n     * @dev Idempotent: Only initializes if permissionManagerAddress is not already set (default value is address(0)).\n     *      This preserves existing permission manager during upgrades - new init data will not override existing value.\n     * @param _permissionManagerAddress The address of the permission manager contract\n     */\n    function _permissioned_init(address _permissionManagerAddress) internal {\n        PermissionedStorage storage $ = _getPermissionedStorage();\n        if ($.permissionManagerAddress == address(0)) {\n            _setPermissionManagerAddress(_permissionManagerAddress);\n        }\n    }\n\n    /* ========== INTERNAL FUNCTIONS ========== */\n    \n    /**\n     * @notice Sets the permission manager address\n     * @param _permissionManagerAddress The new permission manager address\n     */\n    function _setPermissionManagerAddress(address _permissionManagerAddress) internal {\n        PermissionedStorage storage $ = _getPermissionedStorage();\n        $.permissionManagerAddress = _permissionManagerAddress;\n    }\n    \n    /**\n     * @dev Internal function to check if the caller is authorized to call a function.\n     * Reverts with Unauthorized if the caller is not authorized.\n     * @param _caller The address of the caller\n     * @param _functionSig The function signature being called\n     */\n    function _isAuthorized(address _caller, bytes4 _functionSig) internal view {\n        // Call the canCall function on the permissionManagerAddress contract\n        (bool _success, bytes memory _result) = _getPermissionManagerAddress().staticcall(\n            abi.encodeWithSignature(\"canCall(address,bytes4)\", _caller, _functionSig)\n        );\n\n        if (!_success || !abi.decode(_result, (bool))) {\n            revert Unauthorized();\n        }\n    }\n\n    /* ======== PRIVATE VIEW/PURE FUNCTIONS ======== */\n\n    /**\n     * @notice Retrieves the PermissionedStorage struct from the storage slot\n     * @dev Returns the PermissionedStorage struct\n     */\n    function _getPermissionedStorage()\n        private\n        pure\n        returns (PermissionedStorage storage $)\n    {\n        // Use assembly to simply slot the storage location into a variable\n        // solhint-disable-next-line no-inline-assembly\n        assembly {\n            $.slot := PERMISSIONED_CORE_STORAGE_SLOT\n        }\n    }\n}\n"},"libs/Permissioned/PermissionedView.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.28;\n\nimport {PermissionedCore} from \"libs/Permissioned/PermissionedCore.sol\";\n\n/**\n * @custom:security-contact blockchain@sygnum.com\n * @title PermissionedView\n * @author SYGNUM AG - Blockchain team 3301\n * @notice View-only Permissioned implementation that exposes permission manager address\n * @dev This contract provides read-only access to permission manager state without\n *      allowing modification. It's designed for contracts that need to query the\n *      permission manager but should not modify it directly.\n */\nabstract contract PermissionedView is PermissionedCore {\n    /*//////////////////////////////////////////////////////////////\n                        EXTERNAL/PUBLIC VIEW FUNCTIONS\n    //////////////////////////////////////////////////////////////*/\n\n    /**\n     * @notice Returns the address of the permission manager contract\n     * @return The address of the permission manager, or zero address if not set\n     */\n    function getPermissionManagerAddress() public view returns (address) {\n        return _getPermissionManagerAddress();\n    }\n}\n"},"libs/Timelock/Timelock.sol":{"content":"// SPDX-License-Identifier: UNLICENSED\npragma solidity ^0.8.30;\n\nimport {TimelockView} from \"./TimelockView.sol\";\n\n/**\n * @custom:security-contact blockchain@sygnum.com\n * @title Timelock\n * @author SYGNUM AG - Blockchain team 3301\n * @notice Standard Timelock implementation that extends TimelockView\n * and exposes the basic timelock interface functions.\n * @dev Abstract contract that provides a mechanism to delay the execution of transactions.\n */\nabstract contract Timelock is TimelockView {\n}\n"},"libs/Timelock/TimelockCore.sol":{"content":"// SPDX-License-Identifier: UNLICENSED\npragma solidity ^0.8.30;\n\n/**\n * @custom:security-contact blockchain@sygnum.com\n * @title TimelockCore\n * @author SYGNUM AG - Blockchain team 3301\n * @notice Core timelock implementation with slot storage pattern\n * @dev This abstract contract provides the core timelock functionality with only internal functions.\n * It uses the slot storage pattern for better encapsulation and storage conflict avoidance.\n */\nabstract contract TimelockCore {\n    /* ======== State variables ======== */\n    /** @notice TIMELOCK_CORE_STORAGE_SLOT is a constant used to locate the TimelockStorage struct in storage.\n     * This ensures a unique storage slot, minimizing collision risks with other storage variables in the contract.\n     * It's calculated as keccak256(abi.encode(uint256(keccak256(\"TimelockCore.TimelockStorage\")) - 1)) & ~bytes32(uint256(0xff)).\n     */\n    bytes32 private constant TIMELOCK_CORE_STORAGE_SLOT =\n        0x1626844f871e5080d673ecb96ea8a32c7bdf671ea137282b2886cd9d0fd9a700;\n\n    struct Operation {\n        address target;\n        uint256 value;\n        bytes data;\n        uint256 eta;\n    }\n\n    /// @custom:storage-location erc7201:TimelockCore.TimelockStorage\n    struct TimelockStorage {\n        // @notice operationCounter is incremented for each new operation to ensure unique IDs\n        uint256 operationCounter;\n        // @notice timelock maps the operation ID to the timestamp when it can be executed.\n        mapping(bytes32 operationId => uint256 eta) timelock;\n        mapping(bytes32 operationId => Operation operation) scheduledOperations;\n    }\n\n    /* ======== Custom Errors ======== */\n    error InvalidTimestamp();\n    error TimelockNotReached();\n    error TimelockDoesNotExist();\n    error TimeLockAlreadyExist();\n    error InsufficientFunds(uint256 given, uint256 expected);\n    error OperationExecutionFailed(bytes32 operationId);\n\n    /* ======== Events ======== */\n    /**\n     * @notice Emitted when an operation is scheduled.\n     * @param operationId The unique ID of the operation.\n     * @param target The address of the contract to call.\n     * @param value The amount of Ether (in wei) to send with the call.\n     * @param data The data to send with the call (ABI-encoded function arguments).\n     * @param eta The timestamp (in seconds since Unix epoch) after which the operation can be executed.\n     */\n    event Queued(\n        bytes32 indexed operationId,\n        address target,\n        uint256 value,\n        bytes data,\n        uint256 eta\n    );\n\n    /**\n     * @notice Emitted when an operation is executed.\n     * @param operationId The unique ID of the operation.\n     * @param target The address of the contract that was called.\n     * @param value The amount of Ether (in wei) that was sent with the call.\n     * @param data The data that was sent with the call.\n     * @param timestamp The timestamp (in seconds since Unix epoch) when the operation is executed.\n     */\n    event Executed(\n        bytes32 indexed operationId,\n        address target,\n        uint256 value,\n        bytes data,\n        uint256 timestamp\n    );\n\n    /**\n     * @notice Emitted when an operation is cancelled.\n     * @param operationId The unique ID of the operation.\n     */\n    event Canceled(bytes32 indexed operationId);\n\n    /* ======== Internal View/Pure Functions ======== */\n\n    /**\n     * @notice Returns the details of a scheduled timelock operation.\n     * @dev Retrieves the target address, calldata, value, and ETA for a given operation ID.\n     *      This function allows internal callers to inspect the parameters of a scheduled operation\n     *      before it is executed or cancelled.\n     * @param _operationId The unique ID of the scheduled operation.\n     * @return target The address of the contract to be called.\n     * @return data The calldata to be sent with the call.\n     * @return value The amount of Ether (in wei) to be sent with the call.\n     * @return eta The earliest timestamp at which the operation can be executed.\n     */\n    function _getScheduledOperationDetails(\n        bytes32 _operationId\n    )\n        internal\n        view\n        returns (address target, bytes memory data, uint256 value, uint256 eta)\n    {\n        TimelockStorage storage $ = _getTimelockStorage();\n        Operation memory _op = $.scheduledOperations[_operationId];\n        return (_op.target, _op.data, _op.value, _op.eta);\n    }\n\n    /**\n     * @notice Checks if a timelock operation is valid and ready for execution.\n     * @dev Reverts if the operation does not exist or if the required timelock delay has not yet passed.\n     * @param _operationId The unique ID of the operation to validate.\n     * @custom:reverts TimelockDoesNotExist if the operation is not scheduled.\n     * @custom:reverts TimelockNotReached if the timelock delay has not yet elapsed.\n     */\n    function _isExecutableOperation(bytes32 _operationId) internal view {\n        TimelockStorage storage $ = _getTimelockStorage();\n        uint256 _eta = $.timelock[_operationId];\n        if (_eta == 0) revert TimelockDoesNotExist();\n        if (_getBlockTimestamp() < _eta) revert TimelockNotReached();\n    }\n\n    /* ======== Internal State-Changing Functions ======== */\n    /**\n     * @notice Executes a timelock operation.\n     * @param _operationId The unique ID of the operation to execute.\n     */\n    function _executeScheduledOperation(bytes32 _operationId) internal {\n        _isExecutableOperation(_operationId);\n        TimelockStorage storage $ = _getTimelockStorage();\n\n        Operation memory _op = $.scheduledOperations[_operationId];\n        address _target = _op.target;\n        uint256 _value = _op.value;\n        bytes memory _data = _op.data;\n\n        if (address(this).balance < _value) {\n            revert InsufficientFunds(_value, address(this).balance);\n        }\n\n        // Remove the operation details and timelock details from storage BEFORE the external call\n        // to prevent reentrancy attacks (Checks-Effects-Interactions pattern)\n        delete $.timelock[_operationId];\n        delete $.scheduledOperations[_operationId];\n\n        // Call the target contract and handle the return value\n        // Note: You cannot call internal functions of other contracts using .call, delegatecall, or similar low-level calls.\n        // Internal functions are not part of the contract's ABI and are only accessible within the contract itself or its derived contracts.\n        // The following line can only call public or external functions:\n        (bool _success, ) = _target.call{value: _value}(_data);\n\n        if (!_success) {\n            revert OperationExecutionFailed(_operationId);\n        }\n\n        emit Executed(\n            _operationId,\n            _target,\n            _value,\n            _data,\n            _getBlockTimestamp()\n        );\n    }\n\n    /**\n     * @notice Schedules an operation to be executed after a delay.\n     * @param _target The address of the contract to call.\n     * @param _data The _data to send with the call (ABI-encoded function arguments).\n     * @param _eta The timestamp (in seconds since Unix epoch) after which the operation can be executed.\n     * @return operationId The unique ID of the timelock operation.\n     */\n    function _scheduleOperation(\n        address _target,\n        bytes memory _data,\n        uint256 _eta\n    ) internal returns (bytes32 operationId) {\n        if (_getBlockTimestamp() >= _eta) {\n            revert InvalidTimestamp();\n        }\n        TimelockStorage storage $ = _getTimelockStorage();\n        uint256 _value = msg.value;\n\n        // Generate unique operation ID from counter (starts at 1 to avoid bytes32(0))\n        $.operationCounter++;\n        operationId = bytes32($.operationCounter);\n\n        $.timelock[operationId] = _eta;\n        $.scheduledOperations[operationId] = Operation({\n            target: _target,\n            value: _value,\n            data: _data,\n            eta: _eta\n        });\n\n        // Emit the Queued event with the operation details\n        emit Queued(\n            operationId,\n            _target,\n            _value,\n            _data,\n            _eta\n        );\n    }\n\n    /**\n     * @notice Cancels a timelock operation.\n     * @param _operationId The unique ID of the operation to cancel.\n     */\n    function _cancelScheduledOperation(bytes32 _operationId) internal {\n        TimelockStorage storage $ = _getTimelockStorage();\n        if ($.timelock[_operationId] != 0) {\n            // Remove the scheduled time\n            delete $.timelock[_operationId];\n            // Remove the operation details\n            delete $.scheduledOperations[_operationId];\n\n            emit Canceled(_operationId);\n        }\n    }\n\n    /* ======== Private View/Pure Functions ======== */\n    /**\n     * @notice Retrieves the TimelockStorage struct from the storage slot.\n     * @dev Returns the TimelockStorage struct.\n     */\n    function _getTimelockStorage()\n        private\n        pure\n        returns (TimelockStorage storage $)\n    {\n        // Use assembly to simply slot the storage location into a variable\n        // solhint-disable-next-line no-inline-assembly\n        assembly {\n            $.slot := TIMELOCK_CORE_STORAGE_SLOT\n        }\n    }\n\n    /**\n     * Used to avoid multiple lines of solhint directives in a single line for better readability.\n     * @dev Returns the current block timestamp.\n     */\n    function _getBlockTimestamp() private view returns (uint256) {\n        // solhint-disable-next-line not-rely-on-time\n        return block.timestamp;\n    }\n}\n"},"libs/Timelock/TimelockView.sol":{"content":"// SPDX-License-Identifier: UNLICENSED\npragma solidity ^0.8.30;\n\nimport {TimelockCore} from \"libs/Timelock/TimelockCore.sol\";\n\n/**\n * @custom:security-contact blockchain@sygnum.com\n * @title TimelockView\n * @author SYGNUM AG - Blockchain team 3301\n * @notice View-only Timelock implementation that exposes operation details\n * @dev This contract provides read-only access to timelock operations without\n *      allowing modification. It's designed for contracts that need to query\n *      operation details but should not modify them directly.\n */\nabstract contract TimelockView is TimelockCore {\n    /*//////////////////////////////////////////////////////////////\n                        EXTERNAL/PUBLIC VIEW FUNCTIONS\n    //////////////////////////////////////////////////////////////*/\n\n    /**\n     * @notice Returns the details of a scheduled timelock operation\n     * @param _operationId The unique ID of the scheduled operation\n     * @return target The address of the contract to be called\n     * @return data The calldata to be sent with the call\n     * @return value The amount of Ether (in wei) to be sent with the call\n     * @return eta The earliest timestamp at which the operation can be executed\n     */\n    function getScheduledOperationDetails(\n        bytes32 _operationId\n    ) public view returns (address target, bytes memory data, uint256 value, uint256 eta) {\n        return _getScheduledOperationDetails(_operationId);\n    }\n}\n"},"libs/UUPS/UUPSTimelockUpgradeable.sol":{"content":"// SPDX-License-Identifier: UNLICENSED\npragma solidity ^0.8.30;\n\nimport {UUPSTimelockUpgradeableView} from './UUPSTimelockUpgradeableView.sol';\n\n/**\n * @custom:security-contact blockchain@sygnum.com\n * @title UUPSTimelockUpgradeable\n * @author Sygnum\n * @notice Standard UUPS Timelock implementation that extends UUPSTimelockUpgradeableView\n *         and exposes the public interface functions.\n *         Combines UUPS upgradeability with Timelock functionality for secure, delayed upgrades.\n *         Enables governance mechanisms where upgrades are executed only after a specified delay,\n *         providing a safety window for stakeholders.\n */\nabstract contract UUPSTimelockUpgradeable is UUPSTimelockUpgradeableView {\n\n    /* ======== External/Public State-Changing Functions ======== */\n\n    /**\n     * @notice Upgrades the implementation and optionally executes a function call.\n     * @param _newImplementation The address of the new implementation contract.\n     * @param _data Optional memory to execute after the upgrade.\n     */\n    function upgradeToAndCall(\n        address _newImplementation,\n        bytes memory _data\n    ) public onlyProxy {\n        _upgradeToAndCall(_newImplementation, _data);\n    }\n\n    /**\n     * @notice Executes the scheduled upgrade operation after the timelock delay has elapsed.\n     * @dev Finalizes the upgrade by executing the operation previously scheduled via `queueUpgrade`.\n     *      Checks that the upgrade is authorized and the timelock conditions are met before proceeding.\n     *      Upon successful execution, the upgrade operation is cleared from storage.\n     * @custom:reverts NoUpgradeScheduled if there is no upgrade operation in progress.\n     * @custom:reverts TimelockDoesNotExist if the scheduled operation does not exist.\n     * @custom:reverts TimelockNotReached if the timelock delay has not yet elapsed.\n     */\n    function executeUpgrade() public isUpgrading {\n        _executeUpgrade();\n    }\n\n    /**\n     * @notice Cancels a scheduled upgrade operation.\n     * @dev Allows cancellation of a previously scheduled upgrade operation at any time before it is finalized.\n     *      Removes the scheduled operation from storage, preventing it from being executed in the future.\n     *      If no upgrade is currently scheduled, this function has no effect.\n     * @custom:emits Canceled(bytes32 operationId) when the operation is successfully canceled.\n     */\n    function cancelUpgrade() public isUpgrading {\n        _cancelUpgrade();\n    }\n\n    /**\n     * @notice Executes the upgrade to a new implementation with optional initialization data.\n     * @dev Intended to be called internally by the contract itself as part of the timelock upgrade flow.\n     *      Performs the upgrade to the specified implementation and optionally executes additional setup logic.\n     *      Access control is enforced within the internal _callUpgradeToAndCallUUPS function via the `isInternalCall` modifier.\n     * @param _newImplementation The address of the new implementation contract.\n     * @param _data Optional initialization calldata to execute on the new implementation after the upgrade.\n     */\n    function callUpgradeToAndCallUUPS(\n        address _newImplementation,\n        bytes memory _data\n    ) public {\n        _callUpgradeToAndCallUUPS(_newImplementation, _data);\n    }\n}\n"},"libs/UUPS/UUPSTimelockUpgradeableCore.sol":{"content":"// SPDX-License-Identifier: UNLICENSED\npragma solidity ^0.8.30;\n\nimport {UUPSUpgradeableCore} from './UUPSUpgradeableCore.sol';\nimport {Timelock} from 'libs/Timelock/Timelock.sol';\nimport {BytesLib} from 'libs/utils/bytes/BytesLib.sol';\n\n/**\n * @custom:security-contact blockchain@sygnum.com\n * @title UUPSTimelockUpgradeableCore\n * @author Sygnum\n * @notice Core implementation that combines UUPS upgradeability with Timelock functionality for secure, delayed upgrades.\n *         Contains only internal functions for use by derived contracts.\n *         Enables governance mechanisms where upgrades are executed only after a specified delay,\n *         providing a safety window for stakeholders.\n *         Inherits from both `UUPSUpgradeableCore` for upgradeability and `Timelock` for delayed execution.\n */\nabstract contract UUPSTimelockUpgradeableCore is UUPSUpgradeableCore, Timelock {\n    using BytesLib for bytes;\n\n    /* ======== Custom Errors ======== */\n    error AlreadyUpgrading();\n    error NoUpgradeScheduled();\n    error UnAuthorizedCall();\n    error InvalidDelay();\n    error InvalidUpgradeCalldata();\n\n    event Callers(address indexed caller, address indexed context);\n\n    /* ======== State Variables ======== */\n    /**\n     * @dev Storage slot for tracking the upgrade operation state.\n     *      Prevents re-entrancy during the upgrade process.\n     *      keccak256(abi.encode(uint256(keccak256(\"UUPSTimelockUpgradeableCore.TimelockUpgradeableStorage\")) - 1)) & ~bytes32(uint256(0xff))\n     */\n    bytes32 private constant UUPS_TIMELOCK_UPGRADEABLE_CORE_STORAGE_SLOT =\n        0x2c9356b94ada349e65b0a691cd15e24beddfc13e05a26de25d9c64509c824400;\n\n    /// @custom:storage-location erc7201:UUPSTimelockUpgradeableCore.TimelockUpgradeableStorage\n    struct TimelockUpgradeableStorage {\n        /// @notice The hash of the currently scheduled upgrade operation, or zero if none.\n        bytes32 operationId;\n        /// @notice The delay in seconds before a queued operation can be executed.\n        uint256 delay;\n    }\n\n    /* ======== Modifiers ======== */\n\n    /// @notice Ensures the contract is not currently upgrading.\n    modifier isNotUpgrading() {\n        if (_isUpgrading()) {\n            revert AlreadyUpgrading();\n        }\n        _;\n    }\n\n    /// @notice Ensures the contract is currently upgrading.\n    modifier isUpgrading() {\n        if (!_isUpgrading()) {\n            revert NoUpgradeScheduled();\n        }\n        _;\n    }\n\n    /// @notice Restricts function to internal calls only.\n    modifier isInternalCall() {\n        emit Callers(msg.sender, address(this));\n        if (msg.sender != address(this)) revert UnAuthorizedCall();\n        _;\n    }\n\n    /* ======== Internal Initializer ======== */\n\n    /**\n     * @notice Initializes the UUPSTimelock with a specified delay.\n     * @dev Idempotent: Only initializes if delay is not already set (default value is 0).\n     *      This preserves existing delay during upgrades - new init data will not override existing delay.\n     * @param _delay The delay in seconds before a queued operation can be executed.\n     */\n    function _UUPSTimelock_init(uint256 _delay) internal {\n        TimelockUpgradeableStorage storage $ = _getTimelockUpgradeableStorage();\n        if ($.delay == 0) {\n            _setDelay(_delay);\n        }\n    }\n\n    /* ======== Internal State-Changing Functions ======== */\n\n    /**\n     * @notice Executes the scheduled upgrade operation after the timelock delay has elapsed.\n     * @dev Finalizes the upgrade by executing the operation previously scheduled via `queueUpgrade`.\n     *      Checks that the upgrade is authorized and the timelock conditions are met before proceeding.\n     *      Decodes the scheduled calldata to extract the new implementation address and initialization data,\n     *      then invokes _authorizeUpgrade before executing the operation.\n     *      Upon successful execution, the upgrade operation is cleared from storage.\n     * @custom:reverts NoUpgradeScheduled if there is no upgrade operation in progress.\n     * @custom:reverts TimelockDoesNotExist if the scheduled operation does not exist.\n     * @custom:reverts TimelockNotReached if the timelock delay has not yet elapsed.\n     * @custom:reverts InvalidUpgradeCalldata if the scheduled calldata is invalid.\n     */\n    function _executeUpgrade() internal {\n        TimelockUpgradeableStorage storage $ = _getTimelockUpgradeableStorage();\n        bytes32 _operationId = $.operationId;\n        (, bytes memory _data, , ) = getScheduledOperationDetails(_operationId);\n\n        // Decode the scheduled calldata to extract newImplementation and initData\n        (address _newImplementation, bytes memory _initData) = _decodeUpgradeCalldata(_data);\n\n        // Authorize the upgrade with the correct parameters\n        _authorizeUpgrade(_newImplementation, _initData);\n\n        _executeScheduledOperation(_operationId);\n        delete $.operationId;\n    }\n\n    /**\n     * @notice Cancels a scheduled upgrade operation.\n     * @dev Allows cancellation of a previously scheduled upgrade operation at any time before it is finalized.\n     *      Decodes the scheduled calldata to extract the new implementation address and initialization data,\n     *      then invokes _authorizeUpgrade before canceling the operation.\n     *      Removes the scheduled operation from storage, preventing it from being executed in the future.\n     *      If no upgrade is currently scheduled, this function has no effect.\n     * @custom:emits Canceled(bytes32 operationId) when the operation is successfully canceled.\n     * @custom:reverts InvalidUpgradeCalldata if the scheduled calldata is invalid.\n     */\n    function _cancelUpgrade() internal {\n        TimelockUpgradeableStorage storage $ = _getTimelockUpgradeableStorage();\n        bytes32 _operationId = $.operationId;\n        (, bytes memory _data, , ) = getScheduledOperationDetails(_operationId);\n\n        // Decode the scheduled calldata to extract newImplementation and initData\n        (address _newImplementation, bytes memory _initData) = _decodeUpgradeCalldata(_data);\n\n        // Authorize the upgrade cancellation with the correct parameters\n        _authorizeUpgrade(_newImplementation, _initData);\n\n        _cancelScheduledOperation(_operationId);\n        delete $.operationId;\n    }\n\n    /**\n     * @notice Executes the upgrade to a new implementation with optional initialization data.\n     * @dev Intended to be called internally by the contract itself as part of the timelock upgrade flow.\n     *      Performs the upgrade to the specified implementation and optionally executes additional setup logic.\n     *      Access is restricted to internal calls only via the `isInternalCall` modifier.\n     * @param _newImplementation The address of the new implementation contract.\n     * @param _data Optional initialization calldata to execute on the new implementation after the upgrade.\n     */\n    function _callUpgradeToAndCallUUPS(\n        address _newImplementation,\n        bytes memory _data\n    ) internal isInternalCall {\n        _upgradeToAndCallUUPS(_newImplementation, _data);\n    }\n\n    /**\n     * @notice Schedules the upgrade operation with the timelock.\n     * This is a overrideable function to be overridden by derived contracts to implement custom validations.\n     * @dev Schedules the upgrade operation to be executed after the timelock delay.\n     * @param _newImplementation The address of the new implementation contract.\n     * @param _data The data to be passed to the `callUpgradeToAndCallUUPS` function.\n     */\n    function _triggerUpgrade(\n        address _newImplementation,\n        bytes memory _data\n    ) internal virtual override {\n        _scheduleUpgrade(_newImplementation, _data);\n    }\n\n    /**\n     * @notice Schedules the upgrade operation with the timelock.\n     * @dev Encodes the upgrade operation and schedules it for execution after the delay.\n     * @param _newImplementation The address of the new implementation contract.\n     * @param _data The data to be passed to the `callUpgradeToAndCallUUPS` function.\n     */\n    function _scheduleUpgrade(\n        address _newImplementation,\n        bytes memory _data\n    ) internal isNotUpgrading {\n        TimelockUpgradeableStorage storage $ = _getTimelockUpgradeableStorage();\n        // Add the delay to the current block timestamp to get the scheduled execution time ahead of the current block.\n        // solhint-disable-next-line not-rely-on-time\n        uint256 _executionTimestamp = block.timestamp + $.delay;\n\n        bytes32 _operationId = _scheduleOperation(\n            address(this),\n            abi.encodeWithSignature(\n                \"callUpgradeToAndCallUUPS(address,bytes)\",\n                _newImplementation,\n                _data\n            ),\n            _executionTimestamp\n        );\n\n        $.operationId = _operationId;\n    }\n\n    /* ======== Private State-Changing Functions ======== */\n\n    /**\n     * @notice Sets the delay for the timelock.\n     * @dev Sets the delay in seconds before a queued operation can be executed.\n     * @param _delay The delay in seconds.\n     */\n    function _setDelay(uint256 _delay) private {\n        if (_delay == 0) revert InvalidDelay();\n        TimelockUpgradeableStorage storage $ = _getTimelockUpgradeableStorage();\n        $.delay = _delay;\n    }\n\n    /* ======== Private View/Pure Functions ======== */\n\n    /**\n     * @notice Decodes and validates scheduled upgrade calldata.\n     * @dev Extracts the new implementation address and initialization data from the scheduled operation calldata.\n     *      Validates that the function selector matches `callUpgradeToAndCallUUPS(address,bytes)`.\n     * @param _data The encoded calldata from the scheduled operation.\n     * @return _newImplementation The address of the new implementation contract.\n     * @return _initData The initialization calldata to be executed on the new implementation.\n     * @custom:reverts InvalidUpgradeCalldata if the function selector does not match or decoding fails.\n     */\n    function _decodeUpgradeCalldata(\n        bytes memory _data\n    ) private pure returns (address _newImplementation, bytes memory _initData) {\n        // Validate minimum length for callUpgradeToAndCallUUPS(address,bytes):\n        // - 4 bytes:  function selector\n        // - 32 bytes: address parameter (newImplementation)\n        // - 32 bytes: offset to dynamic bytes data (required by ABI encoding, points to byte 64)\n        // - 32 bytes: length of bytes array (can be 0 for empty initData)\n        // Total: 100 bytes minimum (data itself can be empty)\n        if (_data.length < 100) {\n            revert InvalidUpgradeCalldata();\n        }\n\n        // Decode the parameters\n        // Skip the first 4 bytes (selector) and decode (address, bytes)\n        (_newImplementation, _initData) = abi.decode(\n            _data.slice(4, _data.length),\n            (address, bytes)\n        );\n    }\n\n    /**\n     * @notice Checks if the contract is currently in the upgrading state.\n     * @return value `true` if the contract is upgrading, `false` otherwise.\n     */\n    function _isUpgrading() private view returns (bool) {\n        TimelockUpgradeableStorage storage $ = _getTimelockUpgradeableStorage();\n        return $.operationId != bytes32(0);\n    }\n\n    /**\n     * @dev Returns the TimelockUpgradeableStorage struct.\n     */\n    function _getTimelockUpgradeableStorage()\n        private\n        pure\n        returns (TimelockUpgradeableStorage storage $)\n    {\n        // Use assembly to simply slot the storage location into a variable\n        // solhint-disable-next-line no-inline-assembly\n        assembly {\n            $.slot := UUPS_TIMELOCK_UPGRADEABLE_CORE_STORAGE_SLOT\n        }\n    }\n}\n"},"libs/UUPS/UUPSTimelockUpgradeableView.sol":{"content":"// SPDX-License-Identifier: UNLICENSED\npragma solidity ^0.8.30;\n\nimport {UUPSTimelockUpgradeableCore} from './UUPSTimelockUpgradeableCore.sol';\nimport {UUPSUtils} from './UUPSUtils.sol';\nimport {IUUPSAsynchronousUpgradeable} from './interface/IUUPSAsynchronousUpgradeable.sol';\n\n/**\n * @custom:security-contact blockchain@sygnum.com\n * @title UUPSTimelockUpgradeableView\n * @author SYGNUM AG - Blockchain team 3301\n * @notice View-only UUPS Timelock upgrade implementation that exposes view functions\n * @dev This contract provides read-only access to UUPS Timelock upgrade state without\n *      allowing upgrade modifications. It's designed for contracts that need to query\n *      upgrade and timelock information but should not perform upgrades directly.\n *      Note: This implementation is independent of UUPSUpgradeableView due to Core\n *      layer inheritance differences (UUPSTimelockUpgradeableCore inherits from both\n *      UUPSUpgradeableCore and Timelock).\n */\nabstract contract UUPSTimelockUpgradeableView is UUPSTimelockUpgradeableCore, IUUPSAsynchronousUpgradeable {\n    /*//////////////////////////////////////////////////////////////\n                        EXTERNAL/PUBLIC VIEW FUNCTIONS\n    //////////////////////////////////////////////////////////////*/\n\n    /**\n     * @notice Returns the storage slot used by the implementation\n     * @dev Reverts if called through a proxy to prevent bricking\n     * @return The storage slot used by the implementation\n     */\n    function proxiableUUID() external view notDelegated returns (bytes32) {\n        return _proxiableUUID();\n    }\n\n    /**\n     * @notice Returns the current implementation address\n     * @dev Returns the address stored in the ERC-1967 implementation slot\n     * @return The address of the current implementation contract\n     */\n    function getImplementation() external view returns (address) {\n        return UUPSUtils.getImplementation();\n    }\n}\n"},"libs/UUPS/UUPSUpgradeableCore.sol":{"content":"// SPDX-License-Identifier: UNLICENSED\npragma solidity ^0.8.30;\n\nimport {IERC1822Proxiable} from './interface/IERC1822.sol';\nimport {UUPSUtils} from './UUPSUtils.sol';\n\n/**\n * @custom:security-contact blockchain@sygnum.com\n * @title UUPSUpgradeableCore\n * @author SYGNUM AG - Blockchain team 3301\n * @notice Core UUPS upgradeability implementation with only internal functions\n * @dev Provides upgradeability logic for UUPS proxies, including initialization and upgrade authorization.\n * Combines initialization and UUPS upgrade logic for use behind an ERC1967Proxy.\n * UUPS (Universal Upgradeable Proxy Standard) is a proxy pattern where the upgrade logic resides in the implementation contract itself,\n * rather than in the proxy. This contract provides the base functionality for UUPS upgradeability, including checks to ensure\n * that upgrades are authorized and that the implementation contract is valid.\n */\nabstract contract UUPSUpgradeableCore is IERC1822Proxiable {\n    /* ======== State Variables ======== */\n    /**\n     * @dev `__self` is an immutable state variable that stores the address of the contract instance.\n     * It is used to differentiate between direct calls to the implementation contract and calls through the proxy.\n     * This is crucial for security checks to prevent unauthorized access to upgrade functions.\n     * By storing the contract's own address, we can determine if a call is being made directly to the implementation\n     * or through the proxy, which is essential for enforcing access control and preventing unauthorized upgrades.\n     */\n    address private immutable __self = address(this);\n\n    /* ======== Modifiers ======== */\n    /**\n     * @dev Restricts function to only be called through a proxy.\n     * @notice This modifier checks that the function is being called via a delegate call through a proxy contract.\n     * It prevents direct calls to the implementation contract, ensuring that all calls go through the proxy.\n     */\n    modifier onlyProxy() {\n        _checkProxy();\n        _;\n    }\n\n    /**\n     * @dev Restricts function to only be called directly, not via delegatecall.\n     * @notice This modifier ensures that the function is called directly on the implementation contract,\n     * not through a delegate call. This is used to protect functions that should only be called by the implementation itself.\n     */\n    modifier notDelegated() {\n        _checkNotDelegated();\n        _;\n    }\n\n    /* ======== Custom Errors ======== */\n    error UUPSUnauthorizedCallContext();\n\n    /* ======== Internal View/Pure Functions ======== */\n\n    /**\n     * @notice Returns the storage slot used by the implementation.\n     * @dev Internal version for core functionality.\n     * @return bytes32 The storage slot used by the implementation.\n     */\n    function _proxiableUUID() internal view returns (bytes32) {\n        _checkNotDelegated();\n        return UUPSUtils.IMPLEMENTATION_SLOT;\n    }\n\n    /**\n     * @dev Ensures the function is called through a proxy with the correct implementation.\n     * @notice This function checks that the contract is being called via a delegate call through a proxy contract\n     * and that the implementation address matches the current contract address.\n     * It reverts with `UUPSUnauthorizedCallContext` if the conditions are not met.\n     */\n    function _checkProxy() internal view {\n        // If the address of `this` is equal to `__self`, it means the contract is being called directly, not through a proxy.\n        // Additionally, it verifies that the implementation address stored in the UUPSUtils matches the current contract address.\n        if (\n            address(this) == __self || UUPSUtils.getImplementation() != __self\n        ) {\n            revert UUPSUnauthorizedCallContext();\n        }\n    }\n\n    /**\n     * @dev Ensures the function is not called through delegatecall.\n     * @notice This function checks that the contract is being called directly and not through a delegate call.\n     * It reverts with `UUPSUnauthorizedCallContext` if the contract is being called through a delegate call.\n     */\n    function _checkNotDelegated() internal view {\n        // If the address of `this` is not equal to `__self`, it means the contract is being called through a delegate call.\n        if (address(this) != __self) {\n            revert UUPSUnauthorizedCallContext();\n        }\n    }\n\n    /* ======== Internal State-Changing Functions ======== */\n\n    /**\n     * @notice Upgrades the implementation and optionally executes a function call.\n     * @param _newImplementation The address of the new implementation contract.\n     * @param _data Optional memory to execute after the upgrade.\n     */\n    function _upgradeToAndCall(\n        address _newImplementation,\n        bytes memory _data\n    ) internal {\n        _checkProxy();\n        _authorizeUpgrade(_newImplementation, _data);\n        _triggerUpgrade(_newImplementation, _data);\n    }\n\n    /**\n     * @notice Must be overridden to include access restriction to the upgrade mechanism.\n     * validates the _newImplementation address and _data to perform any necessary checks on the input data\n     * @param _newImplementation The address of the new implementation contract.\n     * @param _data Optional memory to execute after the upgrade.\n     */\n    function _authorizeUpgrade(address _newImplementation,bytes memory _data) internal view virtual;\n\n    /**\n     * @dev Executes the upgrade.\n     * @notice This function is responsible for performing the actual upgrade of the contract.\n     * It calls the `_upgradeToAndCallUUPS` function to switch to the new implementation.\n     * @param _newImplementation The address of the new implementation contract.\n     * @param _data The _data to be passed to the new implementation contract.\n     */\n    function _triggerUpgrade(\n        address _newImplementation,\n        bytes memory _data\n    ) internal virtual {\n        _upgradeToAndCallUUPS(_newImplementation, _data);\n    }\n\n    /**\n     * @dev Performs an implementation upgrade with a security check for UUPS proxies and optional setup call.\n     * @param _newImplementation The address of the new implementation contract.\n     * @param _data Optional memory to execute after the upgrade.\n     */\n    function _upgradeToAndCallUUPS(\n        address _newImplementation,\n        bytes memory _data\n    ) internal {\n        _preUpgradeToAndCallUUPS(_newImplementation, _data);\n        UUPSUtils.upgradeToAndCall(_newImplementation, _data);\n        _postUpgradeToAndCallUUPS(_newImplementation, _data);\n    }\n\n    /**\n     * @notice Hook that is called before an upgrade is executed.\n     * @dev Can be overridden by derived contracts to implement custom logic before the upgrade is executed.\n     *      If the contract inherits from Initializable. Override this method to calls _resetInitialized().\n     * @param _newImplementation The address of the new implementation contract.\n     * @param _data The data that was passed during the upgrade.\n     */\n    function _preUpgradeToAndCallUUPS(address _newImplementation, bytes memory _data) internal virtual {}\n\n    /**\n     * @notice Hook that is called after an upgrade is executed.\n     * @dev Can be overridden by derived contracts to implement custom logic after the upgrade is executed.\n     *      For example, to check that the contract is properly initialized after the upgrade.\n     *      If the contract inherits from Initializable, this can be used to verify that isInitialized() returns true\n     *      when initialization data is required.\n     * @param _newImplementation The address of the new implementation contract.\n     * @param _data The data that was passed during the upgrade.\n     */\n    function _postUpgradeToAndCallUUPS(address _newImplementation, bytes memory _data) internal virtual {}\n}\n"},"libs/UUPS/UUPSUtils.sol":{"content":"// SPDX-License-Identifier: UNLICENSED\npragma solidity ^0.8.30;\n\nimport {IERC1967} from './interface/IERC1967.sol';\nimport {IERC1822Proxiable} from './interface/IERC1822.sol';\n\n/**\n * @custom:security-contact blockchain@sygnum.com\n * @title UUPSUtils\n * @notice Provides utility functions for UUPS proxies, including implementation retrieval, upgrade execution, and safety checks.\n * @dev This library offers a collection of functions designed to simplify the implementation of UUPS (Universal Upgradeable Proxy Standard) proxies.\n */\nlibrary UUPSUtils {\n    /* ======== Custom Errors ======== */\n    error ERC1967InvalidImplementation(address implementation);\n    error ERC1967NonPayable();\n    error FailedCall();\n\n    /* ======== Constants ======== */\n    /** @dev Storage slot for the implementation address (EIP-1967 standard).   \n     * bytes32(uint256(keccak256('eip1967.proxy.implementation')) - 1)\n     */\n    bytes32 internal constant IMPLEMENTATION_SLOT =\n        0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;\n\n    /** @dev The address of the current implementation. */\n    function getImplementation()\n        internal\n        view\n        returns (address implementation)\n    {\n        // Load the implementation address from the ERC-1967 slot.\n        // solhint-disable-next-line no-inline-assembly\n        assembly ('memory-safe') {\n            implementation := sload(IMPLEMENTATION_SLOT)\n        }\n    }\n\n    /**\n     * @notice Upgrades the implementation and optionally performs a setup call.\n     * @param _newImplementation The address of the new implementation contract.\n     * @param _data Optional initialization calldata to delegatecall to the new implementation.\n     */\n    function upgradeToAndCall(\n        address _newImplementation,\n        bytes memory _data\n    ) internal {\n        _setImplementation(_newImplementation);\n        emit IERC1967.Upgraded(_newImplementation);\n\n        if (_data.length > 0) {\n            _safeFunctionDelegateCall(_newImplementation, _data);\n        } else {\n            _checkNonPayable();\n        }\n    }\n\n    /** @notice Reverts if msg.value is not zero. */\n    function _checkNonPayable() private {\n        if (msg.value > 0) {\n            revert ERC1967NonPayable();\n        }\n    }\n\n    /**\n     * @notice Stores a new address in the ERC-1967 implementation slot.\n     * @param _newImplementation The address to store as the new implementation.\n     */\n    function _setImplementation(address _newImplementation) private {\n        _checkValidImplementation(_newImplementation);\n\n        // solhint-disable-next-line no-inline-assembly\n        assembly ('memory-safe') {\n            sstore(IMPLEMENTATION_SLOT, _newImplementation)\n        }\n    }\n\n    /**\n     * @dev Ensures the function is not called through delegatecall.\n     * @notice This function checks that the provided address is a valid UUPS implementation contract by verifying its proxiableUUID.\n     * It reverts with `UUPSUtils.ERC1967InvalidImplementation` if the provided address is not a valid implementation.\n     * @param _newImplementation The address of the new implementation contract.\n     */\n    function _checkValidImplementation(address _newImplementation) private view {\n        // Implementation address must contain code (this also covers address(0))\n        if (_newImplementation.code.length == 0) {\n            revert ERC1967InvalidImplementation(_newImplementation);\n        }\n        // Check that the new implementation exposes the proxiableUUID function and that it returns the expected value.\n        try IERC1822Proxiable(_newImplementation).proxiableUUID() returns (\n            bytes32 slot\n        ) {\n            if (slot != IMPLEMENTATION_SLOT) {\n                revert ERC1967InvalidImplementation(_newImplementation);\n            }\n        } catch {\n            revert ERC1967InvalidImplementation(_newImplementation);\n        }\n    }\n\n    /**\n     * @notice Performs a delegatecall to the target address with the given data and verifies the result.\n     * @param _target The address to delegatecall to.\n     * @param _data The data to send with the delegatecall.\n     * @return _returndata The data returned by the delegatecall.\n     * @dev Bubbles up revert reasons or custom errors if the call fails.\n     */\n    function _safeFunctionDelegateCall(\n        address _target,\n        bytes memory _data\n    ) private returns (bytes memory) {\n        // low level call is validate to prevent low-level call reentrancy or other low-level call errors\n        // solhint-disable-next-line avoid-low-level-calls\n        (bool _success, bytes memory _returndata) = _target.delegatecall(_data);\n\n        if (!_success) {\n            if (_returndata.length > 0) {\n                // solhint-disable-next-line no-inline-assembly\n                assembly ('memory-safe') {\n                    let returndata_size := mload(_returndata)\n                    revert(add(32, _returndata), returndata_size)\n                }\n            }\n            revert FailedCall();\n        }\n\n        return _returndata;\n    }\n}\n"}},"compilation":{"language":"Solidity","compiler":"solc","compilerVersion":"0.8.30+commit.73712a01","compilerSettings":{"viaIR":false,"metadata":{"appendCBOR":true,"bytecodeHash":"ipfs","useLiteralContent":false},"libraries":{},"optimizer":{"runs":300,"enabled":true},"evmVersion":"prague","remappings":["@chainlink-contracts-1.3.0/=dependencies/@chainlink-contracts-1.3.0/","@gnosis-pm-safe-contracts-1.3.0/=dependencies/@gnosis-pm-safe-contracts-1.3.0/","forge-std/=dependencies/forge-std-1.9.4/src/","safe-global-safe-smart-account-1.4.1-3/=dependencies/safe-global-safe-smart-account-1.4.1-3/","solmate-6.8.0/=dependencies/solmate-6.8.0/","forge-std-1.9.4/=dependencies/forge-std-1.9.4/src/"]},"name":"SygToken","fullyQualifiedName":"apps/tokenization/SygToken/contracts/SygToken.sol:SygToken"},"abi":[{"name":"AlreadyUpgrading","type":"error","inputs":[]},{"name":"ContractNotInitializedAfterUpgrade","type":"error","inputs":[]},{"name":"ContractNotPaused","type":"error","inputs":[]},{"name":"ContractPaused","type":"error","inputs":[]},{"name":"ERC1967InvalidImplementation","type":"error","inputs":[{"name":"implementation","type":"address","internalType":"address"}]},{"name":"ERC1967NonPayable","type":"error","inputs":[]},{"name":"FailedCall","type":"error","inputs":[]},{"name":"IncompleteRound","type":"error","inputs":[]},{"name":"InsufficientFunds","type":"error","inputs":[{"name":"given","type":"uint256","internalType":"uint256"},{"name":"expected","type":"uint256","internalType":"uint256"}]},{"name":"InvalidDelay","type":"error","inputs":[]},{"name":"InvalidInitialization","type":"error","inputs":[]},{"name":"InvalidOracle","type":"error","inputs":[{"name":"_oracleAddress","type":"address","internalType":"address"}]},{"name":"InvalidPrice","type":"error","inputs":[]},{"name":"InvalidSigner","type":"error","inputs":[]},{"name":"InvalidTimestamp","type":"error","inputs":[]},{"name":"InvalidUpgradeCalldata","type":"error","inputs":[]},{"name":"NoUpgradeScheduled","type":"error","inputs":[]},{"name":"NotTokenUser","type":"error","inputs":[{"name":"account","type":"address","internalType":"address"}]},{"name":"OperationExecutionFailed","type":"error","inputs":[{"name":"operationId","type":"bytes32","internalType":"bytes32"}]},{"name":"PermitDeadlineExpired","type":"error","inputs":[]},{"name":"SameOracleAddress","type":"error","inputs":[{"name":"_oracleAddress","type":"address","internalType":"address"}]},{"name":"SameTokenURI","type":"error","inputs":[{"name":"_tokenURI","type":"string","internalType":"string"}]},{"name":"TimeLockAlreadyExist","type":"error","inputs":[]},{"name":"TimelockDoesNotExist","type":"error","inputs":[]},{"name":"TimelockNotReached","type":"error","inputs":[]},{"name":"TransferFailed","type":"error","inputs":[]},{"name":"UUPSUnauthorizedCallContext","type":"error","inputs":[]},{"name":"UnAuthorizedCall","type":"error","inputs":[]},{"name":"Unauthorized","type":"error","inputs":[]},{"name":"UnauthorizedUpgrade","type":"error","inputs":[{"name":"caller","type":"address","internalType":"address"},{"name":"expectedPermissionManager","type":"address","internalType":"address"}]},{"name":"ZeroAddress","type":"error","inputs":[]},{"name":"Approval","type":"event","inputs":[{"name":"owner","type":"address","indexed":true,"internalType":"address"},{"name":"spender","type":"address","indexed":true,"internalType":"address"},{"name":"amount","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"name":"Callers","type":"event","inputs":[{"name":"caller","type":"address","indexed":true,"internalType":"address"},{"name":"context","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"name":"Canceled","type":"event","inputs":[{"name":"operationId","type":"bytes32","indexed":true,"internalType":"bytes32"}],"anonymous":false},{"name":"Executed","type":"event","inputs":[{"name":"operationId","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"target","type":"address","indexed":false,"internalType":"address"},{"name":"value","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"data","type":"bytes","indexed":false,"internalType":"bytes"},{"name":"timestamp","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"name":"ForcedTransfer","type":"event","inputs":[{"name":"from","type":"address","indexed":true,"internalType":"address"},{"name":"to","type":"address","indexed":true,"internalType":"address"},{"name":"amount","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"name":"FundsRecovered","type":"event","inputs":[{"name":"token","type":"address","indexed":true,"internalType":"address"},{"name":"to","type":"address","indexed":true,"internalType":"address"},{"name":"requestedAmount","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"actualAmountReceived","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"name":"Initialized","type":"event","inputs":[],"anonymous":false},{"name":"MinterBurnerUpdated","type":"event","inputs":[{"name":"account","type":"address","indexed":true,"internalType":"address"},{"name":"minterBurner","type":"bool","indexed":false,"internalType":"bool"}],"anonymous":false},{"name":"Paused","type":"event","inputs":[],"anonymous":false},{"name":"PriceFeedOracleUpdated","type":"event","inputs":[{"name":"previousOracle","type":"address","indexed":true,"internalType":"address"},{"name":"newOracle","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"name":"Queued","type":"event","inputs":[{"name":"operationId","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"target","type":"address","indexed":false,"internalType":"address"},{"name":"value","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"data","type":"bytes","indexed":false,"internalType":"bytes"},{"name":"eta","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"name":"TokenURIUpdated","type":"event","inputs":[{"name":"previousTokenURI","type":"string","indexed":false,"internalType":"string"},{"name":"newTokenURI","type":"string","indexed":false,"internalType":"string"}],"anonymous":false},{"name":"TokenUserBlacklisted","type":"event","inputs":[{"name":"account","type":"address","indexed":true,"internalType":"address"},{"name":"blacklist","type":"bool","indexed":false,"internalType":"bool"}],"anonymous":false},{"name":"TokenUserManagerUpdated","type":"event","inputs":[{"name":"account","type":"address","indexed":true,"internalType":"address"},{"name":"tokenUserManager","type":"bool","indexed":false,"internalType":"bool"}],"anonymous":false},{"name":"TokenUserUpdated","type":"event","inputs":[{"name":"account","type":"address","indexed":true,"internalType":"address"},{"name":"tokenUser","type":"bool","indexed":false,"internalType":"bool"}],"anonymous":false},{"name":"Transfer","type":"event","inputs":[{"name":"from","type":"address","indexed":true,"internalType":"address"},{"name":"to","type":"address","indexed":true,"internalType":"address"},{"name":"amount","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"name":"Unpaused","type":"event","inputs":[],"anonymous":false},{"name":"Upgraded","type":"event","inputs":[{"name":"implementation","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"name":"DOMAIN_SEPARATOR","type":"function","inputs":[],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"name":"allowance","type":"function","inputs":[{"name":"_owner","type":"address","internalType":"address"},{"name":"_spender","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"approve","type":"function","inputs":[{"name":"_spender","type":"address","internalType":"address"},{"name":"_amount","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"nonpayable"},{"name":"balanceOf","type":"function","inputs":[{"name":"_account","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"blacklistTokenUser","type":"function","inputs":[{"name":"_account","type":"address","internalType":"address"},{"name":"_blacklist","type":"bool","internalType":"bool"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"burn","type":"function","inputs":[{"name":"_from","type":"address","internalType":"address"},{"name":"_amount","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"callUpgradeToAndCallUUPS","type":"function","inputs":[{"name":"_newImplementation","type":"address","internalType":"address"},{"name":"_data","type":"bytes","internalType":"bytes"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"cancelUpgrade","type":"function","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"name":"decimals","type":"function","inputs":[],"outputs":[{"name":"","type":"uint8","internalType":"uint8"}],"stateMutability":"view"},{"name":"executeUpgrade","type":"function","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"name":"forcedTransfer","type":"function","inputs":[{"name":"_from","type":"address","internalType":"address"},{"name":"_to","type":"address","internalType":"address"},{"name":"_amount","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"getBundleData","type":"function","inputs":[],"outputs":[{"name":"_bundleData","type":"bytes","internalType":"bytes"},{"name":"_updatedAt","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"getImplementation","type":"function","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"name":"getPermissionManagerAddress","type":"function","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"name":"getPrice","type":"function","inputs":[],"outputs":[{"name":"_price","type":"int256","internalType":"int256"},{"name":"_updatedAt","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"getPriceFeedDecimals","type":"function","inputs":[],"outputs":[{"name":"","type":"uint8[]","internalType":"uint8[]"}],"stateMutability":"view"},{"name":"getPriceFeedDescription","type":"function","inputs":[],"outputs":[{"name":"","type":"string","internalType":"string"}],"stateMutability":"view"},{"name":"getPriceFeedOracleAddress","type":"function","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"name":"getScheduledOperationDetails","type":"function","inputs":[{"name":"_operationId","type":"bytes32","internalType":"bytes32"}],"outputs":[{"name":"target","type":"address","internalType":"address"},{"name":"data","type":"bytes","internalType":"bytes"},{"name":"value","type":"uint256","internalType":"uint256"},{"name":"eta","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"getTokenURI","type":"function","inputs":[],"outputs":[{"name":"","type":"string","internalType":"string"}],"stateMutability":"view"},{"name":"initialize","type":"function","inputs":[{"name":"_name","type":"string","internalType":"string"},{"name":"_symbol","type":"string","internalType":"string"},{"name":"_decimals","type":"uint8","internalType":"uint8"},{"name":"_tokenURI","type":"string","internalType":"string"},{"name":"_permissionManagerAddress","type":"address","internalType":"address"},{"name":"_timelockDelaySeconds","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"isInitialized","type":"function","inputs":[],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"name":"isMinterBurner","type":"function","inputs":[{"name":"_account","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"name":"isOperator","type":"function","inputs":[{"name":"_account","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"name":"isPaused","type":"function","inputs":[],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"name":"isPauser","type":"function","inputs":[{"name":"_account","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"name":"isRoleManager","type":"function","inputs":[{"name":"_account","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"name":"isSygTokenImplementation","type":"function","inputs":[],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"pure"},{"name":"isSystem","type":"function","inputs":[{"name":"_account","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"name":"isTokenUser","type":"function","inputs":[{"name":"_account","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"name":"isTokenUserManager","type":"function","inputs":[{"name":"_account","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"name":"mint","type":"function","inputs":[{"name":"_to","type":"address","internalType":"address"},{"name":"_amount","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"name","type":"function","inputs":[],"outputs":[{"name":"","type":"string","internalType":"string"}],"stateMutability":"view"},{"name":"nonces","type":"function","inputs":[{"name":"_account","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"pause","type":"function","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"name":"permit","type":"function","inputs":[{"name":"_owner","type":"address","internalType":"address"},{"name":"_spender","type":"address","internalType":"address"},{"name":"_value","type":"uint256","internalType":"uint256"},{"name":"_deadline","type":"uint256","internalType":"uint256"},{"name":"_v","type":"uint8","internalType":"uint8"},{"name":"_r","type":"bytes32","internalType":"bytes32"},{"name":"_s","type":"bytes32","internalType":"bytes32"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"proxiableUUID","type":"function","inputs":[],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"name":"recoverFunds","type":"function","inputs":[{"name":"_token","type":"address","internalType":"address"},{"name":"_to","type":"address","internalType":"address payable"},{"name":"_amount","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"setPermissionManagerAddress","type":"function","inputs":[{"name":"_permissionManagerAddress","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"symbol","type":"function","inputs":[],"outputs":[{"name":"","type":"string","internalType":"string"}],"stateMutability":"view"},{"name":"totalSupply","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"transfer","type":"function","inputs":[{"name":"_to","type":"address","internalType":"address"},{"name":"_amount","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"nonpayable"},{"name":"transferFrom","type":"function","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":"nonpayable"},{"name":"unpause","type":"function","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"name":"updateMinterBurner","type":"function","inputs":[{"name":"_account","type":"address","internalType":"address"},{"name":"_minterBurner","type":"bool","internalType":"bool"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"updatePricefeedOracleAddress","type":"function","inputs":[{"name":"_newPriceFeedOracleAddress","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"updateTokenURI","type":"function","inputs":[{"name":"_newTokenURI","type":"string","internalType":"string"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"updateTokenUser","type":"function","inputs":[{"name":"_account","type":"address","internalType":"address"},{"name":"_tokenUser","type":"bool","internalType":"bool"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"updateTokenUserManager","type":"function","inputs":[{"name":"_account","type":"address","internalType":"address"},{"name":"_tokenUserManager","type":"bool","internalType":"bool"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"upgradeToAndCall","type":"function","inputs":[{"name":"_newImplementation","type":"address","internalType":"address"},{"name":"_data","type":"bytes","internalType":"bytes"}],"outputs":[],"stateMutability":"nonpayable"}],"metadata":{"compiler":{"version":"0.8.30+commit.73712a01"},"language":"Solidity","output":{"abi":[{"inputs":[],"name":"AlreadyUpgrading","type":"error"},{"inputs":[],"name":"ContractNotInitializedAfterUpgrade","type":"error"},{"inputs":[],"name":"ContractNotPaused","type":"error"},{"inputs":[],"name":"ContractPaused","type":"error"},{"inputs":[{"internalType":"address","name":"implementation","type":"address"}],"name":"ERC1967InvalidImplementation","type":"error"},{"inputs":[],"name":"ERC1967NonPayable","type":"error"},{"inputs":[],"name":"FailedCall","type":"error"},{"inputs":[],"name":"IncompleteRound","type":"error"},{"inputs":[{"internalType":"uint256","name":"given","type":"uint256"},{"internalType":"uint256","name":"expected","type":"uint256"}],"name":"InsufficientFunds","type":"error"},{"inputs":[],"name":"InvalidDelay","type":"error"},{"inputs":[],"name":"InvalidInitialization","type":"error"},{"inputs":[{"internalType":"address","name":"_oracleAddress","type":"address"}],"name":"InvalidOracle","type":"error"},{"inputs":[],"name":"InvalidPrice","type":"error"},{"inputs":[],"name":"InvalidSigner","type":"error"},{"inputs":[],"name":"InvalidTimestamp","type":"error"},{"inputs":[],"name":"InvalidUpgradeCalldata","type":"error"},{"inputs":[],"name":"NoUpgradeScheduled","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"NotTokenUser","type":"error"},{"inputs":[{"internalType":"bytes32","name":"operationId","type":"bytes32"}],"name":"OperationExecutionFailed","type":"error"},{"inputs":[],"name":"PermitDeadlineExpired","type":"error"},{"inputs":[{"internalType":"address","name":"_oracleAddress","type":"address"}],"name":"SameOracleAddress","type":"error"},{"inputs":[{"internalType":"string","name":"_tokenURI","type":"string"}],"name":"SameTokenURI","type":"error"},{"inputs":[],"name":"TimeLockAlreadyExist","type":"error"},{"inputs":[],"name":"TimelockDoesNotExist","type":"error"},{"inputs":[],"name":"TimelockNotReached","type":"error"},{"inputs":[],"name":"TransferFailed","type":"error"},{"inputs":[],"name":"UUPSUnauthorizedCallContext","type":"error"},{"inputs":[],"name":"UnAuthorizedCall","type":"error"},{"inputs":[],"name":"Unauthorized","type":"error"},{"inputs":[{"internalType":"address","name":"caller","type":"address"},{"internalType":"address","name":"expectedPermissionManager","type":"address"}],"name":"UnauthorizedUpgrade","type":"error"},{"inputs":[],"name":"ZeroAddress","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"caller","type":"address"},{"indexed":true,"internalType":"address","name":"context","type":"address"}],"name":"Callers","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"operationId","type":"bytes32"}],"name":"Canceled","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"operationId","type":"bytes32"},{"indexed":false,"internalType":"address","name":"target","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"},{"indexed":false,"internalType":"bytes","name":"data","type":"bytes"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"Executed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"ForcedTransfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"requestedAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"actualAmountReceived","type":"uint256"}],"name":"FundsRecovered","type":"event"},{"anonymous":false,"inputs":[],"name":"Initialized","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"bool","name":"minterBurner","type":"bool"}],"name":"MinterBurnerUpdated","type":"event"},{"anonymous":false,"inputs":[],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOracle","type":"address"},{"indexed":true,"internalType":"address","name":"newOracle","type":"address"}],"name":"PriceFeedOracleUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"operationId","type":"bytes32"},{"indexed":false,"internalType":"address","name":"target","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"},{"indexed":false,"internalType":"bytes","name":"data","type":"bytes"},{"indexed":false,"internalType":"uint256","name":"eta","type":"uint256"}],"name":"Queued","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"previousTokenURI","type":"string"},{"indexed":false,"internalType":"string","name":"newTokenURI","type":"string"}],"name":"TokenURIUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"bool","name":"blacklist","type":"bool"}],"name":"TokenUserBlacklisted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"bool","name":"tokenUserManager","type":"bool"}],"name":"TokenUserManagerUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"bool","name":"tokenUser","type":"bool"}],"name":"TokenUserUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[],"name":"Unpaused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"implementation","type":"address"}],"name":"Upgraded","type":"event"},{"inputs":[],"name":"DOMAIN_SEPARATOR","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"address","name":"_spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_spender","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"},{"internalType":"bool","name":"_blacklist","type":"bool"}],"name":"blacklistTokenUser","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newImplementation","type":"address"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"callUpgradeToAndCallUUPS","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"cancelUpgrade","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"executeUpgrade","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":"forcedTransfer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getBundleData","outputs":[{"internalType":"bytes","name":"_bundleData","type":"bytes"},{"internalType":"uint256","name":"_updatedAt","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getImplementation","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getPermissionManagerAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getPrice","outputs":[{"internalType":"int256","name":"_price","type":"int256"},{"internalType":"uint256","name":"_updatedAt","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getPriceFeedDecimals","outputs":[{"internalType":"uint8[]","name":"","type":"uint8[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getPriceFeedDescription","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getPriceFeedOracleAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_operationId","type":"bytes32"}],"name":"getScheduledOperationDetails","outputs":[{"internalType":"address","name":"target","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"uint256","name":"eta","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"uint8","name":"_decimals","type":"uint8"},{"internalType":"string","name":"_tokenURI","type":"string"},{"internalType":"address","name":"_permissionManagerAddress","type":"address"},{"internalType":"uint256","name":"_timelockDelaySeconds","type":"uint256"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"isInitialized","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"isMinterBurner","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"isOperator","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isPaused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"isPauser","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"isRoleManager","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isSygTokenImplementation","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"isSystem","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"isTokenUser","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"isTokenUserManager","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"nonces","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"address","name":"_spender","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"},{"internalType":"uint256","name":"_deadline","type":"uint256"},{"internalType":"uint8","name":"_v","type":"uint8"},{"internalType":"bytes32","name":"_r","type":"bytes32"},{"internalType":"bytes32","name":"_s","type":"bytes32"}],"name":"permit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"proxiableUUID","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"address payable","name":"_to","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"recoverFunds","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_permissionManagerAddress","type":"address"}],"name":"setPermissionManagerAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"},{"internalType":"bool","name":"_minterBurner","type":"bool"}],"name":"updateMinterBurner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newPriceFeedOracleAddress","type":"address"}],"name":"updatePricefeedOracleAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newTokenURI","type":"string"}],"name":"updateTokenURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"},{"internalType":"bool","name":"_tokenUser","type":"bool"}],"name":"updateTokenUser","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"},{"internalType":"bool","name":"_tokenUserManager","type":"bool"}],"name":"updateTokenUserManager","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newImplementation","type":"address"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"upgradeToAndCall","outputs":[],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"custom:security-contact":"blockchain@sygnum.com","events":{"Canceled(bytes32)":{"params":{"operationId":"The unique ID of the operation."}},"Executed(bytes32,address,uint256,bytes,uint256)":{"params":{"data":"The data that was sent with the call.","operationId":"The unique ID of the operation.","target":"The address of the contract that was called.","timestamp":"The timestamp (in seconds since Unix epoch) when the operation is executed.","value":"The amount of Ether (in wei) that was sent with the call."}},"Queued(bytes32,address,uint256,bytes,uint256)":{"params":{"data":"The data to send with the call (ABI-encoded function arguments).","eta":"The timestamp (in seconds since Unix epoch) after which the operation can be executed.","operationId":"The unique ID of the operation.","target":"The address of the contract to call.","value":"The amount of Ether (in wei) to send with the call."}},"Upgraded(address)":{"details":"Emitted when the implementation is upgraded.","params":{"implementation":"The address of the new implementation."}}},"kind":"dev","methods":{"DOMAIN_SEPARATOR()":{"returns":{"_0":"The domain separator hash"}},"allowance(address,address)":{"params":{"_owner":"The address of the token owner","_spender":"The address of the spender"},"returns":{"_0":"The allowance amount"}},"approve(address,uint256)":{"details":"Overrides ERC20 approve to add pause protection","params":{"_amount":"The amount of tokens the spender is allowed to spend","_spender":"The address allowed to spend tokens"},"returns":{"_0":"True if approval succeeded"}},"balanceOf(address)":{"params":{"_account":"The address to query the balance of"},"returns":{"_0":"The balance of the specified address"}},"blacklistTokenUser(address,bool)":{"details":"Requires custom group ID to be enabled (customGroupId != 0)","params":{"_account":"The address of the account to update","_blacklist":"True to blacklist the user from the token user role, false to unblacklist the user from the token user role"}},"burn(address,uint256)":{"params":{"_amount":"The amount of tokens to burn","_from":"The address to burn tokens from"}},"callUpgradeToAndCallUUPS(address,bytes)":{"details":"Intended to be called internally by the contract itself as part of the timelock upgrade flow.      Performs the upgrade to the specified implementation and optionally executes additional setup logic.      Access control is enforced within the internal _callUpgradeToAndCallUUPS function via the `isInternalCall` modifier.","params":{"_data":"Optional initialization calldata to execute on the new implementation after the upgrade.","_newImplementation":"The address of the new implementation contract."}},"cancelUpgrade()":{"custom:emits":"Canceled(bytes32 operationId) when the operation is successfully canceled.","details":"Allows cancellation of a previously scheduled upgrade operation at any time before it is finalized.      Removes the scheduled operation from storage, preventing it from being executed in the future.      If no upgrade is currently scheduled, this function has no effect."},"decimals()":{"returns":{"_0":"The number of decimals"}},"executeUpgrade()":{"custom:reverts":"NoUpgradeScheduled if there is no upgrade operation in progress.TimelockDoesNotExist if the scheduled operation does not exist.TimelockNotReached if the timelock delay has not yet elapsed.","details":"Finalizes the upgrade by executing the operation previously scheduled via `queueUpgrade`.      Checks that the upgrade is authorized and the timelock conditions are met before proceeding.      Upon successful execution, the upgrade operation is cleared from storage."},"forcedTransfer(address,address,uint256)":{"params":{"_amount":"The amount to transfer","_from":"The sender address","_to":"The recipient address (must be TOKEN_USER)"}},"getBundleData()":{"details":"Only works when the configured oracle is an IBundleAggregatorProxy (not a V3 price feed).      Reverts with InvalidOracle if oracle is not set or is an AggregatorV3Interface.      The returned bytes are an opaque payload whose schema depends on the specific feed being queried.      The caller is responsible for decoding the payload according to that feed's documentation.","returns":{"_bundleData":"The raw bundle data bytes","_updatedAt":"The timestamp of the last bundle update"}},"getImplementation()":{"details":"Returns the address stored in the ERC-1967 implementation slot","returns":{"_0":"The address of the current implementation contract"}},"getPermissionManagerAddress()":{"returns":{"_0":"The address of the permission manager, or zero address if not set"}},"getPrice()":{"details":"Only works when the configured oracle is an AggregatorV3Interface (not a bundle feed).      Reverts with InvalidOracle if oracle is not set or is a bundle aggregator.","returns":{"_price":"The latest price as int256 (guaranteed positive)","_updatedAt":"The timestamp of the last price update"}},"getPriceFeedDecimals()":{"details":"Automatically detects if the oracle is an AggregatorV3Interface or IBundleAggregatorProxyFor AggregatorV3Interface, returns a single-element arrayFor IBundleAggregatorProxy, returns the bundleDecimals() array as-isReverts if oracle address is zero","returns":{"_0":"_decimals The decimals array"}},"getPriceFeedDescription()":{"details":"Works with both AggregatorV3Interface and IBundleAggregatorProxy (both have description())Reverts if oracle address is zero","returns":{"_0":"The description string"}},"getScheduledOperationDetails(bytes32)":{"params":{"_operationId":"The unique ID of the scheduled operation"},"returns":{"data":"The calldata to be sent with the call","eta":"The earliest timestamp at which the operation can be executed","target":"The address of the contract to be called","value":"The amount of Ether (in wei) to be sent with the call"}},"initialize(string,string,uint8,string,address,uint256)":{"params":{"_decimals":"The number of decimals for the token","_name":"The name of the token","_permissionManagerAddress":"Address of the permission manager contract","_symbol":"The symbol of the token","_timelockDelaySeconds":"The delay in seconds before upgrades can be executed","_tokenURI":"The URI for the token metadata"}},"isInitialized()":{"returns":{"_0":"Whether the contract has been initialized"}},"isMinterBurner(address)":{"details":"Groups are automatically determined by SygFactory based on this token's address.      Returns true only if the account is whitelisted in at least one group AND not blacklisted      in any group (blacklist supersedes whitelist).","params":{"_account":"The account address to check"},"returns":{"_0":"True if the account is a minter/burner"}},"isOperator(address)":{"details":"Groups are automatically determined by SygFactory based on this token's address.      Returns true only if the account is whitelisted in at least one group AND not blacklisted      in any group (blacklist supersedes whitelist).","params":{"_account":"The account address to check"},"returns":{"_0":"True if the account is an operator"}},"isPaused()":{"returns":{"_0":"Boolean True if the contract is paused, false otherwise"}},"isPauser(address)":{"details":"Groups are automatically determined by SygFactory based on this token's address.      Returns true only if the account is whitelisted in at least one group AND not blacklisted      in any group (blacklist supersedes whitelist).","params":{"_account":"The account address to check"},"returns":{"_0":"True if the account is a pauser"}},"isRoleManager(address)":{"details":"Groups are automatically determined by SygFactory based on this token's address.      Returns true only if the account is whitelisted in at least one group AND not blacklisted      in any group (blacklist supersedes whitelist).","params":{"_account":"The account address to check"},"returns":{"_0":"True if the account is a role manager"}},"isSygTokenImplementation()":{"details":"This function provides a reliable way to check if a contract is a SygToken implementation      without relying on functions that may revert in certain states (like getPriceFeedDecimals      when oracle is not configured). This is used by SygTokenChecker for safe interface detection.","returns":{"_0":"True, indicating this is a SygToken implementation"}},"isSystem(address)":{"details":"Groups are automatically determined by SygFactory based on this token's address.      Returns true only if the account is whitelisted in at least one group AND not blacklisted      in any group (blacklist supersedes whitelist).","params":{"_account":"The account address to check"},"returns":{"_0":"True if the account is a system account"}},"isTokenUser(address)":{"details":"Groups are automatically determined by SygFactory based on this token's address.      Returns true only if the account is whitelisted in at least one group AND not blacklisted      in any group (blacklist supersedes whitelist).","params":{"_account":"The account address to check"},"returns":{"_0":"True if the account is a token user"}},"isTokenUserManager(address)":{"details":"Groups are automatically determined by SygFactory based on this token's address.      Returns true only if the account is whitelisted in at least one group AND not blacklisted      in any group (blacklist supersedes whitelist).","params":{"_account":"The account address to check"},"returns":{"_0":"True if the account is a token user manager"}},"mint(address,uint256)":{"params":{"_amount":"The amount of tokens to mint","_to":"The address to mint tokens to (must be TOKEN_USER)"}},"name()":{"returns":{"_0":"The name of the token"}},"nonces(address)":{"params":{"_account":"The address to query the nonce of"},"returns":{"_0":"The nonce of the specified address"}},"pause()":{"details":"Requires pauser authorization to execute"},"permit(address,address,uint256,uint256,uint8,bytes32,bytes32)":{"details":"Overrides ERC20 permit to add TOKEN_USER check for owner and pause protection","params":{"_deadline":"The timestamp after which the signature is no longer valid","_owner":"The token owner's address","_r":"The first 32 bytes of the signature","_s":"The second 32 bytes of the signature","_spender":"The spender's address","_v":"The recovery byte of the signature","_value":"The amount of tokens to approve"}},"proxiableUUID()":{"details":"Reverts if called through a proxy to prevent bricking","returns":{"_0":"The storage slot used by the implementation"}},"recoverFunds(address,address,uint256)":{"details":"If _token is address(0), recovers native token (ETH), else recovers ERC20 tokens For ERC-20 tokens, the emitted amounts include both the requested amount and the actual amount received, which may differ for fee-on-transfer tokens.","params":{"_amount":"The amount to recover (in wei for native ETH, in token's smallest unit for ERC-20)","_to":"The recipient address","_token":"The token address (zero for native)"}},"setPermissionManagerAddress(address)":{"params":{"_permissionManagerAddress":"The new permission manager address"}},"symbol()":{"returns":{"_0":"The symbol of the token"}},"totalSupply()":{"returns":{"_0":"The total supply of tokens"}},"transfer(address,uint256)":{"details":"Overrides ERC20 transfer to add TOKEN_USER whitelist checks and pause protection","params":{"_amount":"The amount to transfer","_to":"The recipient address"},"returns":{"_0":"True if transfer succeeded"}},"transferFrom(address,address,uint256)":{"details":"Overrides ERC20 transferFrom to add TOKEN_USER whitelist checks and pause protection","params":{"_amount":"The amount to transfer","_from":"The sender address","_to":"The recipient address"},"returns":{"_0":"True if transfer succeeded"}},"unpause()":{"details":"Requires pauser authorization to execute"},"updateMinterBurner(address,bool)":{"params":{"_account":"The address of the account to update","_minterBurner":"True to give minter/burner role to the account, false to remove minter/burner role"}},"updatePricefeedOracleAddress(address)":{"details":"Can be set to zero to disable price feed.","params":{"_newPriceFeedOracleAddress":"The new oracle address (can be zero)"}},"updateTokenURI(string)":{"params":{"_newTokenURI":"The new token URI"}},"updateTokenUser(address,bool)":{"details":"Requires custom group ID to be enabled (customGroupId != 0)","params":{"_account":"The address of the account to update","_tokenUser":"True to give token user role to the account, false to remove token user role"}},"updateTokenUserManager(address,bool)":{"params":{"_account":"The address of the account to update","_tokenUserManager":"True to give token user manager role to the account, false to remove token user manager role"}},"upgradeToAndCall(address,bytes)":{"params":{"_data":"Optional memory to execute after the upgrade.","_newImplementation":"The address of the new implementation contract."}}},"version":1},"userdoc":{"events":{"Canceled(bytes32)":{"notice":"Emitted when an operation is cancelled."},"Executed(bytes32,address,uint256,bytes,uint256)":{"notice":"Emitted when an operation is executed."},"Queued(bytes32,address,uint256,bytes,uint256)":{"notice":"Emitted when an operation is scheduled."}},"kind":"user","methods":{"DOMAIN_SEPARATOR()":{"notice":"Returns the domain separator used in the encoding of the signature for permits (EIP-2612)"},"allowance(address,address)":{"notice":"Returns the remaining number of tokens that spender will be allowed to spend on behalf of owner"},"approve(address,uint256)":{"notice":"Approves a spender to transfer tokens on behalf of caller"},"balanceOf(address)":{"notice":"Returns the amount of tokens owned by account"},"blacklistTokenUser(address,bool)":{"notice":"Blacklist a user from the token user role for a given account by calling SygFactory"},"burn(address,uint256)":{"notice":"Burns tokens from a specified address"},"callUpgradeToAndCallUUPS(address,bytes)":{"notice":"Executes the upgrade to a new implementation with optional initialization data."},"cancelUpgrade()":{"notice":"Cancels a scheduled upgrade operation."},"decimals()":{"notice":"Returns the number of decimals used to get its user representation"},"executeUpgrade()":{"notice":"Executes the scheduled upgrade operation after the timelock delay has elapsed."},"forcedTransfer(address,address,uint256)":{"notice":"Forcefully transfers tokens from any account to a whitelisted receiver"},"getBundleData()":{"notice":"Gets the latest bundle data from an IBundleAggregatorProxy oracle"},"getImplementation()":{"notice":"Returns the current implementation address"},"getPermissionManagerAddress()":{"notice":"Returns the address of the permission manager contract"},"getPrice()":{"notice":"Gets the latest asset price from an AggregatorV3Interface oracle"},"getPriceFeedDecimals()":{"notice":"Gets the number of decimals for the price feed"},"getPriceFeedDescription()":{"notice":"Gets the description of the price feed"},"getScheduledOperationDetails(bytes32)":{"notice":"Returns the details of a scheduled timelock operation"},"initialize(string,string,uint8,string,address,uint256)":{"notice":"Initializes the SygToken contract"},"isInitialized()":{"notice":"Returns the initialization status of the contract"},"isMinterBurner(address)":{"notice":"Checks if an account is a minter/burner"},"isOperator(address)":{"notice":"Checks if an account is an operator"},"isPaused()":{"notice":"Returns whether the contract is paused"},"isPauser(address)":{"notice":"Checks if an account is a pauser"},"isRoleManager(address)":{"notice":"Checks if an account is a role manager"},"isSygTokenImplementation()":{"notice":"Marker function to identify SygToken implementations"},"isSystem(address)":{"notice":"Checks if an account is a system account"},"isTokenUser(address)":{"notice":"Checks if an account is a token user"},"isTokenUserManager(address)":{"notice":"Checks if an account is a token user manager"},"mint(address,uint256)":{"notice":"Mints new tokens to a specified address"},"name()":{"notice":"Returns the name of the token"},"nonces(address)":{"notice":"Returns the current nonce for owner (EIP-2612)"},"pause()":{"notice":"Pauses the contract"},"permit(address,address,uint256,uint256,uint8,bytes32,bytes32)":{"notice":"EIP-2612 permit function to approve spending via signed message"},"proxiableUUID()":{"notice":"Returns the storage slot used by the implementation"},"recoverFunds(address,address,uint256)":{"notice":"Recovers funds from the contract"},"setPermissionManagerAddress(address)":{"notice":"Sets the permission manager address"},"symbol()":{"notice":"Returns the symbol of the token"},"totalSupply()":{"notice":"Returns the amount of tokens in existence"},"transfer(address,uint256)":{"notice":"Transfers tokens from caller to recipient"},"transferFrom(address,address,uint256)":{"notice":"Transfers tokens from one address to another using allowance"},"unpause()":{"notice":"Unpauses the contract"},"updateMinterBurner(address,bool)":{"notice":"Updates the minter/burner status for a given account by calling SygFactory"},"updatePricefeedOracleAddress(address)":{"notice":"Updates the price feed oracle address"},"updateTokenURI(string)":{"notice":"Updates the token URI"},"updateTokenUser(address,bool)":{"notice":"Updates the token user status for a given account by calling SygFactory"},"updateTokenUserManager(address,bool)":{"notice":"Updates the token user manager status for a given account by calling SygFactory"},"upgradeToAndCall(address,bytes)":{"notice":"Upgrades the implementation and optionally executes a function call."}},"version":1}},"settings":{"compilationTarget":{"apps/tokenization/SygToken/contracts/SygToken.sol":"SygToken"},"evmVersion":"prague","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":300},"remappings":[":@chainlink-contracts-1.3.0/=dependencies/@chainlink-contracts-1.3.0/",":@gnosis-pm-safe-contracts-1.3.0/=dependencies/@gnosis-pm-safe-contracts-1.3.0/",":forge-std-1.9.4/=dependencies/forge-std-1.9.4/src/",":forge-std/=dependencies/forge-std-1.9.4/src/",":safe-global-safe-smart-account-1.4.1-3/=dependencies/safe-global-safe-smart-account-1.4.1-3/",":solmate-6.8.0/=dependencies/solmate-6.8.0/"]},"sources":{"apps/tokenization/SygFactory/interfaces/ISygFactory.sol":{"keccak256":"0x871a9cd79df76b39c9a82961e4417c9c90e21e2a68c08272916586a316625d8d","license":"MIT","urls":["bzz-raw://092df8bbe5242b73916a02b4c0b05c3b049df342486a959d06a3025af2312b42","dweb:/ipfs/QmeFfMQNS6EKmdqKkoWztRQBxSgGQo4ufRf7Jtd32Y8idx"]},"apps/tokenization/SygToken/contracts/ChainlinkDataFeed.sol":{"keccak256":"0x5c944b99cf38d5b9e50450e0db374999641fbfadf3476229605e63ab69fbb37b","license":"MIT","urls":["bzz-raw://c627e0a83e83225bf437711d7423fd6126c68f0bb0f0501a06b7bd9abdc4f5f5","dweb:/ipfs/QmUvPddBEm1gqf4Urj1pC8YLt1NzpgkbHujo5mtDhjkNcY"]},"apps/tokenization/SygToken/contracts/ERC20SygToken.sol":{"keccak256":"0xd72c9a040778f24736371f4be7cdd1e78a8fcb9cb88f7fae31242ff63460a730","license":"MIT","urls":["bzz-raw://9c37e84e9351eb64b94ae10f9c6a579b0a7725fdb28251e45fdb802614f0d205","dweb:/ipfs/QmbbksPtmPguJAMCMbixqHfUDhQ8ptUBgHUq8XPnEYamcZ"]},"apps/tokenization/SygToken/contracts/PausableSygToken.sol":{"keccak256":"0x310992ad00552fb666535d43951998f7f0899807138025233bcb6895eab3ae09","license":"MIT","urls":["bzz-raw://3b7a08c500441e3e744c5cfb6cc9b3eaaf5b2fea039e8ad3782e3a204bc85f81","dweb:/ipfs/QmfUmyLvipZGj7xes9LHRrFr5Yu5hwft2VFjMVWaQpyHoJ"]},"apps/tokenization/SygToken/contracts/RolesManager.sol":{"keccak256":"0xbb8f460ba0cc5bf376392ff02fb567380f66e5a73d72e8be7a069c6f76c797c3","license":"MIT","urls":["bzz-raw://af987720a3568a0366ea4891b835b22dc539975bd241600b38dc158516f5f4dd","dweb:/ipfs/QmbeRjXCD6qu1XVrdswE1h9p3o3aqHA6aZTFmsfGB5kbmL"]},"apps/tokenization/SygToken/contracts/SygToken.sol":{"keccak256":"0x24464a2a0e8dd4c60a65a4b3656d9680f2a8eab86b57c5520e16c6c754d65618","license":"MIT","urls":["bzz-raw://83a3340cc325ea3ff3b74d03f31ca00b8ced5eeca2511716e44e6a0ea34dd122","dweb:/ipfs/QmRWHVxb1bNk9HCTBTFHZWJcnHyvy7KDqdborFAQK8z41p"]},"apps/tokenization/SygToken/contracts/storage/StorageLayout.sol":{"keccak256":"0x53b4f1a5eae76a23a856180e7570f85123ef76ee79e5d218edf989046fa58ba9","license":"MIT","urls":["bzz-raw://5c161004e6e9960917a9ae79972ec13b438916bf4d155045281ce42282c35733","dweb:/ipfs/QmZz3H3BcghYP7aXT2MXfXopZFqkBYnotfVqQDDhmiZnHq"]},"apps/tokenization/SygToken/contracts/storage/StorageLayoutV1.sol":{"keccak256":"0x6dda4283ecfb7937a10ea64a12dc260e790c4717bd3f69daba7063dfad9bee15","license":"MIT","urls":["bzz-raw://c3a6eb7afb2267a62e7e21844d4ddcf6b17cc12161d48ebfff1fb7ed95aeab7d","dweb:/ipfs/Qmaq4AUf4wY2J5GhZsMWfZfbPE2PXEfpJGKVtgpeH7vbx9"]},"libs/ERC20/ERC20.sol":{"keccak256":"0x021b7f2c4fd06026fbfeb47c5afb51cb77e5b2d2d3695922cc8ebc141478bfe6","license":"AGPL-3.0-only","urls":["bzz-raw://2d0c3c10fe6d5206a4cace3fb0c42b0425dbd0917c193bfca9a606112b7a1e9f","dweb:/ipfs/QmXtJs3y7axG8Jr8CY3sW3VmPWc9FHSnynouS9RWL12AAF"]},"libs/ERC20/ERC20Core.sol":{"keccak256":"0x6282eefdd68ef4317a9e92888f048352d4263665e0d86ae6da2af8115118452d","license":"AGPL-3.0-only","urls":["bzz-raw://014f5eb6c946a987d500e1398ef380f663cbd9c8532cb050217066ed2df0b297","dweb:/ipfs/Qmczh8G1HECjyRUkU3HiDTyWQ8ZNqr5cHvH7Ae8K7fCgch"]},"libs/ERC20/ERC20View.sol":{"keccak256":"0x476e9f605764d451609465ac12aa3fb80d6cb4b186617fcb2bffa49b4c5f1c31","license":"AGPL-3.0-only","urls":["bzz-raw://9e78df5953f810010542883174cd37ef3d8134d2e1f2f1c8fd41819d6cf37570","dweb:/ipfs/QmdyEzVebm8KcTTCYYyiFkwUspsiF4cbhkFVt32wyedC8k"]},"libs/ERC20/interfaces/IERC20.sol":{"keccak256":"0x42db71c052fb5034880609d4d6a13ae583813c070583bc955fb7ca40aadf0956","license":"MIT","urls":["bzz-raw://69ff0931e67efec758f35f2c6cd1d942b49c7e0593ff2c45cf71045b8366bf31","dweb:/ipfs/QmfP8MLR4toXGFJgVSMv4AUCuUZHhi4CNt5zXs2ptMcBZs"]},"libs/FundRecovery/FundRecoveryCore.sol":{"keccak256":"0x71bcc7205bef72d275a3bbe5873ec3fbb18fe851d0ca0e0ba8294c698ace761b","license":"MIT","urls":["bzz-raw://ab75bb0d105c45895c6ea7a3fb1b1080064861447d04735c6f2752f85da89241","dweb:/ipfs/QmXTu3BRr5u3D1GFHHhBMVZDsP72tSk7z7EMWK7uYWkAe4"]},"libs/Initializable/Initializable.sol":{"keccak256":"0x792fcf47ddbd94cc497211655f7ba565045f7843e4760e0372e4404c3e5982aa","license":"UNLICENSED","urls":["bzz-raw://63958cd8e14c358d6c474c8c5e9418a93535915f554acf0300571a8595e353f2","dweb:/ipfs/QmRwtEbryowmucSSwgnHJXWr7VrayVFAChrgA1MXXSduGR"]},"libs/Initializable/InitializableCore.sol":{"keccak256":"0x98310b0e87da9b1d2ced673743e2d14e2951a5c2be56b9475d2b637c4285737e","license":"UNLICENSED","urls":["bzz-raw://687070c74a9f8ea3c4139e7d07ef665a043fbd7946121c29a8ddd9b0cfff503c","dweb:/ipfs/QmQopkJwD3rnVENHKVKzkvNNW2JzG8AG4nFngoNoCBfeFz"]},"libs/Initializable/InitializableView.sol":{"keccak256":"0x1664897cb0d126efe0d1a0f9148c6096de1dd836f9c4f66e9d6e133fb8ab722b","license":"UNLICENSED","urls":["bzz-raw://3e18dc0fb78b705ae8dfc92df337a6b3f7d989c074028e1587964eaba6e279a0","dweb:/ipfs/Qmb5y6rw6Thbw6QetErP6i3VHxtenzuH3x6w4daUh1HoyX"]},"libs/Pausable/PausableCore.sol":{"keccak256":"0x07d4e1bb7b6df2bc789e7b79c9659fdfd13096f898964de0df499291727904a3","license":"MIT","urls":["bzz-raw://addf8fd5e689aae404ad86f631f2d2ed8e0207b0a5db1770c4a8ee3c88473d2d","dweb:/ipfs/QmWpNaK8cG4nNTfVnYRc7rzHmakXzeYs7L2vBVxmL2ba7K"]},"libs/Pausable/interfaces/IPausable.sol":{"keccak256":"0xac8fb6d60213ac590e0c92e8035568a8129fbf2f87ca97098c4456249f991648","license":"MIT","urls":["bzz-raw://a2014a4d845dffb71e7e9d8fb866fc5129c986e331598fbd7f20e5ebd591c5cb","dweb:/ipfs/QmPPW7CAtyiZoHr78tvK3jSJasSRQ2Z9hCTR3AxhtzE8qy"]},"libs/Permissioned/Permissioned.sol":{"keccak256":"0x7f8977cbf68bc705adebceabec03cf746ef770e14342ca95828accb79f94364b","license":"MIT","urls":["bzz-raw://02bda7704daca86ce5211e2c110950ed630c62b28f8ef373371c860de4e41d0b","dweb:/ipfs/QmPxmEPs1h8jsDuWRCRhR6gui9bvdcvXhiQCfVhCdypux6"]},"libs/Permissioned/PermissionedCore.sol":{"keccak256":"0x5649b87e6ec3f0708522f7c29ff4417b0cb5c55ee1ee246fa0e561334e56ad73","license":"MIT","urls":["bzz-raw://c673a789594c9f7ef6865a578f5bfb4db35b480cd188b538327f83e8603a3cba","dweb:/ipfs/QmUhHgfarfPScQqHLNTdbbzwfVUQed6pupggv45sP3yAHY"]},"libs/Permissioned/PermissionedView.sol":{"keccak256":"0x284be39a83b5045b25621168b35d1bf4aca24f6894901b6daee5b9005f71fece","license":"MIT","urls":["bzz-raw://8102e72060c60b40c5a4b5b6df29a1162fbbf37c46d54eb42161ecfe1594eaa6","dweb:/ipfs/QmNufyhu4Lc5LPTUuAYsJt7SjAWbEwNiaBKobFj6S9jic1"]},"libs/Timelock/Timelock.sol":{"keccak256":"0x2b83442be65661f6b3dc93ee9077d2a79e07c02e252a4902784a0ce90eb6c9cf","license":"UNLICENSED","urls":["bzz-raw://41eb97168ca4aeac7a4df944d110481faaa9b390f1886b0a071d8eb077181e85","dweb:/ipfs/QmZ88CEgGxkMfy9uAKjzQ3Phym8Ha6WwVDeoyGHedY2kpW"]},"libs/Timelock/TimelockCore.sol":{"keccak256":"0x3189d504d1315f9e5f849827590f5ecdfd2c390988e14b84f6128ab4aa5c54f8","license":"UNLICENSED","urls":["bzz-raw://d15bd0c5272203a2a8086b3250c61545a481d00e67828730731a72a764e11361","dweb:/ipfs/QmY95WqHu75zu9d7ipS1v5W9WSRoec5VUY81u4bqUByFyP"]},"libs/Timelock/TimelockView.sol":{"keccak256":"0xb772a41e65958d13f377bf4f9f0a4dfeb399d446d749ab95f57e8f29e6c64a0f","license":"UNLICENSED","urls":["bzz-raw://f1be1ff416c11164c00d04cc67a426018a7ed5bbf9c55894d35175b0e90dfac6","dweb:/ipfs/QmfDJygKTEnoWN3S99RkqxKiiY1urZJhxQoWd37iJqeKZd"]},"libs/UUPS/UUPSTimelockUpgradeable.sol":{"keccak256":"0xd15ce193bf7df819e0c69de76152bf51b496fe22e32c2cd3bd8ccd20708fc282","license":"UNLICENSED","urls":["bzz-raw://d4bee663eca36ab919be0af8ffc34ab554dbd930e26724444ffb9f097d832794","dweb:/ipfs/QmYAhW9F4L7AcMczyby7JpCf3Eqmk4pn4g5zo5VApcKmv7"]},"libs/UUPS/UUPSTimelockUpgradeableCore.sol":{"keccak256":"0x9bc4febac6a0f339ec67f470947728e121add0fb1a5ffc4270cca8009cf054cc","license":"UNLICENSED","urls":["bzz-raw://a342890c759d1b34690836514329f9d1b26b3a6a5b5e12a493c3d3c02ca1f9de","dweb:/ipfs/QmV6dxf4Qshj1E272dH8ZJEPCGgZeLSBF7dV9YBLigqcR4"]},"libs/UUPS/UUPSTimelockUpgradeableView.sol":{"keccak256":"0x0c885f7aa18f08e521cc3d008928ace06f332f9e80714255045ffa6b714681c9","license":"UNLICENSED","urls":["bzz-raw://898beda9daee3f48655ab568ac3e8473688ca161912cc9f21e28a4aad59a9ab7","dweb:/ipfs/QmdjdEBnVhBZjCnD6KXXR5ZEk58tg3Yi4afdMhogC2qdrs"]},"libs/UUPS/UUPSUpgradeableCore.sol":{"keccak256":"0x7b05e5e3f77c0a1b9665da790cf9fd6e943b0f7581c5e5bf0224b72abd2f2b4e","license":"UNLICENSED","urls":["bzz-raw://95348e083b59220fac8ed3a3103975da7402930ca854e34e6a2080524e4424e7","dweb:/ipfs/QmQCYaPnT7EgsN1i62AhyPNGBJdEHxPfRbZ4WaYSKTyNZd"]},"libs/UUPS/UUPSUtils.sol":{"keccak256":"0xdf64f08be5ecd0067461507295c023794e86c193698dd58388eee89f21035dc8","license":"UNLICENSED","urls":["bzz-raw://4404c56390edbb6559853bd312e70a35222a01a84349df95b419e1612e9a12ed","dweb:/ipfs/QmZnwdxCGaZtTKBdKpKvhhCdBFVjAoqj5ZCHHjDiFpKdTf"]},"libs/UUPS/interface/IERC1822.sol":{"keccak256":"0x516c2481a3e6137447a3fa6aafc7c5e19a52563c9e3706b88a99f1cabf25b3a3","license":"UNLICENSED","urls":["bzz-raw://98676562c44dfe01451330529c1ca9bdce3dc615836a7cc127df2ac5ffeb2cc6","dweb:/ipfs/QmQgSyhCi41C2sNCwjVSwEPWtwmSxmqBNAcSD8x1jA6jR9"]},"libs/UUPS/interface/IERC1967.sol":{"keccak256":"0x20d04b7f75be1292dc90df36cddda12aaffa0a1cfff3a2e05abbb3a4daa9112a","license":"UNLICENSED","urls":["bzz-raw://bc9e462195d994f013d13fa052c594030dbd19492dcc278f2df3b3ed50678633","dweb:/ipfs/QmcWZnXpYeiXUDgJGS5pTaMYHbaeq4DaMr5zRGJFNFZtXT"]},"libs/UUPS/interface/IUUPSAsynchronousUpgradeable.sol":{"keccak256":"0xd1b8afd41edfef524620b6da0843e717b390a4090ef226327df4020cbc45ecc6","license":"MIT","urls":["bzz-raw://b2a717c5cda2b487c7a747979c291ef86ac1c7170e7c6461eb7407a95db6e4af","dweb:/ipfs/QmUDyyrV52xrKLX36BANiJWkE1CDZ2V2LAvsPERPsNoVd2"]},"libs/UUPS/interface/IUUPSSynchronousUpgradeable.sol":{"keccak256":"0x893f2ad223fd5f3885fdf6031868f96306c81fdaef3634d9980fdecf7c85e8dd","license":"MIT","urls":["bzz-raw://c26c8134b117640438aa068f35b34b318591f1907888d9b2ba80409c380bda51","dweb:/ipfs/Qmbd4c8SPAMgLHG1qE61MEsSjPZw8hJ9pV9kzB4rovNHuN"]},"libs/external/chainlink-evm/contracts/src/v0.8/data-feeds/interfaces/IBundleAggregatorProxy.sol":{"keccak256":"0xe8e76227569495fb92a78c0147d1f29f79b898324964592b35955f8bab991fe1","license":"MIT","urls":["bzz-raw://da3f0c12c070b5c50415b48f82f99f4103192b9319bb5644a250bf5ea43408e7","dweb:/ipfs/QmXB9xYr5ryWiVPyRytfYgT77TxEfv2RRW7rDRe8x9z46o"]},"libs/external/chainlink-evm/contracts/src/v0.8/data-feeds/interfaces/IBundleBaseAggregator.sol":{"keccak256":"0x1a5a387e40b4feed8669a741045b7c840785c0a38f20bf39b81175d90372e4d1","license":"MIT","urls":["bzz-raw://f1273aaca70c6791ff0b161394e9cfb86cf96120d3a0501a1f2199262d731b57","dweb:/ipfs/QmVkyre8NVmTpvPEf4r8NGVyEZSAzYCpsMTmymdF1p2VEP"]},"libs/external/chainlink-evm/contracts/src/v0.8/data-feeds/interfaces/ICommonAggregator.sol":{"keccak256":"0xa663405601c73448f3e4357ff1621c17af12d8b1b12fd102dc88ed2e7d2cafc1","license":"MIT","urls":["bzz-raw://19db634eaaef286716b72517eb29257f93ac87002068e5d3a797557a0bb2efae","dweb:/ipfs/QmaQRcLsc9BumatBijok6hchuanhFPeicjiTruG1t5xoNc"]},"libs/external/chainlink-local/src/data-feeds/interfaces/AggregatorV3Interface.sol":{"keccak256":"0x2109ef309663ddc8789bf7ae3baf11d4ca7a62a549c72a3d9d0976de709ce5a5","license":"MIT","urls":["bzz-raw://d03dedacdcc03bccde9cffb22920c7f292dda1f592a983ec16c5f113439a7e9d","dweb:/ipfs/QmW7CtFT6gqXnXs1CAViCua4VDPuwStMhxPxD45BqaP9XX"]},"libs/utils/bytes/BytesLib.sol":{"keccak256":"0xf2e133b716e0d9700427fbfe44089fe11b6924d41fd12eadbc5ff30287c772d2","license":"UNLICENSED","urls":["bzz-raw://efa7599b4c3ce297a8c6d9fc05902128343d0c0e363558fc9115f94b73b7ee6f","dweb:/ipfs/QmTHbQUzYWnh1FL2DWdCwh2qUc98aCQhy13NhqvNFN6Kpv"]}},"version":1},"storageLayout":{"types":{"t_address":{"label":"address","encoding":"inplace","numberOfBytes":"20"},"t_string_storage":{"label":"string","encoding":"bytes","numberOfBytes":"32"}},"storage":[{"slot":"0","type":"t_string_storage","astId":1388,"label":"getTokenURI","offset":0,"contract":"apps/tokenization/SygToken/contracts/SygToken.sol:SygToken"},{"slot":"1","type":"t_address","astId":1390,"label":"getPriceFeedOracleAddress","offset":0,"contract":"apps/tokenization/SygToken/contracts/SygToken.sol:SygToken"}]},"transientStorageLayout":{"types":null,"storage":[]},"userdoc":{"kind":"user","events":{"Canceled(bytes32)":{"notice":"Emitted when an operation is cancelled."},"Queued(bytes32,address,uint256,bytes,uint256)":{"notice":"Emitted when an operation is scheduled."},"Executed(bytes32,address,uint256,bytes,uint256)":{"notice":"Emitted when an operation is executed."}},"methods":{"name()":{"notice":"Returns the name of the token"},"pause()":{"notice":"Pauses the contract"},"symbol()":{"notice":"Returns the symbol of the token"},"unpause()":{"notice":"Unpauses the contract"},"decimals()":{"notice":"Returns the number of decimals used to get its user representation"},"getPrice()":{"notice":"Gets the latest asset price from an AggregatorV3Interface oracle"},"isPaused()":{"notice":"Returns whether the contract is paused"},"totalSupply()":{"notice":"Returns the amount of tokens in existence"},"cancelUpgrade()":{"notice":"Cancels a scheduled upgrade operation."},"getBundleData()":{"notice":"Gets the latest bundle data from an IBundleAggregatorProxy oracle"},"isInitialized()":{"notice":"Returns the initialization status of the contract"},"nonces(address)":{"notice":"Returns the current nonce for owner (EIP-2612)"},"proxiableUUID()":{"notice":"Returns the storage slot used by the implementation"},"executeUpgrade()":{"notice":"Executes the scheduled upgrade operation after the timelock delay has elapsed."},"isPauser(address)":{"notice":"Checks if an account is a pauser"},"isSystem(address)":{"notice":"Checks if an account is a system account"},"DOMAIN_SEPARATOR()":{"notice":"Returns the domain separator used in the encoding of the signature for permits (EIP-2612)"},"balanceOf(address)":{"notice":"Returns the amount of tokens owned by account"},"getImplementation()":{"notice":"Returns the current implementation address"},"isOperator(address)":{"notice":"Checks if an account is an operator"},"isTokenUser(address)":{"notice":"Checks if an account is a token user"},"burn(address,uint256)":{"notice":"Burns tokens from a specified address"},"mint(address,uint256)":{"notice":"Mints new tokens to a specified address"},"getPriceFeedDecimals()":{"notice":"Gets the number of decimals for the price feed"},"isRoleManager(address)":{"notice":"Checks if an account is a role manager"},"updateTokenURI(string)":{"notice":"Updates the token URI"},"isMinterBurner(address)":{"notice":"Checks if an account is a minter/burner"},"approve(address,uint256)":{"notice":"Approves a spender to transfer tokens on behalf of caller"},"getPriceFeedDescription()":{"notice":"Gets the description of the price feed"},"transfer(address,uint256)":{"notice":"Transfers tokens from caller to recipient"},"allowance(address,address)":{"notice":"Returns the remaining number of tokens that spender will be allowed to spend on behalf of owner"},"isSygTokenImplementation()":{"notice":"Marker function to identify SygToken implementations"},"isTokenUserManager(address)":{"notice":"Checks if an account is a token user manager"},"getPermissionManagerAddress()":{"notice":"Returns the address of the permission manager contract"},"updateTokenUser(address,bool)":{"notice":"Updates the token user status for a given account by calling SygFactory"},"upgradeToAndCall(address,bytes)":{"notice":"Upgrades the implementation and optionally executes a function call."},"blacklistTokenUser(address,bool)":{"notice":"Blacklist a user from the token user role for a given account by calling SygFactory"},"updateMinterBurner(address,bool)":{"notice":"Updates the minter/burner status for a given account by calling SygFactory"},"setPermissionManagerAddress(address)":{"notice":"Sets the permission manager address"},"updateTokenUserManager(address,bool)":{"notice":"Updates the token user manager status for a given account by calling SygFactory"},"getScheduledOperationDetails(bytes32)":{"notice":"Returns the details of a scheduled timelock operation"},"recoverFunds(address,address,uint256)":{"notice":"Recovers funds from the contract"},"transferFrom(address,address,uint256)":{"notice":"Transfers tokens from one address to another using allowance"},"updatePricefeedOracleAddress(address)":{"notice":"Updates the price feed oracle address"},"callUpgradeToAndCallUUPS(address,bytes)":{"notice":"Executes the upgrade to a new implementation with optional initialization data."},"forcedTransfer(address,address,uint256)":{"notice":"Forcefully transfers tokens from any account to a whitelisted receiver"},"initialize(string,string,uint8,string,address,uint256)":{"notice":"Initializes the SygToken contract"},"permit(address,address,uint256,uint256,uint8,bytes32,bytes32)":{"notice":"EIP-2612 permit function to approve spending via signed message"}},"version":1},"devdoc":{"kind":"dev","events":{"Canceled(bytes32)":{"params":{"operationId":"The unique ID of the operation."}},"Upgraded(address)":{"params":{"implementation":"The address of the new implementation."},"details":"Emitted when the implementation is upgraded."},"Queued(bytes32,address,uint256,bytes,uint256)":{"params":{"eta":"The timestamp (in seconds since Unix epoch) after which the operation can be executed.","data":"The data to send with the call (ABI-encoded function arguments).","value":"The amount of Ether (in wei) to send with the call.","target":"The address of the contract to call.","operationId":"The unique ID of the operation."}},"Executed(bytes32,address,uint256,bytes,uint256)":{"params":{"data":"The data that was sent with the call.","value":"The amount of Ether (in wei) that was sent with the call.","target":"The address of the contract that was called.","timestamp":"The timestamp (in seconds since Unix epoch) when the operation is executed.","operationId":"The unique ID of the operation."}}},"methods":{"name()":{"returns":{"_0":"The name of the token"}},"pause()":{"details":"Requires pauser authorization to execute"},"symbol()":{"returns":{"_0":"The symbol of the token"}},"unpause()":{"details":"Requires pauser authorization to execute"},"decimals()":{"returns":{"_0":"The number of decimals"}},"getPrice()":{"details":"Only works when the configured oracle is an AggregatorV3Interface (not a bundle feed).      Reverts with InvalidOracle if oracle is not set or is a bundle aggregator.","returns":{"_price":"The latest price as int256 (guaranteed positive)","_updatedAt":"The timestamp of the last price update"}},"isPaused()":{"returns":{"_0":"Boolean True if the contract is paused, false otherwise"}},"totalSupply()":{"returns":{"_0":"The total supply of tokens"}},"cancelUpgrade()":{"details":"Allows cancellation of a previously scheduled upgrade operation at any time before it is finalized.      Removes the scheduled operation from storage, preventing it from being executed in the future.      If no upgrade is currently scheduled, this function has no effect.","custom:emits":"Canceled(bytes32 operationId) when the operation is successfully canceled."},"getBundleData()":{"details":"Only works when the configured oracle is an IBundleAggregatorProxy (not a V3 price feed).      Reverts with InvalidOracle if oracle is not set or is an AggregatorV3Interface.      The returned bytes are an opaque payload whose schema depends on the specific feed being queried.      The caller is responsible for decoding the payload according to that feed's documentation.","returns":{"_updatedAt":"The timestamp of the last bundle update","_bundleData":"The raw bundle data bytes"}},"isInitialized()":{"returns":{"_0":"Whether the contract has been initialized"}},"nonces(address)":{"params":{"_account":"The address to query the nonce of"},"returns":{"_0":"The nonce of the specified address"}},"proxiableUUID()":{"details":"Reverts if called through a proxy to prevent bricking","returns":{"_0":"The storage slot used by the implementation"}},"executeUpgrade()":{"details":"Finalizes the upgrade by executing the operation previously scheduled via `queueUpgrade`.      Checks that the upgrade is authorized and the timelock conditions are met before proceeding.      Upon successful execution, the upgrade operation is cleared from storage.","custom:reverts":"NoUpgradeScheduled if there is no upgrade operation in progress.TimelockDoesNotExist if the scheduled operation does not exist.TimelockNotReached if the timelock delay has not yet elapsed."},"isPauser(address)":{"params":{"_account":"The account address to check"},"details":"Groups are automatically determined by SygFactory based on this token's address.      Returns true only if the account is whitelisted in at least one group AND not blacklisted      in any group (blacklist supersedes whitelist).","returns":{"_0":"True if the account is a pauser"}},"isSystem(address)":{"params":{"_account":"The account address to check"},"details":"Groups are automatically determined by SygFactory based on this token's address.      Returns true only if the account is whitelisted in at least one group AND not blacklisted      in any group (blacklist supersedes whitelist).","returns":{"_0":"True if the account is a system account"}},"DOMAIN_SEPARATOR()":{"returns":{"_0":"The domain separator hash"}},"balanceOf(address)":{"params":{"_account":"The address to query the balance of"},"returns":{"_0":"The balance of the specified address"}},"getImplementation()":{"details":"Returns the address stored in the ERC-1967 implementation slot","returns":{"_0":"The address of the current implementation contract"}},"isOperator(address)":{"params":{"_account":"The account address to check"},"details":"Groups are automatically determined by SygFactory based on this token's address.      Returns true only if the account is whitelisted in at least one group AND not blacklisted      in any group (blacklist supersedes whitelist).","returns":{"_0":"True if the account is an operator"}},"isTokenUser(address)":{"params":{"_account":"The account address to check"},"details":"Groups are automatically determined by SygFactory based on this token's address.      Returns true only if the account is whitelisted in at least one group AND not blacklisted      in any group (blacklist supersedes whitelist).","returns":{"_0":"True if the account is a token user"}},"burn(address,uint256)":{"params":{"_from":"The address to burn tokens from","_amount":"The amount of tokens to burn"}},"mint(address,uint256)":{"params":{"_to":"The address to mint tokens to (must be TOKEN_USER)","_amount":"The amount of tokens to mint"}},"getPriceFeedDecimals()":{"details":"Automatically detects if the oracle is an AggregatorV3Interface or IBundleAggregatorProxyFor AggregatorV3Interface, returns a single-element arrayFor IBundleAggregatorProxy, returns the bundleDecimals() array as-isReverts if oracle address is zero","returns":{"_0":"_decimals The decimals array"}},"isRoleManager(address)":{"params":{"_account":"The account address to check"},"details":"Groups are automatically determined by SygFactory based on this token's address.      Returns true only if the account is whitelisted in at least one group AND not blacklisted      in any group (blacklist supersedes whitelist).","returns":{"_0":"True if the account is a role manager"}},"updateTokenURI(string)":{"params":{"_newTokenURI":"The new token URI"}},"isMinterBurner(address)":{"params":{"_account":"The account address to check"},"details":"Groups are automatically determined by SygFactory based on this token's address.      Returns true only if the account is whitelisted in at least one group AND not blacklisted      in any group (blacklist supersedes whitelist).","returns":{"_0":"True if the account is a minter/burner"}},"approve(address,uint256)":{"params":{"_amount":"The amount of tokens the spender is allowed to spend","_spender":"The address allowed to spend tokens"},"details":"Overrides ERC20 approve to add pause protection","returns":{"_0":"True if approval succeeded"}},"getPriceFeedDescription()":{"details":"Works with both AggregatorV3Interface and IBundleAggregatorProxy (both have description())Reverts if oracle address is zero","returns":{"_0":"The description string"}},"transfer(address,uint256)":{"params":{"_to":"The recipient address","_amount":"The amount to transfer"},"details":"Overrides ERC20 transfer to add TOKEN_USER whitelist checks and pause protection","returns":{"_0":"True if transfer succeeded"}},"allowance(address,address)":{"params":{"_owner":"The address of the token owner","_spender":"The address of the spender"},"returns":{"_0":"The allowance amount"}},"isSygTokenImplementation()":{"details":"This function provides a reliable way to check if a contract is a SygToken implementation      without relying on functions that may revert in certain states (like getPriceFeedDecimals      when oracle is not configured). This is used by SygTokenChecker for safe interface detection.","returns":{"_0":"True, indicating this is a SygToken implementation"}},"isTokenUserManager(address)":{"params":{"_account":"The account address to check"},"details":"Groups are automatically determined by SygFactory based on this token's address.      Returns true only if the account is whitelisted in at least one group AND not blacklisted      in any group (blacklist supersedes whitelist).","returns":{"_0":"True if the account is a token user manager"}},"getPermissionManagerAddress()":{"returns":{"_0":"The address of the permission manager, or zero address if not set"}},"updateTokenUser(address,bool)":{"params":{"_account":"The address of the account to update","_tokenUser":"True to give token user role to the account, false to remove token user role"},"details":"Requires custom group ID to be enabled (customGroupId != 0)"},"upgradeToAndCall(address,bytes)":{"params":{"_data":"Optional memory to execute after the upgrade.","_newImplementation":"The address of the new implementation contract."}},"blacklistTokenUser(address,bool)":{"params":{"_account":"The address of the account to update","_blacklist":"True to blacklist the user from the token user role, false to unblacklist the user from the token user role"},"details":"Requires custom group ID to be enabled (customGroupId != 0)"},"updateMinterBurner(address,bool)":{"params":{"_account":"The address of the account to update","_minterBurner":"True to give minter/burner role to the account, false to remove minter/burner role"}},"setPermissionManagerAddress(address)":{"params":{"_permissionManagerAddress":"The new permission manager address"}},"updateTokenUserManager(address,bool)":{"params":{"_account":"The address of the account to update","_tokenUserManager":"True to give token user manager role to the account, false to remove token user manager role"}},"getScheduledOperationDetails(bytes32)":{"params":{"_operationId":"The unique ID of the scheduled operation"},"returns":{"eta":"The earliest timestamp at which the operation can be executed","data":"The calldata to be sent with the call","value":"The amount of Ether (in wei) to be sent with the call","target":"The address of the contract to be called"}},"recoverFunds(address,address,uint256)":{"params":{"_to":"The recipient address","_token":"The token address (zero for native)","_amount":"The amount to recover (in wei for native ETH, in token's smallest unit for ERC-20)"},"details":"If _token is address(0), recovers native token (ETH), else recovers ERC20 tokens For ERC-20 tokens, the emitted amounts include both the requested amount and the actual amount received, which may differ for fee-on-transfer tokens."},"transferFrom(address,address,uint256)":{"params":{"_to":"The recipient address","_from":"The sender address","_amount":"The amount to transfer"},"details":"Overrides ERC20 transferFrom to add TOKEN_USER whitelist checks and pause protection","returns":{"_0":"True if transfer succeeded"}},"updatePricefeedOracleAddress(address)":{"params":{"_newPriceFeedOracleAddress":"The new oracle address (can be zero)"},"details":"Can be set to zero to disable price feed."},"callUpgradeToAndCallUUPS(address,bytes)":{"params":{"_data":"Optional initialization calldata to execute on the new implementation after the upgrade.","_newImplementation":"The address of the new implementation contract."},"details":"Intended to be called internally by the contract itself as part of the timelock upgrade flow.      Performs the upgrade to the specified implementation and optionally executes additional setup logic.      Access control is enforced within the internal _callUpgradeToAndCallUUPS function via the `isInternalCall` modifier."},"forcedTransfer(address,address,uint256)":{"params":{"_to":"The recipient address (must be TOKEN_USER)","_from":"The sender address","_amount":"The amount to transfer"}},"initialize(string,string,uint8,string,address,uint256)":{"params":{"_name":"The name of the token","_symbol":"The symbol of the token","_decimals":"The number of decimals for the token","_tokenURI":"The URI for the token metadata","_timelockDelaySeconds":"The delay in seconds before upgrades can be executed","_permissionManagerAddress":"Address of the permission manager contract"}},"permit(address,address,uint256,uint256,uint8,bytes32,bytes32)":{"params":{"_r":"The first 32 bytes of the signature","_s":"The second 32 bytes of the signature","_v":"The recovery byte of the signature","_owner":"The token owner's address","_value":"The amount of tokens to approve","_spender":"The spender's address","_deadline":"The timestamp after which the signature is no longer valid"},"details":"Overrides ERC20 permit to add TOKEN_USER check for owner and pause protection"}},"version":1,"custom:security-contact":"blockchain@sygnum.com"},"sourceIds":{"libs/ERC20/ERC20.sol":{"id":8},"libs/UUPS/UUPSUtils.sol":{"id":28},"libs/ERC20/ERC20Core.sol":{"id":9},"libs/ERC20/ERC20View.sol":{"id":10},"libs/Timelock/Timelock.sol":{"id":21},"libs/utils/bytes/BytesLib.sol":{"id":37},"libs/Pausable/PausableCore.sol":{"id":16},"libs/Timelock/TimelockCore.sol":{"id":22},"libs/Timelock/TimelockView.sol":{"id":23},"libs/ERC20/interfaces/IERC20.sol":{"id":11},"libs/UUPS/interface/IERC1822.sol":{"id":29},"libs/UUPS/interface/IERC1967.sol":{"id":30},"libs/UUPS/UUPSUpgradeableCore.sol":{"id":27},"libs/Permissioned/Permissioned.sol":{"id":18},"libs/Initializable/Initializable.sol":{"id":13},"libs/UUPS/UUPSTimelockUpgradeable.sol":{"id":24},"libs/FundRecovery/FundRecoveryCore.sol":{"id":12},"libs/Pausable/interfaces/IPausable.sol":{"id":17},"libs/Permissioned/PermissionedCore.sol":{"id":19},"libs/Permissioned/PermissionedView.sol":{"id":20},"libs/Initializable/InitializableCore.sol":{"id":14},"libs/Initializable/InitializableView.sol":{"id":15},"libs/UUPS/UUPSTimelockUpgradeableCore.sol":{"id":25},"libs/UUPS/UUPSTimelockUpgradeableView.sol":{"id":26},"apps/tokenization/SygToken/contracts/SygToken.sol":{"id":5},"libs/UUPS/interface/IUUPSSynchronousUpgradeable.sol":{"id":32},"libs/UUPS/interface/IUUPSAsynchronousUpgradeable.sol":{"id":31},"apps/tokenization/SygToken/contracts/RolesManager.sol":{"id":4},"apps/tokenization/SygToken/contracts/ERC20SygToken.sol":{"id":2},"apps/tokenization/SygFactory/interfaces/ISygFactory.sol":{"id":0},"apps/tokenization/SygToken/contracts/PausableSygToken.sol":{"id":3},"apps/tokenization/SygToken/contracts/ChainlinkDataFeed.sol":{"id":1},"apps/tokenization/SygToken/contracts/storage/StorageLayout.sol":{"id":6},"apps/tokenization/SygToken/contracts/storage/StorageLayoutV1.sol":{"id":7},"libs/external/chainlink-local/src/data-feeds/interfaces/AggregatorV3Interface.sol":{"id":36},"libs/external/chainlink-evm/contracts/src/v0.8/data-feeds/interfaces/ICommonAggregator.sol":{"id":35},"libs/external/chainlink-evm/contracts/src/v0.8/data-feeds/interfaces/IBundleBaseAggregator.sol":{"id":34},"libs/external/chainlink-evm/contracts/src/v0.8/data-feeds/interfaces/IBundleAggregatorProxy.sol":{"id":33}},"additionalInput":null,"stdJsonInput":{"sources":{"libs/ERC20/ERC20.sol":{"content":"// SPDX-License-Identifier: AGPL-3.0-only\npragma solidity >=0.8.0;\n\nimport {ERC20View} from \"libs/ERC20/ERC20View.sol\";\n\n/**\n * @custom:security-contact blockchain@sygnum.com\n * @title ERC20\n * @author SYGNUM AG - Blockchain team 3301\n * @dev Standard ERC20 implementation that extends ERC20View\n * and exposes the basic ERC20 interface functions.\n */\ncontract ERC20 is ERC20View {\n    /*//////////////////////////////////////////////////////////////\n                        EXTERNAL/PUBLIC FUNCTIONS\n    //////////////////////////////////////////////////////////////*/\n\n    /**\n     * @dev Approves the spender to spend tokens on behalf of the caller.\n     * @param _spender The address allowed to spend tokens\n     * @param _amount The amount of tokens the spender is allowed to spend\n     * @return A boolean indicating whether the operation succeeded\n     */\n    function approve(address _spender, uint256 _amount) public virtual returns (bool) {\n        return _approve(msg.sender, _spender, _amount);\n    }\n\n    /**\n     * @dev Transfers tokens from the caller to the recipient.\n     * @param _to The address to transfer tokens to\n     * @param _amount The amount of tokens to transfer\n     * @return A boolean indicating whether the operation succeeded\n     */\n    function transfer(address _to, uint256 _amount) public virtual returns (bool) {\n        return _transfer(msg.sender, _to, _amount);\n    }\n\n    /**\n     * @dev Transfers tokens from one address to another using the allowance mechanism.\n     * @param _from The address to transfer tokens from\n     * @param _to The address to transfer tokens to\n     * @param _amount The amount of tokens to transfer\n     * @return A boolean indicating whether the operation succeeded\n     */\n    function transferFrom(\n        address _from,\n        address _to,\n        uint256 _amount\n    ) public virtual returns (bool) {\n        return _transferFrom(_from, _to, _amount);\n    }\n\n    /**\n     * @dev EIP-2612 permit function to approve spending via signed message.\n     * @param _owner The token owner's address\n     * @param _spender The spender's address\n     * @param _value The amount of tokens to approve\n     * @param _deadline The timestamp after which the signature is no longer valid\n     * @param _v The recovery byte of the signature\n     * @param _r The first 32 bytes of the signature\n     * @param _s The second 32 bytes of the signature\n     */\n    function permit(\n        address _owner,\n        address _spender,\n        uint256 _value,\n        uint256 _deadline,\n        uint8 _v,\n        bytes32 _r,\n        bytes32 _s\n    ) public virtual {\n        _permit(_owner, _spender, _value, _deadline, _v, _r, _s);\n    }\n}\n"},"libs/UUPS/UUPSUtils.sol":{"content":"// SPDX-License-Identifier: UNLICENSED\npragma solidity ^0.8.30;\n\nimport {IERC1967} from './interface/IERC1967.sol';\nimport {IERC1822Proxiable} from './interface/IERC1822.sol';\n\n/**\n * @custom:security-contact blockchain@sygnum.com\n * @title UUPSUtils\n * @notice Provides utility functions for UUPS proxies, including implementation retrieval, upgrade execution, and safety checks.\n * @dev This library offers a collection of functions designed to simplify the implementation of UUPS (Universal Upgradeable Proxy Standard) proxies.\n */\nlibrary UUPSUtils {\n    /* ======== Custom Errors ======== */\n    error ERC1967InvalidImplementation(address implementation);\n    error ERC1967NonPayable();\n    error FailedCall();\n\n    /* ======== Constants ======== */\n    /** @dev Storage slot for the implementation address (EIP-1967 standard).   \n     * bytes32(uint256(keccak256('eip1967.proxy.implementation')) - 1)\n     */\n    bytes32 internal constant IMPLEMENTATION_SLOT =\n        0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;\n\n    /** @dev The address of the current implementation. */\n    function getImplementation()\n        internal\n        view\n        returns (address implementation)\n    {\n        // Load the implementation address from the ERC-1967 slot.\n        // solhint-disable-next-line no-inline-assembly\n        assembly ('memory-safe') {\n            implementation := sload(IMPLEMENTATION_SLOT)\n        }\n    }\n\n    /**\n     * @notice Upgrades the implementation and optionally performs a setup call.\n     * @param _newImplementation The address of the new implementation contract.\n     * @param _data Optional initialization calldata to delegatecall to the new implementation.\n     */\n    function upgradeToAndCall(\n        address _newImplementation,\n        bytes memory _data\n    ) internal {\n        _setImplementation(_newImplementation);\n        emit IERC1967.Upgraded(_newImplementation);\n\n        if (_data.length > 0) {\n            _safeFunctionDelegateCall(_newImplementation, _data);\n        } else {\n            _checkNonPayable();\n        }\n    }\n\n    /** @notice Reverts if msg.value is not zero. */\n    function _checkNonPayable() private {\n        if (msg.value > 0) {\n            revert ERC1967NonPayable();\n        }\n    }\n\n    /**\n     * @notice Stores a new address in the ERC-1967 implementation slot.\n     * @param _newImplementation The address to store as the new implementation.\n     */\n    function _setImplementation(address _newImplementation) private {\n        _checkValidImplementation(_newImplementation);\n\n        // solhint-disable-next-line no-inline-assembly\n        assembly ('memory-safe') {\n            sstore(IMPLEMENTATION_SLOT, _newImplementation)\n        }\n    }\n\n    /**\n     * @dev Ensures the function is not called through delegatecall.\n     * @notice This function checks that the provided address is a valid UUPS implementation contract by verifying its proxiableUUID.\n     * It reverts with `UUPSUtils.ERC1967InvalidImplementation` if the provided address is not a valid implementation.\n     * @param _newImplementation The address of the new implementation contract.\n     */\n    function _checkValidImplementation(address _newImplementation) private view {\n        // Implementation address must contain code (this also covers address(0))\n        if (_newImplementation.code.length == 0) {\n            revert ERC1967InvalidImplementation(_newImplementation);\n        }\n        // Check that the new implementation exposes the proxiableUUID function and that it returns the expected value.\n        try IERC1822Proxiable(_newImplementation).proxiableUUID() returns (\n            bytes32 slot\n        ) {\n            if (slot != IMPLEMENTATION_SLOT) {\n                revert ERC1967InvalidImplementation(_newImplementation);\n            }\n        } catch {\n            revert ERC1967InvalidImplementation(_newImplementation);\n        }\n    }\n\n    /**\n     * @notice Performs a delegatecall to the target address with the given data and verifies the result.\n     * @param _target The address to delegatecall to.\n     * @param _data The data to send with the delegatecall.\n     * @return _returndata The data returned by the delegatecall.\n     * @dev Bubbles up revert reasons or custom errors if the call fails.\n     */\n    function _safeFunctionDelegateCall(\n        address _target,\n        bytes memory _data\n    ) private returns (bytes memory) {\n        // low level call is validate to prevent low-level call reentrancy or other low-level call errors\n        // solhint-disable-next-line avoid-low-level-calls\n        (bool _success, bytes memory _returndata) = _target.delegatecall(_data);\n\n        if (!_success) {\n            if (_returndata.length > 0) {\n                // solhint-disable-next-line no-inline-assembly\n                assembly ('memory-safe') {\n                    let returndata_size := mload(_returndata)\n                    revert(add(32, _returndata), returndata_size)\n                }\n            }\n            revert FailedCall();\n        }\n\n        return _returndata;\n    }\n}\n"},"libs/ERC20/ERC20Core.sol":{"content":"// SPDX-License-Identifier: AGPL-3.0-only\npragma solidity >=0.8.0;\n\n/*//////////////////////////////////////////////////////////////\n                            CUSTOM ERRORS\n//////////////////////////////////////////////////////////////*/\n\nerror PermitDeadlineExpired();\nerror InvalidSigner();\nerror ZeroAddress();\n\n/**\n * @title ERC20Core\n * @author SYGNUM AG - Blockchain team 3301\n * @notice Core ERC20 implementation with slot storage pattern\n * @dev This contract is a copy of the ERC20 contract from Solmate with a few twist:\n *   1. The variables use slot storage pattern for better encapsulation\n *   2. The contract has been made upgradeable\n *   3. Require statements have been replaced with custom errors\n */\n\n/** Solmate notes: */\n/// @notice Modern and gas efficient ERC20 + EIP-2612 implementation.\n/// @author Solmate (https://github.com/transmissions11/solmate/blob/main/src/tokens/ERC20.sol)\n/// @author Modified from Uniswap (https://github.com/Uniswap/uniswap-v2-core/blob/master/contracts/UniswapV2ERC20.sol)\n/// @dev Do not manually set balances without updating totalSupply, as the sum of all user balances must not exceed it.\n/**\n * @custom:security-contact blockchain@sygnum.com\n */\nabstract contract ERC20Core {\n    /* ======== STATE VARIABLES ======== */\n    \n    /**\n     * @dev ERC20_STORAGE_SLOT is a constant used to locate the ERC20Storage struct in storage.\n     * This ensures a unique storage slot, minimizing collision risks with other storage variables in the contract.\n     * It's calculated as keccak256(abi.encode(uint256(keccak256(\"ERC20Core.ERC20Storage\")) - 1)) & ~bytes32(uint256(0xff)).\n     */\n    bytes32 private constant ERC20_CORE_STORAGE_SLOT =\n        0x67df8e602072ae967fe4567cec1273e29da0bd7a5a1af20d9b5c8d3f0d838500;\n\n    /// @custom:storage-location erc7201:ERC20Core.ERC20Storage\n    struct ERC20Storage {\n        // METADATA STORAGE\n        string name;\n        string symbol;\n        uint8 decimals;\n        // ERC20 STORAGE\n        uint256 totalSupply;\n        mapping(address account => uint256 balance) balanceOf;\n        mapping(address owner => mapping(address spender => uint256 amount)) allowance;\n        // EIP-2612 STORAGE\n        uint256 INITIAL_CHAIN_ID;\n        bytes32 INITIAL_DOMAIN_SEPARATOR;\n        mapping(address account => uint256 nonce) nonces;\n    }\n    /*//////////////////////////////////////////////////////////////\n                                 EVENTS\n    //////////////////////////////////////////////////////////////*/\n\n    event Transfer(address indexed from, address indexed to, uint256 amount);\n\n    event Approval(\n        address indexed owner,\n        address indexed spender,\n        uint256 amount\n    );\n\n    /*//////////////////////////////////////////////////////////////\n                            VIEW FUNCTIONS\n    //////////////////////////////////////////////////////////////*/\n\n    /**\n     * @notice Returns the name of the token\n     * @return The name of the token\n     */\n    function _name() internal view returns (string memory) {\n        ERC20Storage storage $ = _getERC20Storage();\n        return $.name;\n    }\n\n    /**\n     * @notice Returns the symbol of the token\n     * @return The symbol of the token\n     */\n    function _symbol() internal view returns (string memory) {\n        ERC20Storage storage $ = _getERC20Storage();\n        return $.symbol;\n    }\n\n    /**\n     * @notice Returns the decimals of the token\n     * @return The decimals of the token\n     */\n    function _decimals() internal view returns (uint8) {\n        ERC20Storage storage $ = _getERC20Storage();\n        return $.decimals;\n    }\n\n    /**\n     * @notice Returns the total supply of the token\n     * @return The total supply of the token\n     */\n    function _totalSupply() internal view returns (uint256) {\n        ERC20Storage storage $ = _getERC20Storage();\n        return $.totalSupply;\n    }\n\n    /**\n     * @notice Returns the balance of the specified address\n     * @param _account The address to query the balance of\n     * @return The balance of the specified address\n     */\n    function _balanceOf(address _account) internal view returns (uint256) {\n        ERC20Storage storage $ = _getERC20Storage();\n        return $.balanceOf[_account];\n    }\n\n    /**\n     * @notice Returns the allowance of the spender for the owner\n     * @param _owner The address of the token owner\n     * @param _spender The address of the spender\n     * @return The allowance amount\n     */\n    function _allowance(address _owner, address _spender) internal view returns (uint256) {\n        ERC20Storage storage $ = _getERC20Storage();\n        return $.allowance[_owner][_spender];\n    }\n\n    /**\n     * @notice Returns the nonce for the specified address (EIP-2612)\n     * @param _account The address to query the nonce of\n     * @return The nonce of the specified address\n     */\n    function _nonces(address _account) internal view returns (uint256) {\n        ERC20Storage storage $ = _getERC20Storage();\n        return $.nonces[_account];\n    }\n\n    /*//////////////////////////////////////////////////////////////\n                               INITIALIZER\n    //////////////////////////////////////////////////////////////*/\n\n    /**\n     * @notice Initializes the ERC20 token with name, symbol and decimals\n     * @dev Idempotent: Only initializes if INITIAL_CHAIN_ID is not already set (default value is 0).\n     *      This preserves existing state during upgrades - new init data will not override existing values.\n     * @param _tokenName The name of the token\n     * @param _tokenSymbol The symbol of the token\n     * @param _tokenDecimals The number of decimals for the token\n     */\n    function _erc20_init(\n        string memory _tokenName,\n        string memory _tokenSymbol,\n        uint8 _tokenDecimals\n    ) internal {\n        ERC20Storage storage $ = _getERC20Storage();\n        if ($.INITIAL_CHAIN_ID == 0) {\n            $.name = _tokenName;\n            $.symbol = _tokenSymbol;\n            $.decimals = _tokenDecimals;\n\n            $.INITIAL_CHAIN_ID = block.chainid;\n            $.INITIAL_DOMAIN_SEPARATOR = _computeDomainSeparator();\n        }\n    }\n\n    /*//////////////////////////////////////////////////////////////\n                               ERC20 LOGIC\n    //////////////////////////////////////////////////////////////*/\n\n    /**\n     * @notice Internal function to approve spending allowance\n     * @param _owner The address of the token owner\n     * @param _spender The address to approve for spending\n     * @param _amount The amount to approve\n     * @return True if approval was successful\n     */\n    function _approve(address _owner, address _spender, uint256 _amount) internal returns (bool) {\n        if (_owner == address(0) || _spender == address(0)) revert ZeroAddress();\n\n        ERC20Storage storage $ = _getERC20Storage();\n        $.allowance[_owner][_spender] = _amount;\n\n        emit Approval(_owner, _spender, _amount);\n\n        return true;\n    }\n\n    /**\n     * @notice Internal function to transfer tokens between addresses\n     * @param _from The address to transfer from\n     * @param _to The address to transfer to\n     * @param _amount The amount to transfer\n     * @return True if transfer was successful\n     */\n    function _transfer(address _from, address _to, uint256 _amount) internal returns (bool) {\n        if (_from == address(0) || _to == address(0)) revert ZeroAddress();\n\n        ERC20Storage storage $ = _getERC20Storage();\n        $.balanceOf[_from] -= _amount;\n\n        // Cannot overflow because the sum of all user\n        // balances can't exceed the max uint256 value.\n        unchecked {\n            $.balanceOf[_to] += _amount;\n        }\n\n        emit Transfer(_from, _to, _amount);\n\n        return true;\n    }\n\n    /**\n     * @notice Internal function to transfer tokens from one address to another using allowance\n     * @param _from The address to transfer from\n     * @param _to The address to transfer to\n     * @param _amount The amount to transfer\n     * @return True if transfer was successful\n     */\n    function _transferFrom(\n        address _from,\n        address _to,\n        uint256 _amount\n    ) internal returns (bool) {\n        ERC20Storage storage $ = _getERC20Storage();\n        uint256 _allowed = $.allowance[_from][msg.sender]; // Saves gas for limited approvals.\n\n        if (_allowed != type(uint256).max) $.allowance[_from][msg.sender] = _allowed - _amount;\n\n        return _transfer(_from, _to, _amount);\n    }\n\n    /*//////////////////////////////////////////////////////////////\n                             EIP-2612 LOGIC\n    //////////////////////////////////////////////////////////////*/\n\n    /**\n     * @notice Internal function to handle permit signatures for gasless approvals\n     * @param _owner The address of the token owner\n     * @param _spender The address to approve for spending\n     * @param _value The amount to approve\n     * @param _deadline The deadline for the permit\n     * @param _v The recovery id of the signature\n     * @param _r The r component of the signature\n     * @param _s The s component of the signature\n     */\n    function _permit(\n        address _owner,\n        address _spender,\n        uint256 _value,\n        uint256 _deadline,\n        uint8 _v,\n        bytes32 _r,\n        bytes32 _s\n    ) internal {\n        // solhint-disable-next-line not-rely-on-time\n        if (_deadline < block.timestamp) revert PermitDeadlineExpired();\n\n        ERC20Storage storage $ = _getERC20Storage();\n\n        // Unchecked because the only math done is incrementing\n        // the owner's nonce which cannot realistically overflow.\n        unchecked {\n            uint256 _currentNonce = $.nonces[_owner];\n            $.nonces[_owner] = _currentNonce + 1;\n            \n            address _recoveredAddress = ecrecover(\n                keccak256(\n                    abi.encodePacked(\n                        \"\\x19\\x01\",\n                        _DOMAIN_SEPARATOR(),\n                        keccak256(\n                            abi.encode(\n                                keccak256(\n                                    \"Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)\"\n                                ),\n                                _owner,\n                                _spender,\n                                _value,\n                                _currentNonce,\n                                _deadline\n                            )\n                        )\n                    )\n                ),\n                _v,\n                _r,\n                _s\n            );\n\n            if (_recoveredAddress == address(0) || _recoveredAddress != _owner) revert InvalidSigner();\n\n            $.allowance[_owner][_spender] = _value;\n        }\n\n        emit Approval(_owner, _spender, _value);\n    }\n\n    /**\n     * @notice Returns the domain separator for EIP-712 signatures\n     * @return The domain separator hash\n     */\n    function _DOMAIN_SEPARATOR() internal view returns (bytes32) {\n        ERC20Storage storage $ = _getERC20Storage();\n        return\n            block.chainid == $.INITIAL_CHAIN_ID\n                ? $.INITIAL_DOMAIN_SEPARATOR\n                : _computeDomainSeparator();\n    }\n\n    /**\n     * @notice Computes the domain separator for EIP-712 signatures\n     * @return The computed domain separator hash\n     */\n    function _computeDomainSeparator() internal view returns (bytes32) {\n        ERC20Storage storage $ = _getERC20Storage();\n        return\n            keccak256(\n                abi.encode(\n                    keccak256(\n                        \"EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)\"\n                    ),\n                    keccak256(bytes($.name)),\n                    keccak256(\"1\"),\n                    block.chainid,\n                    address(this)\n                )\n            );\n    }\n\n    /*//////////////////////////////////////////////////////////////\n                        INTERNAL MINT/BURN LOGIC\n    //////////////////////////////////////////////////////////////*/\n\n    /**\n     * @notice Internal function to mint tokens to an address\n     * @param _to The address to mint tokens to\n     * @param _amount The amount of tokens to mint\n     */\n    function _mint(address _to, uint256 _amount) internal {\n        ERC20Storage storage $ = _getERC20Storage();\n        $.totalSupply += _amount;\n\n        // Cannot overflow because the sum of all user\n        // balances can't exceed the max uint256 value.\n        unchecked {\n            $.balanceOf[_to] += _amount;\n        }\n\n        emit Transfer(address(0), _to, _amount);\n    }\n\n    /**\n     * @notice Internal function to burn tokens from an address\n     * @param _from The address to burn tokens from\n     * @param _amount The amount of tokens to burn\n     */\n    function _burn(address _from, uint256 _amount) internal {\n        ERC20Storage storage $ = _getERC20Storage();\n        $.balanceOf[_from] -= _amount;\n\n        // Cannot underflow because a user's balance\n        // will never be larger than the total supply.\n        unchecked {\n            $.totalSupply -= _amount;\n        }\n\n        emit Transfer(_from, address(0), _amount);\n    }\n\n    /* ======== PRIVATE VIEW/PURE FUNCTIONS ======== */\n\n    /**\n     * @notice Retrieves the ERC20Storage struct from the storage slot\n     * @return $ The ERC20Storage struct reference\n     */\n    function _getERC20Storage()\n        private\n        pure\n        returns (ERC20Storage storage $)\n    {\n        // Use assembly to simply slot the storage location into a variable\n        // solhint-disable-next-line no-inline-assembly\n        assembly {\n            $.slot := ERC20_CORE_STORAGE_SLOT\n        }\n    }\n}\n"},"libs/ERC20/ERC20View.sol":{"content":"// SPDX-License-Identifier: AGPL-3.0-only\npragma solidity >=0.8.0;\n\nimport {ERC20Core} from \"libs/ERC20/ERC20Core.sol\";\n\n/**\n * @custom:security-contact blockchain@sygnum.com\n * @title ERC20View\n * @author SYGNUM AG - Blockchain team 3301\n * @notice View-only ERC20 implementation that exposes only view functions\n * @dev This contract provides read-only access to ERC20 token state without\n *      state-changing functions. It's designed for contracts that need to query\n *      token information but should not modify state directly.\n */\nabstract contract ERC20View is ERC20Core {\n    /*//////////////////////////////////////////////////////////////\n                        EXTERNAL/PUBLIC VIEW FUNCTIONS\n    //////////////////////////////////////////////////////////////*/\n\n    /**\n     * @notice Returns the name of the token\n     * @return The name of the token\n     */\n    function name() public view returns (string memory) {\n        return _name();\n    }\n\n    /**\n     * @notice Returns the symbol of the token\n     * @return The symbol of the token\n     */\n    function symbol() public view returns (string memory) {\n        return _symbol();\n    }\n\n    /**\n     * @notice Returns the number of decimals used to get its user representation\n     * @return The number of decimals\n     */\n    function decimals() public view returns (uint8) {\n        return _decimals();\n    }\n\n    /**\n     * @notice Returns the amount of tokens in existence\n     * @return The total supply of tokens\n     */\n    function totalSupply() public view returns (uint256) {\n        return _totalSupply();\n    }\n\n    /**\n     * @notice Returns the amount of tokens owned by account\n     * @param _account The address to query the balance of\n     * @return The balance of the specified address\n     */\n    function balanceOf(address _account) public view returns (uint256) {\n        return _balanceOf(_account);\n    }\n\n    /**\n     * @notice Returns the remaining number of tokens that spender will be allowed to spend on behalf of owner\n     * @param _owner The address of the token owner\n     * @param _spender The address of the spender\n     * @return The allowance amount\n     */\n    function allowance(address _owner, address _spender) public view returns (uint256) {\n        return _allowance(_owner, _spender);\n    }\n\n    /**\n     * @notice Returns the current nonce for owner (EIP-2612)\n     * @param _account The address to query the nonce of\n     * @return The nonce of the specified address\n     */\n    function nonces(address _account) public view returns (uint256) {\n        return _nonces(_account);\n    }\n\n    /**\n     * @notice Returns the domain separator used in the encoding of the signature for permits (EIP-2612)\n     * @return The domain separator hash\n     */\n    function DOMAIN_SEPARATOR() public view returns (bytes32) {\n        return _DOMAIN_SEPARATOR();\n    }\n}\n"},"libs/Timelock/Timelock.sol":{"content":"// SPDX-License-Identifier: UNLICENSED\npragma solidity ^0.8.30;\n\nimport {TimelockView} from \"./TimelockView.sol\";\n\n/**\n * @custom:security-contact blockchain@sygnum.com\n * @title Timelock\n * @author SYGNUM AG - Blockchain team 3301\n * @notice Standard Timelock implementation that extends TimelockView\n * and exposes the basic timelock interface functions.\n * @dev Abstract contract that provides a mechanism to delay the execution of transactions.\n */\nabstract contract Timelock is TimelockView {\n}\n"},"libs/utils/bytes/BytesLib.sol":{"content":"// SPDX-License-Identifier: UNLICENSED\npragma solidity ^0.8.30;\n\n/**\n * @custom:security-contact blockchain@sygnum.com\n * @title BytesLib\n * @author Sygnum\n * @notice Library for efficient bytes manipulation operations.\n * @dev Provides utility functions for working with bytes arrays.\n */\nlibrary BytesLib {\n    /**\n     * @notice Slices a bytes array from start to end position.\n     * @dev Sanitizes input by clamping end to buffer length and start to end.\n     *      Uses mcopy for efficient memory copying.\n     * @param _data The bytes array to slice.\n     * @param _start The starting position (inclusive).\n     * @param _end The ending position (exclusive).\n     * @return _result The sliced bytes array.\n     */\n    function slice(\n        bytes memory _data,\n        uint256 _start,\n        uint256 _end\n    ) internal pure returns (bytes memory _result) {\n        // Sanitize inputs\n        _end = _min(_end, _data.length);\n        _start = _min(_start, _end);\n\n        // Allocate and copy\n        _result = new bytes(_end - _start);\n        // solhint-disable-next-line no-inline-assembly\n        assembly (\"memory-safe\") {\n            mcopy(add(_result, 0x20), add(add(_data, 0x20), _start), sub(_end, _start))\n        }\n    }\n\n    /**\n     * @notice Returns the minimum of two numbers.\n     * @dev Internal helper function for sanitizing slice bounds.\n     * @param _a First number.\n     * @param _b Second number.\n     * @return The smaller of the two numbers.\n     */\n    function _min(uint256 _a, uint256 _b) private pure returns (uint256) {\n        return _a < _b ? _a : _b;\n    }\n}\n"},"libs/Pausable/PausableCore.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.28;\n\n/**\n * @custom:security-contact blockchain@sygnum.com\n * @title PausableCore\n * @notice Core pausing implementation with slot storage pattern\n * @dev This contract provides the core pausing logic without any authorization assumptions.\n * Contracts inheriting from this will be able to pause and unpause functionality\n * using the whenNotPaused and whenPaused modifiers. This is the core implementation\n * that should be inherited by contracts that need pausing functionality.\n */\nabstract contract PausableCore {\n    /* ======== STATE VARIABLES ======== */\n\n    /**\n     * @dev PAUSABLE_CORE_STORAGE_SLOT is a constant used to locate the PausableStorage struct in storage for PausableCore.\n     * This ensures a unique storage slot for the paused state, minimizing collision risks with other storage variables in the contract.\n     * The value is calculated as keccak256(abi.encode(uint256(keccak256(\"PausableCore.PausableStorage\")) - 1)) & ~bytes32(uint256(0xff)).\n     */\n    bytes32 private constant PAUSABLE_CORE_STORAGE_SLOT =\n        0xfedd7b171e5aaf71411eb61c81513b977191128c387240284b4edb396fcbdb00;\n\n    /// @custom:storage-location erc7201:PausableCore.PausableStorage\n    struct PausableStorage {\n        bool paused;\n    }\n\n    /* ========== ERRORS ========== */\n\n    error ContractPaused();\n    error ContractNotPaused();\n\n    /* ========== EVENTS ========== */\n\n    event Paused();\n    event Unpaused();\n\n    /* ========== INTERNAL VIEW FUNCTIONS ========== */\n\n    /**\n     * @notice Returns the current pause state\n     * @return True if the contract is paused, false otherwise\n     */\n    function _isPaused() internal view returns (bool) {\n        PausableStorage storage $ = _getPausableStorage();\n        return $.paused;\n    }\n\n    /* ========== MODIFIERS ========== */\n\n    /**\n     * @notice Modifier to make a function callable only when the contract is not paused\n     * @dev Reverts with ContractPaused if the contract is paused\n     */\n    modifier whenNotPaused() {\n        if (_isPaused()) {\n            revert ContractPaused();\n        }\n        _;\n    }\n\n    /**\n     * @notice Modifier to make a function callable only when the contract is paused\n     * @dev Reverts with ContractNotPaused if the contract is not paused\n     */\n    modifier whenPaused() {\n        if (!_isPaused()) {\n            revert ContractNotPaused();\n        }\n        _;\n    }\n\n    /* ========== INTERNAL STATE-CHANGING FUNCTIONS ========== */\n\n    /**\n     * @notice Pauses the contract\n     * @dev Sets the paused state to true and emits a Paused event\n     */\n    function _pause() internal whenNotPaused {\n        PausableStorage storage $ = _getPausableStorage();\n        $.paused = true;\n        emit Paused();\n    }\n\n    /**\n     * @notice Unpauses the contract\n     * @dev Sets the paused state to false and emits an Unpaused event\n     */\n    function _unpause() internal whenPaused {\n        PausableStorage storage $ = _getPausableStorage();\n        $.paused = false;\n        emit Unpaused();\n    }\n\n    /* ======== PRIVATE VIEW/PURE FUNCTIONS ======== */\n\n    /**\n     * @notice Retrieves the PausableStorage struct from the storage slot\n     * @dev Returns the PausableStorage struct\n     */\n    function _getPausableStorage()\n        private\n        pure\n        returns (PausableStorage storage $)\n    {\n        // Use assembly to simply slot the storage location into a variable\n        // solhint-disable-next-line no-inline-assembly\n        assembly {\n            $.slot := PAUSABLE_CORE_STORAGE_SLOT\n        }\n    }\n}\n"},"libs/Timelock/TimelockCore.sol":{"content":"// SPDX-License-Identifier: UNLICENSED\npragma solidity ^0.8.30;\n\n/**\n * @custom:security-contact blockchain@sygnum.com\n * @title TimelockCore\n * @author SYGNUM AG - Blockchain team 3301\n * @notice Core timelock implementation with slot storage pattern\n * @dev This abstract contract provides the core timelock functionality with only internal functions.\n * It uses the slot storage pattern for better encapsulation and storage conflict avoidance.\n */\nabstract contract TimelockCore {\n    /* ======== State variables ======== */\n    /** @notice TIMELOCK_CORE_STORAGE_SLOT is a constant used to locate the TimelockStorage struct in storage.\n     * This ensures a unique storage slot, minimizing collision risks with other storage variables in the contract.\n     * It's calculated as keccak256(abi.encode(uint256(keccak256(\"TimelockCore.TimelockStorage\")) - 1)) & ~bytes32(uint256(0xff)).\n     */\n    bytes32 private constant TIMELOCK_CORE_STORAGE_SLOT =\n        0x1626844f871e5080d673ecb96ea8a32c7bdf671ea137282b2886cd9d0fd9a700;\n\n    struct Operation {\n        address target;\n        uint256 value;\n        bytes data;\n        uint256 eta;\n    }\n\n    /// @custom:storage-location erc7201:TimelockCore.TimelockStorage\n    struct TimelockStorage {\n        // @notice operationCounter is incremented for each new operation to ensure unique IDs\n        uint256 operationCounter;\n        // @notice timelock maps the operation ID to the timestamp when it can be executed.\n        mapping(bytes32 operationId => uint256 eta) timelock;\n        mapping(bytes32 operationId => Operation operation) scheduledOperations;\n    }\n\n    /* ======== Custom Errors ======== */\n    error InvalidTimestamp();\n    error TimelockNotReached();\n    error TimelockDoesNotExist();\n    error TimeLockAlreadyExist();\n    error InsufficientFunds(uint256 given, uint256 expected);\n    error OperationExecutionFailed(bytes32 operationId);\n\n    /* ======== Events ======== */\n    /**\n     * @notice Emitted when an operation is scheduled.\n     * @param operationId The unique ID of the operation.\n     * @param target The address of the contract to call.\n     * @param value The amount of Ether (in wei) to send with the call.\n     * @param data The data to send with the call (ABI-encoded function arguments).\n     * @param eta The timestamp (in seconds since Unix epoch) after which the operation can be executed.\n     */\n    event Queued(\n        bytes32 indexed operationId,\n        address target,\n        uint256 value,\n        bytes data,\n        uint256 eta\n    );\n\n    /**\n     * @notice Emitted when an operation is executed.\n     * @param operationId The unique ID of the operation.\n     * @param target The address of the contract that was called.\n     * @param value The amount of Ether (in wei) that was sent with the call.\n     * @param data The data that was sent with the call.\n     * @param timestamp The timestamp (in seconds since Unix epoch) when the operation is executed.\n     */\n    event Executed(\n        bytes32 indexed operationId,\n        address target,\n        uint256 value,\n        bytes data,\n        uint256 timestamp\n    );\n\n    /**\n     * @notice Emitted when an operation is cancelled.\n     * @param operationId The unique ID of the operation.\n     */\n    event Canceled(bytes32 indexed operationId);\n\n    /* ======== Internal View/Pure Functions ======== */\n\n    /**\n     * @notice Returns the details of a scheduled timelock operation.\n     * @dev Retrieves the target address, calldata, value, and ETA for a given operation ID.\n     *      This function allows internal callers to inspect the parameters of a scheduled operation\n     *      before it is executed or cancelled.\n     * @param _operationId The unique ID of the scheduled operation.\n     * @return target The address of the contract to be called.\n     * @return data The calldata to be sent with the call.\n     * @return value The amount of Ether (in wei) to be sent with the call.\n     * @return eta The earliest timestamp at which the operation can be executed.\n     */\n    function _getScheduledOperationDetails(\n        bytes32 _operationId\n    )\n        internal\n        view\n        returns (address target, bytes memory data, uint256 value, uint256 eta)\n    {\n        TimelockStorage storage $ = _getTimelockStorage();\n        Operation memory _op = $.scheduledOperations[_operationId];\n        return (_op.target, _op.data, _op.value, _op.eta);\n    }\n\n    /**\n     * @notice Checks if a timelock operation is valid and ready for execution.\n     * @dev Reverts if the operation does not exist or if the required timelock delay has not yet passed.\n     * @param _operationId The unique ID of the operation to validate.\n     * @custom:reverts TimelockDoesNotExist if the operation is not scheduled.\n     * @custom:reverts TimelockNotReached if the timelock delay has not yet elapsed.\n     */\n    function _isExecutableOperation(bytes32 _operationId) internal view {\n        TimelockStorage storage $ = _getTimelockStorage();\n        uint256 _eta = $.timelock[_operationId];\n        if (_eta == 0) revert TimelockDoesNotExist();\n        if (_getBlockTimestamp() < _eta) revert TimelockNotReached();\n    }\n\n    /* ======== Internal State-Changing Functions ======== */\n    /**\n     * @notice Executes a timelock operation.\n     * @param _operationId The unique ID of the operation to execute.\n     */\n    function _executeScheduledOperation(bytes32 _operationId) internal {\n        _isExecutableOperation(_operationId);\n        TimelockStorage storage $ = _getTimelockStorage();\n\n        Operation memory _op = $.scheduledOperations[_operationId];\n        address _target = _op.target;\n        uint256 _value = _op.value;\n        bytes memory _data = _op.data;\n\n        if (address(this).balance < _value) {\n            revert InsufficientFunds(_value, address(this).balance);\n        }\n\n        // Remove the operation details and timelock details from storage BEFORE the external call\n        // to prevent reentrancy attacks (Checks-Effects-Interactions pattern)\n        delete $.timelock[_operationId];\n        delete $.scheduledOperations[_operationId];\n\n        // Call the target contract and handle the return value\n        // Note: You cannot call internal functions of other contracts using .call, delegatecall, or similar low-level calls.\n        // Internal functions are not part of the contract's ABI and are only accessible within the contract itself or its derived contracts.\n        // The following line can only call public or external functions:\n        (bool _success, ) = _target.call{value: _value}(_data);\n\n        if (!_success) {\n            revert OperationExecutionFailed(_operationId);\n        }\n\n        emit Executed(\n            _operationId,\n            _target,\n            _value,\n            _data,\n            _getBlockTimestamp()\n        );\n    }\n\n    /**\n     * @notice Schedules an operation to be executed after a delay.\n     * @param _target The address of the contract to call.\n     * @param _data The _data to send with the call (ABI-encoded function arguments).\n     * @param _eta The timestamp (in seconds since Unix epoch) after which the operation can be executed.\n     * @return operationId The unique ID of the timelock operation.\n     */\n    function _scheduleOperation(\n        address _target,\n        bytes memory _data,\n        uint256 _eta\n    ) internal returns (bytes32 operationId) {\n        if (_getBlockTimestamp() >= _eta) {\n            revert InvalidTimestamp();\n        }\n        TimelockStorage storage $ = _getTimelockStorage();\n        uint256 _value = msg.value;\n\n        // Generate unique operation ID from counter (starts at 1 to avoid bytes32(0))\n        $.operationCounter++;\n        operationId = bytes32($.operationCounter);\n\n        $.timelock[operationId] = _eta;\n        $.scheduledOperations[operationId] = Operation({\n            target: _target,\n            value: _value,\n            data: _data,\n            eta: _eta\n        });\n\n        // Emit the Queued event with the operation details\n        emit Queued(\n            operationId,\n            _target,\n            _value,\n            _data,\n            _eta\n        );\n    }\n\n    /**\n     * @notice Cancels a timelock operation.\n     * @param _operationId The unique ID of the operation to cancel.\n     */\n    function _cancelScheduledOperation(bytes32 _operationId) internal {\n        TimelockStorage storage $ = _getTimelockStorage();\n        if ($.timelock[_operationId] != 0) {\n            // Remove the scheduled time\n            delete $.timelock[_operationId];\n            // Remove the operation details\n            delete $.scheduledOperations[_operationId];\n\n            emit Canceled(_operationId);\n        }\n    }\n\n    /* ======== Private View/Pure Functions ======== */\n    /**\n     * @notice Retrieves the TimelockStorage struct from the storage slot.\n     * @dev Returns the TimelockStorage struct.\n     */\n    function _getTimelockStorage()\n        private\n        pure\n        returns (TimelockStorage storage $)\n    {\n        // Use assembly to simply slot the storage location into a variable\n        // solhint-disable-next-line no-inline-assembly\n        assembly {\n            $.slot := TIMELOCK_CORE_STORAGE_SLOT\n        }\n    }\n\n    /**\n     * Used to avoid multiple lines of solhint directives in a single line for better readability.\n     * @dev Returns the current block timestamp.\n     */\n    function _getBlockTimestamp() private view returns (uint256) {\n        // solhint-disable-next-line not-rely-on-time\n        return block.timestamp;\n    }\n}\n"},"libs/Timelock/TimelockView.sol":{"content":"// SPDX-License-Identifier: UNLICENSED\npragma solidity ^0.8.30;\n\nimport {TimelockCore} from \"libs/Timelock/TimelockCore.sol\";\n\n/**\n * @custom:security-contact blockchain@sygnum.com\n * @title TimelockView\n * @author SYGNUM AG - Blockchain team 3301\n * @notice View-only Timelock implementation that exposes operation details\n * @dev This contract provides read-only access to timelock operations without\n *      allowing modification. It's designed for contracts that need to query\n *      operation details but should not modify them directly.\n */\nabstract contract TimelockView is TimelockCore {\n    /*//////////////////////////////////////////////////////////////\n                        EXTERNAL/PUBLIC VIEW FUNCTIONS\n    //////////////////////////////////////////////////////////////*/\n\n    /**\n     * @notice Returns the details of a scheduled timelock operation\n     * @param _operationId The unique ID of the scheduled operation\n     * @return target The address of the contract to be called\n     * @return data The calldata to be sent with the call\n     * @return value The amount of Ether (in wei) to be sent with the call\n     * @return eta The earliest timestamp at which the operation can be executed\n     */\n    function getScheduledOperationDetails(\n        bytes32 _operationId\n    ) public view returns (address target, bytes memory data, uint256 value, uint256 eta) {\n        return _getScheduledOperationDetails(_operationId);\n    }\n}\n"},"libs/ERC20/interfaces/IERC20.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity >=0.8.0;\n\n/**\n * @custom:security-contact blockchain@sygnum.com\n * @title IERC20\n * @author SYGNUM AG - Blockchain team 3301\n * @dev Interface of the ERC-20 standard as defined in the ERC with extensions:\n *   1. EIP-2612 permit functionality for gasless approvals\n *   2. Standard metadata functions (name, symbol, decimals)\n *\n * This interface matches the implementation in ERC20.sol\n */\ninterface IERC20 {\n    /* ========== EVENTS ========== */\n\n    /**\n     * @dev Emitted when `amount` tokens are moved from one account (`from`) to\n     * another (`to`).\n     *\n     * Note that `amount` may be zero.\n     */\n    event Transfer(address indexed from, address indexed to, uint256 amount);\n\n    /**\n     * @dev Emitted when the allowance of a `spender` for an `owner` is set by\n     * a call to {approve}. `amount` is the new allowance.\n     */\n    event Approval(address indexed owner, address indexed spender, uint256 amount);\n\n    /* ========== STATE VARIABLES ========== */\n\n    /**\n     * @dev Returns the name of the token.\n     * Part of the ERC20 optional metadata extension.\n     */\n    function name() external view returns (string memory);\n\n    /**\n     * @dev Returns the symbol of the token.\n     * Part of the ERC20 optional metadata extension.\n     */\n    function symbol() external view returns (string memory);\n\n    /**\n     * @dev Returns the decimals places of the token.\n     * Part of the ERC20 optional metadata extension.\n     */\n    function decimals() external view returns (uint8);\n\n    /**\n     * @dev Returns the value of tokens in existence.\n     */\n    function totalSupply() external view returns (uint256);\n\n    /**\n     * @dev Returns the value of tokens owned by `account`.\n     */\n    function balanceOf(address _account) external view returns (uint256);\n\n    /**\n     * @dev Returns the remaining number of tokens that `spender` will be\n     * allowed to spend on behalf of `owner` through {transferFrom}. This is\n     * zero by default.\n     *\n     * This value changes when {approve} or {transferFrom} are called.\n     */\n    function allowance(address _owner, address _spender) external view returns (uint256);\n\n    /**\n     * @dev Returns the current nonce for `owner`.\n     * This value is used in EIP-2612 permit function and must be\n     * included whenever a signature is generated.\n     *\n     * Every successful call to {permit} increases the owner's nonce by one,\n     * preventing signature reuse.\n     */\n    function nonces(address _owner) external view returns (uint256);\n    \n    /* ========== FUNCTIONS ========== */\n\n    /**\n     * @dev Moves a `value` amount of tokens from the caller's account to `to`.\n     *\n     * Returns a boolean value indicating whether the operation succeeded.\n     *\n     * Emits a {Transfer} event.\n     */\n    function transfer(address _to, uint256 _value) external returns (bool);\n\n    /**\n     * @dev Sets a `value` amount of tokens as the allowance of `spender` over the\n     * caller's tokens.\n     *\n     * Returns a boolean value indicating whether the operation succeeded.\n     *\n     * IMPORTANT: Beware that changing an allowance with this method brings the risk\n     * that someone may use both the old and the new allowance by unfortunate\n     * transaction ordering. One possible solution to mitigate this race\n     * condition is to first reduce the spender's allowance to 0 and set the\n     * desired value afterwards:\n     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\n     *\n     * Emits an {Approval} event.\n     */\n    function approve(address _spender, uint256 _value) external returns (bool);\n\n    /**\n     * @dev Moves a `value` amount of tokens from `from` to `to` using the\n     * allowance mechanism. `value` is then deducted from the caller's\n     * allowance.\n     *\n     * Returns a boolean value indicating whether the operation succeeded.\n     *\n     * Emits a {Transfer} event.\n     */\n    function transferFrom(address _from, address _to, uint256 _value) external returns (bool);\n\n    /**\n     * @dev EIP-2612 permit function to approve token spending with a signature\n     * instead of msg.sender calling approve directly.\n     *\n     * Sets `value` as the allowance of `spender` over `owner`'s tokens,\n     * given `owner`'s signed approval.\n     *\n     * Requirements:\n     * - `deadline` must not have expired\n     * - `v`, `r` and `s` must form a valid secp256k1 signature from `owner`\n     * - The signature must use the current nonce of `owner` (see {nonces})\n     *\n     * Emits an {Approval} event.\n     */\n    function permit(\n        address _owner,\n        address _spender,\n        uint256 _value,\n        uint256 _deadline,\n        uint8 _v,\n        bytes32 _r,\n        bytes32 _s\n    ) external;\n}"},"libs/UUPS/interface/IERC1822.sol":{"content":"// SPDX-License-Identifier: UNLICENSED\npragma solidity ^0.8.30;\n\n/**\n * @custom:security-contact blockchain@sygnum.com\n * @dev ERC-1822: Universal Upgradeable Proxy Standard (UUPS) documents a method for upgradeability through a simplified\n * proxy whose upgrades are fully controlled by the current implementation.\n */\ninterface IERC1822Proxiable {\n    /**\n     * @dev Returns the storage slot that the proxiable contract assumes is being used to store the implementation\n     * address.\n     *\n     * IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks\n     * bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this\n     * function revert if invoked through a proxy.\n     */\n    function proxiableUUID() external view returns (bytes32);\n}\n"},"libs/UUPS/interface/IERC1967.sol":{"content":"// SPDX-License-Identifier: UNLICENSED\npragma solidity ^0.8.30;\n\n/**\n * @custom:security-contact blockchain@sygnum.com\n * @title IERC1967\n * @dev Interface of ERC1967 events emitted by proxies.\n *\n * These events are emitted when the proxy's implementation, admin, or beacon are changed.\n */\ninterface IERC1967 {\n    /**\n     * @dev Emitted when the implementation is upgraded.\n     * @param implementation The address of the new implementation.\n     */\n    event Upgraded(address indexed implementation);\n}\n"},"libs/UUPS/UUPSUpgradeableCore.sol":{"content":"// SPDX-License-Identifier: UNLICENSED\npragma solidity ^0.8.30;\n\nimport {IERC1822Proxiable} from './interface/IERC1822.sol';\nimport {UUPSUtils} from './UUPSUtils.sol';\n\n/**\n * @custom:security-contact blockchain@sygnum.com\n * @title UUPSUpgradeableCore\n * @author SYGNUM AG - Blockchain team 3301\n * @notice Core UUPS upgradeability implementation with only internal functions\n * @dev Provides upgradeability logic for UUPS proxies, including initialization and upgrade authorization.\n * Combines initialization and UUPS upgrade logic for use behind an ERC1967Proxy.\n * UUPS (Universal Upgradeable Proxy Standard) is a proxy pattern where the upgrade logic resides in the implementation contract itself,\n * rather than in the proxy. This contract provides the base functionality for UUPS upgradeability, including checks to ensure\n * that upgrades are authorized and that the implementation contract is valid.\n */\nabstract contract UUPSUpgradeableCore is IERC1822Proxiable {\n    /* ======== State Variables ======== */\n    /**\n     * @dev `__self` is an immutable state variable that stores the address of the contract instance.\n     * It is used to differentiate between direct calls to the implementation contract and calls through the proxy.\n     * This is crucial for security checks to prevent unauthorized access to upgrade functions.\n     * By storing the contract's own address, we can determine if a call is being made directly to the implementation\n     * or through the proxy, which is essential for enforcing access control and preventing unauthorized upgrades.\n     */\n    address private immutable __self = address(this);\n\n    /* ======== Modifiers ======== */\n    /**\n     * @dev Restricts function to only be called through a proxy.\n     * @notice This modifier checks that the function is being called via a delegate call through a proxy contract.\n     * It prevents direct calls to the implementation contract, ensuring that all calls go through the proxy.\n     */\n    modifier onlyProxy() {\n        _checkProxy();\n        _;\n    }\n\n    /**\n     * @dev Restricts function to only be called directly, not via delegatecall.\n     * @notice This modifier ensures that the function is called directly on the implementation contract,\n     * not through a delegate call. This is used to protect functions that should only be called by the implementation itself.\n     */\n    modifier notDelegated() {\n        _checkNotDelegated();\n        _;\n    }\n\n    /* ======== Custom Errors ======== */\n    error UUPSUnauthorizedCallContext();\n\n    /* ======== Internal View/Pure Functions ======== */\n\n    /**\n     * @notice Returns the storage slot used by the implementation.\n     * @dev Internal version for core functionality.\n     * @return bytes32 The storage slot used by the implementation.\n     */\n    function _proxiableUUID() internal view returns (bytes32) {\n        _checkNotDelegated();\n        return UUPSUtils.IMPLEMENTATION_SLOT;\n    }\n\n    /**\n     * @dev Ensures the function is called through a proxy with the correct implementation.\n     * @notice This function checks that the contract is being called via a delegate call through a proxy contract\n     * and that the implementation address matches the current contract address.\n     * It reverts with `UUPSUnauthorizedCallContext` if the conditions are not met.\n     */\n    function _checkProxy() internal view {\n        // If the address of `this` is equal to `__self`, it means the contract is being called directly, not through a proxy.\n        // Additionally, it verifies that the implementation address stored in the UUPSUtils matches the current contract address.\n        if (\n            address(this) == __self || UUPSUtils.getImplementation() != __self\n        ) {\n            revert UUPSUnauthorizedCallContext();\n        }\n    }\n\n    /**\n     * @dev Ensures the function is not called through delegatecall.\n     * @notice This function checks that the contract is being called directly and not through a delegate call.\n     * It reverts with `UUPSUnauthorizedCallContext` if the contract is being called through a delegate call.\n     */\n    function _checkNotDelegated() internal view {\n        // If the address of `this` is not equal to `__self`, it means the contract is being called through a delegate call.\n        if (address(this) != __self) {\n            revert UUPSUnauthorizedCallContext();\n        }\n    }\n\n    /* ======== Internal State-Changing Functions ======== */\n\n    /**\n     * @notice Upgrades the implementation and optionally executes a function call.\n     * @param _newImplementation The address of the new implementation contract.\n     * @param _data Optional memory to execute after the upgrade.\n     */\n    function _upgradeToAndCall(\n        address _newImplementation,\n        bytes memory _data\n    ) internal {\n        _checkProxy();\n        _authorizeUpgrade(_newImplementation, _data);\n        _triggerUpgrade(_newImplementation, _data);\n    }\n\n    /**\n     * @notice Must be overridden to include access restriction to the upgrade mechanism.\n     * validates the _newImplementation address and _data to perform any necessary checks on the input data\n     * @param _newImplementation The address of the new implementation contract.\n     * @param _data Optional memory to execute after the upgrade.\n     */\n    function _authorizeUpgrade(address _newImplementation,bytes memory _data) internal view virtual;\n\n    /**\n     * @dev Executes the upgrade.\n     * @notice This function is responsible for performing the actual upgrade of the contract.\n     * It calls the `_upgradeToAndCallUUPS` function to switch to the new implementation.\n     * @param _newImplementation The address of the new implementation contract.\n     * @param _data The _data to be passed to the new implementation contract.\n     */\n    function _triggerUpgrade(\n        address _newImplementation,\n        bytes memory _data\n    ) internal virtual {\n        _upgradeToAndCallUUPS(_newImplementation, _data);\n    }\n\n    /**\n     * @dev Performs an implementation upgrade with a security check for UUPS proxies and optional setup call.\n     * @param _newImplementation The address of the new implementation contract.\n     * @param _data Optional memory to execute after the upgrade.\n     */\n    function _upgradeToAndCallUUPS(\n        address _newImplementation,\n        bytes memory _data\n    ) internal {\n        _preUpgradeToAndCallUUPS(_newImplementation, _data);\n        UUPSUtils.upgradeToAndCall(_newImplementation, _data);\n        _postUpgradeToAndCallUUPS(_newImplementation, _data);\n    }\n\n    /**\n     * @notice Hook that is called before an upgrade is executed.\n     * @dev Can be overridden by derived contracts to implement custom logic before the upgrade is executed.\n     *      If the contract inherits from Initializable. Override this method to calls _resetInitialized().\n     * @param _newImplementation The address of the new implementation contract.\n     * @param _data The data that was passed during the upgrade.\n     */\n    function _preUpgradeToAndCallUUPS(address _newImplementation, bytes memory _data) internal virtual {}\n\n    /**\n     * @notice Hook that is called after an upgrade is executed.\n     * @dev Can be overridden by derived contracts to implement custom logic after the upgrade is executed.\n     *      For example, to check that the contract is properly initialized after the upgrade.\n     *      If the contract inherits from Initializable, this can be used to verify that isInitialized() returns true\n     *      when initialization data is required.\n     * @param _newImplementation The address of the new implementation contract.\n     * @param _data The data that was passed during the upgrade.\n     */\n    function _postUpgradeToAndCallUUPS(address _newImplementation, bytes memory _data) internal virtual {}\n}\n"},"libs/Permissioned/Permissioned.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.28;\n\nimport {PermissionedView} from \"libs/Permissioned/PermissionedView.sol\";\n\n/**\n * @custom:security-contact blockchain@sygnum.com\n * @title Permissioned\n * @notice Standard Permissioned implementation that extends PermissionedView\n * and exposes the public interface functions.\n * @dev Contracts inheriting from this will be able to perform role-based access control checks\n * using the requiresAuth modifier\n */\nabstract contract Permissioned is PermissionedView {\n    /* ========== EXTERNAL/PUBLIC STATE-CHANGING FUNCTIONS ========== */\n\n    /**\n     * @notice Sets the permission manager address\n     * @param _permissionManagerAddress The new permission manager address\n     */\n    function setPermissionManagerAddress(address _permissionManagerAddress) public requiresAuth {\n        _setPermissionManagerAddress(_permissionManagerAddress);\n    }\n}\n"},"libs/Initializable/Initializable.sol":{"content":"// SPDX-License-Identifier: UNLICENSED\npragma solidity ^0.8.30;\n\nimport {InitializableView} from \"libs/Initializable/InitializableView.sol\";\n\n/**\n * @custom:security-contact blockchain@sygnum.com\n * @title Initializable\n * @notice Standard Initializable implementation that extends InitializableView\n * and exposes the public interface functions.\n * @dev This contract introduces an `initializer` modifier to prevent re-initialization of contracts,\n * ensuring that critical setup logic is executed only once, which is especially important in upgradeable contracts.\n */\nabstract contract Initializable is InitializableView {\n}\n"},"libs/UUPS/UUPSTimelockUpgradeable.sol":{"content":"// SPDX-License-Identifier: UNLICENSED\npragma solidity ^0.8.30;\n\nimport {UUPSTimelockUpgradeableView} from './UUPSTimelockUpgradeableView.sol';\n\n/**\n * @custom:security-contact blockchain@sygnum.com\n * @title UUPSTimelockUpgradeable\n * @author Sygnum\n * @notice Standard UUPS Timelock implementation that extends UUPSTimelockUpgradeableView\n *         and exposes the public interface functions.\n *         Combines UUPS upgradeability with Timelock functionality for secure, delayed upgrades.\n *         Enables governance mechanisms where upgrades are executed only after a specified delay,\n *         providing a safety window for stakeholders.\n */\nabstract contract UUPSTimelockUpgradeable is UUPSTimelockUpgradeableView {\n\n    /* ======== External/Public State-Changing Functions ======== */\n\n    /**\n     * @notice Upgrades the implementation and optionally executes a function call.\n     * @param _newImplementation The address of the new implementation contract.\n     * @param _data Optional memory to execute after the upgrade.\n     */\n    function upgradeToAndCall(\n        address _newImplementation,\n        bytes memory _data\n    ) public onlyProxy {\n        _upgradeToAndCall(_newImplementation, _data);\n    }\n\n    /**\n     * @notice Executes the scheduled upgrade operation after the timelock delay has elapsed.\n     * @dev Finalizes the upgrade by executing the operation previously scheduled via `queueUpgrade`.\n     *      Checks that the upgrade is authorized and the timelock conditions are met before proceeding.\n     *      Upon successful execution, the upgrade operation is cleared from storage.\n     * @custom:reverts NoUpgradeScheduled if there is no upgrade operation in progress.\n     * @custom:reverts TimelockDoesNotExist if the scheduled operation does not exist.\n     * @custom:reverts TimelockNotReached if the timelock delay has not yet elapsed.\n     */\n    function executeUpgrade() public isUpgrading {\n        _executeUpgrade();\n    }\n\n    /**\n     * @notice Cancels a scheduled upgrade operation.\n     * @dev Allows cancellation of a previously scheduled upgrade operation at any time before it is finalized.\n     *      Removes the scheduled operation from storage, preventing it from being executed in the future.\n     *      If no upgrade is currently scheduled, this function has no effect.\n     * @custom:emits Canceled(bytes32 operationId) when the operation is successfully canceled.\n     */\n    function cancelUpgrade() public isUpgrading {\n        _cancelUpgrade();\n    }\n\n    /**\n     * @notice Executes the upgrade to a new implementation with optional initialization data.\n     * @dev Intended to be called internally by the contract itself as part of the timelock upgrade flow.\n     *      Performs the upgrade to the specified implementation and optionally executes additional setup logic.\n     *      Access control is enforced within the internal _callUpgradeToAndCallUUPS function via the `isInternalCall` modifier.\n     * @param _newImplementation The address of the new implementation contract.\n     * @param _data Optional initialization calldata to execute on the new implementation after the upgrade.\n     */\n    function callUpgradeToAndCallUUPS(\n        address _newImplementation,\n        bytes memory _data\n    ) public {\n        _callUpgradeToAndCallUUPS(_newImplementation, _data);\n    }\n}\n"},"libs/FundRecovery/FundRecoveryCore.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.30;\n\nimport {IERC20} from \"libs/ERC20/interfaces/IERC20.sol\";\n\n/**\n * @custom:security-contact blockchain@sygnum.com\n * @title FundRecoveryCore\n * @author SYGNUM AG - Blockchain team 3301\n * @notice Core fund recovery implementation for recovering native tokens and ERC20 tokens\n * @dev This library provides the core logic for recovering funds from contracts.\n *      It handles both native tokens (ETH) and ERC20 tokens, including fee-on-transfer tokens.\n *      Contracts inheriting from this can call the internal _recoverFunds function.\n */\nabstract contract FundRecoveryCore {\n    /* ======== ERRORS ======== */\n\n    error TransferFailed();\n\n    /* ======== EVENTS ======== */\n\n    event FundsRecovered(address indexed token, address indexed to, uint256 requestedAmount, uint256 actualAmountReceived);\n\n    /* ======== INTERNAL STATE-CHANGING FUNCTIONS ======== */\n\n    /**\n     * @notice Recovers funds from the contract\n     * @dev If _token is address(0), recovers native token (ETH), else recovers ERC20 tokens\n     * For ERC-20 tokens, the emitted amounts include both the requested amount and the actual amount received,\n     * which may differ for fee-on-transfer tokens.\n     * @param _token The token address (zero for native)\n     * @param _to The recipient address\n     * @param _amount The amount to recover (in wei for native ETH, in token's smallest unit for ERC-20)\n     */\n    function _recoverFunds(address _token, address payable _to, uint256 _amount) internal {\n        bool _success;\n        uint256 _actualAmountReceived;\n\n        if (_token == address(0)) {\n            // Recover native token (ETH)\n            (_success,) = _to.call{value: _amount}(\"\");\n            if (!_success) {\n                revert TransferFailed();\n            }\n            _actualAmountReceived = _amount;\n        } else {\n            // Recover ERC20 token\n            // Measure actual amount received for fee-on-transfer tokens\n            IERC20 _tokenContract = IERC20(_token);\n            uint256 _balanceBefore = _tokenContract.balanceOf(_to);\n\n            // Use low-level call to handle all token types:\n            // - Tokens that revert\n            // - Tokens that return false\n            // - Non-standard tokens that don't return a value (like USDT)\n            bytes memory _returndata;\n            // solhint-disable-next-line avoid-low-level-calls\n            (_success, _returndata) = _token.call(\n                abi.encodeWithSelector(IERC20.transfer.selector, _to, _amount)\n            );\n            // Check if call succeeded and validate return data\n            // Success means: call succeeded AND (no return data OR return data decodes to true)\n            if (!_success || (_returndata.length > 0 && !abi.decode(_returndata, (bool)))) {\n                revert TransferFailed();\n            }\n\n            uint256 _balanceAfter = _tokenContract.balanceOf(_to);\n\n            _actualAmountReceived = _balanceAfter - _balanceBefore;\n        }\n\n        emit FundsRecovered(_token, _to, _amount, _actualAmountReceived);\n    }\n}\n"},"libs/Pausable/interfaces/IPausable.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.28;\n\n/**\n * @custom:security-contact blockchain@sygnum.com\n * @title IPausable\n * @notice Interface for pausable functionality\n * @dev Defines the external interface for contracts that can be paused and unpaused\n */\ninterface IPausable {\n    /* ======== VIEW FUNCTIONS ======== */\n\n    /**\n     * @notice Returns whether the contract is paused\n     * @return True if the contract is paused, false otherwise\n     */\n    function isPaused() external view returns (bool);\n\n    /* ======== STATE-CHANGING FUNCTIONS ======== */\n\n    /**\n     * @notice Pauses the contract\n     * @dev Only callable by authorized accounts (e.g., pausers)\n     */\n    function pause() external;\n\n    /**\n     * @notice Unpauses the contract\n     * @dev Only callable by authorized accounts (e.g., pausers)\n     */\n    function unpause() external;\n}"},"libs/Permissioned/PermissionedCore.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.28;\n\n/**\n * @custom:security-contact blockchain@sygnum.com\n * @title PermissionedCore\n * @notice Core permission implementation with slot storage pattern\n * @dev This contract provides the core role-based access control logic without exposing public functions.\n * Contracts inheriting from this will be able to perform role-based access control checks\n * using the requiresAuth modifier. This is the core implementation that should be inherited by contracts\n * that need custom permission logic.\n */\nabstract contract PermissionedCore {\n    /* ======== STATE VARIABLES ======== */\n    \n    /**\n     * @dev PERMISSIONED_CORE_STORAGE_SLOT is a constant used to locate the PermissionedStorage struct in storage for PermissionedCore.\n     * This ensures a unique storage slot for the permission manager address, minimizing collision risks with other storage variables in the contract.\n     * The value is calculated as keccak256(abi.encode(uint256(keccak256(\"PermissionedCore.PermissionedStorage\")) - 1)) & ~bytes32(uint256(0xff)).\n     */\n    bytes32 private constant PERMISSIONED_CORE_STORAGE_SLOT =\n        0x1fa5656f3245be71aa51744436d19e5d46b909e499930c5c32c93901cab52900;\n\n    /// @custom:storage-location erc7201:PermissionedCore.PermissionedStorage\n    struct PermissionedStorage {\n        address permissionManagerAddress;\n    }\n\n    /* ========== ERRORS ========== */\n\n    error Unauthorized();\n\n    /* ========== MODIFIERS ========== */\n\n    /**\n     * @notice Authorization modifier that delegates to the PermissionManager\n     * @dev Calls _isAuthorized which makes a staticcall to the PermissionManager's canCall function\n     */\n    modifier requiresAuth() {\n        _isAuthorized(msg.sender, msg.sig);\n        _;\n    }\n\n    /* ========== INTERNAL VIEW FUNCTIONS ========== */\n\n    /**\n     * @notice Returns the address of the permission manager\n     * @return The address of the permission manager\n     */\n    function _getPermissionManagerAddress() internal view returns (address) {\n        PermissionedStorage storage $ = _getPermissionedStorage();\n        return $.permissionManagerAddress;\n    }\n\n    /* ========== INTERNAL INITIALIZER ========== */\n\n    /**\n     * @notice Initializes the permission system with a permission manager\n     * @dev Idempotent: Only initializes if permissionManagerAddress is not already set (default value is address(0)).\n     *      This preserves existing permission manager during upgrades - new init data will not override existing value.\n     * @param _permissionManagerAddress The address of the permission manager contract\n     */\n    function _permissioned_init(address _permissionManagerAddress) internal {\n        PermissionedStorage storage $ = _getPermissionedStorage();\n        if ($.permissionManagerAddress == address(0)) {\n            _setPermissionManagerAddress(_permissionManagerAddress);\n        }\n    }\n\n    /* ========== INTERNAL FUNCTIONS ========== */\n    \n    /**\n     * @notice Sets the permission manager address\n     * @param _permissionManagerAddress The new permission manager address\n     */\n    function _setPermissionManagerAddress(address _permissionManagerAddress) internal {\n        PermissionedStorage storage $ = _getPermissionedStorage();\n        $.permissionManagerAddress = _permissionManagerAddress;\n    }\n    \n    /**\n     * @dev Internal function to check if the caller is authorized to call a function.\n     * Reverts with Unauthorized if the caller is not authorized.\n     * @param _caller The address of the caller\n     * @param _functionSig The function signature being called\n     */\n    function _isAuthorized(address _caller, bytes4 _functionSig) internal view {\n        // Call the canCall function on the permissionManagerAddress contract\n        (bool _success, bytes memory _result) = _getPermissionManagerAddress().staticcall(\n            abi.encodeWithSignature(\"canCall(address,bytes4)\", _caller, _functionSig)\n        );\n\n        if (!_success || !abi.decode(_result, (bool))) {\n            revert Unauthorized();\n        }\n    }\n\n    /* ======== PRIVATE VIEW/PURE FUNCTIONS ======== */\n\n    /**\n     * @notice Retrieves the PermissionedStorage struct from the storage slot\n     * @dev Returns the PermissionedStorage struct\n     */\n    function _getPermissionedStorage()\n        private\n        pure\n        returns (PermissionedStorage storage $)\n    {\n        // Use assembly to simply slot the storage location into a variable\n        // solhint-disable-next-line no-inline-assembly\n        assembly {\n            $.slot := PERMISSIONED_CORE_STORAGE_SLOT\n        }\n    }\n}\n"},"libs/Permissioned/PermissionedView.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.28;\n\nimport {PermissionedCore} from \"libs/Permissioned/PermissionedCore.sol\";\n\n/**\n * @custom:security-contact blockchain@sygnum.com\n * @title PermissionedView\n * @author SYGNUM AG - Blockchain team 3301\n * @notice View-only Permissioned implementation that exposes permission manager address\n * @dev This contract provides read-only access to permission manager state without\n *      allowing modification. It's designed for contracts that need to query the\n *      permission manager but should not modify it directly.\n */\nabstract contract PermissionedView is PermissionedCore {\n    /*//////////////////////////////////////////////////////////////\n                        EXTERNAL/PUBLIC VIEW FUNCTIONS\n    //////////////////////////////////////////////////////////////*/\n\n    /**\n     * @notice Returns the address of the permission manager contract\n     * @return The address of the permission manager, or zero address if not set\n     */\n    function getPermissionManagerAddress() public view returns (address) {\n        return _getPermissionManagerAddress();\n    }\n}\n"},"libs/Initializable/InitializableCore.sol":{"content":"// SPDX-License-Identifier: UNLICENSED\npragma solidity ^0.8.30;\n\n/**\n * @custom:security-contact blockchain@sygnum.com\n * @title InitializableCore\n * @notice Core implementation of initialization functionality with slot storage pattern\n * @dev This contract provides the core initialization logic without exposing public functions.\n * It uses a storage slot to track initialization status, minimizing gas costs and avoiding storage collisions.\n * This is the core implementation that should be inherited by contracts that need custom initialization logic.\n */\nabstract contract InitializableCore {\n    /* ======== Custom Errors ======== */\n    error InvalidInitialization();\n\n    /* ======== Events ======== */\n    event Initialized();\n\n    /* ======== State variables ======== */\n    /**\n     * @dev INITIALIZED_CORE_STORAGE_SLOT is a constant used to locate the initialization status in storage for InitializableCore.\n     * This ensures a unique storage slot for the initialized flag, minimizing collision risks with other storage variables in the contract.\n     * The value is calculated as keccak256(abi.encode(uint256(keccak256(\"InitializableCore.InitializedStorage\")) - 1)) & ~bytes32(uint256(0xff)).\n     * @custom:storage-location erc7201:InitializableCore.InitializedStorage\n     */\n    bytes32 private constant INITIALIZED_CORE_STORAGE_SLOT =\n        0x112dd7b7d700a9bfd03edf4d4ce6f92b1f5f1a2fd81fde871f4db11384aa0b00;\n\n    /* ======== Modifiers ======== */\n    /// @notice Ensures the initializer function can only be called once.\n    modifier initializer() {\n        if (_isInitialized()) {\n            revert InvalidInitialization();\n        }\n        _setInitialized();\n        _;\n    }\n\n    /* ======== Internal Pure/View Functions ======== */\n    /// @notice Checks if the contract has been initialized.\n    /// @return value True if the contract has been initialized, false otherwise.\n    function _isInitialized() internal view returns (bool value) {\n        // solhint-disable-next-line no-inline-assembly\n        assembly ('memory-safe') {\n            value := sload(INITIALIZED_CORE_STORAGE_SLOT)\n        }\n    }\n\n    /* ======== Internal/Private Storage Manipulation Functions ======== */\n    /// @notice Sets the initialized state of the contract.\n    /// @dev Uses assembly for gas efficiency when writing to the storage slot.\n    function _setInitialized() internal {\n        // solhint-disable-next-line no-inline-assembly\n        assembly ('memory-safe') {\n            sstore(INITIALIZED_CORE_STORAGE_SLOT, 1)\n        }\n        emit Initialized();\n    }\n\n    /// @notice Resets the initialized state of the contract.\n    function _resetInitialized() internal {\n        // solhint-disable-next-line no-inline-assembly\n        assembly ('memory-safe') {\n            sstore(INITIALIZED_CORE_STORAGE_SLOT, 0)\n        }\n    }\n}\n"},"libs/Initializable/InitializableView.sol":{"content":"// SPDX-License-Identifier: UNLICENSED\npragma solidity ^0.8.30;\n\nimport {InitializableCore} from \"libs/Initializable/InitializableCore.sol\";\n\n/**\n * @custom:security-contact blockchain@sygnum.com\n * @title InitializableView\n * @author SYGNUM AG - Blockchain team 3301\n * @notice View-only Initializable implementation that exposes initialization status\n * @dev This contract provides read-only access to initialization state without\n *      allowing initialization modifications. It's designed for contracts that need\n *      to query initialization status but should not modify state directly.\n */\nabstract contract InitializableView is InitializableCore {\n    /*//////////////////////////////////////////////////////////////\n                        EXTERNAL/PUBLIC VIEW FUNCTIONS\n    //////////////////////////////////////////////////////////////*/\n\n    /**\n     * @notice Returns the initialization status of the contract\n     * @return Whether the contract has been initialized\n     */\n    function isInitialized() public view returns (bool) {\n        return _isInitialized();\n    }\n}\n"},"libs/UUPS/UUPSTimelockUpgradeableCore.sol":{"content":"// SPDX-License-Identifier: UNLICENSED\npragma solidity ^0.8.30;\n\nimport {UUPSUpgradeableCore} from './UUPSUpgradeableCore.sol';\nimport {Timelock} from 'libs/Timelock/Timelock.sol';\nimport {BytesLib} from 'libs/utils/bytes/BytesLib.sol';\n\n/**\n * @custom:security-contact blockchain@sygnum.com\n * @title UUPSTimelockUpgradeableCore\n * @author Sygnum\n * @notice Core implementation that combines UUPS upgradeability with Timelock functionality for secure, delayed upgrades.\n *         Contains only internal functions for use by derived contracts.\n *         Enables governance mechanisms where upgrades are executed only after a specified delay,\n *         providing a safety window for stakeholders.\n *         Inherits from both `UUPSUpgradeableCore` for upgradeability and `Timelock` for delayed execution.\n */\nabstract contract UUPSTimelockUpgradeableCore is UUPSUpgradeableCore, Timelock {\n    using BytesLib for bytes;\n\n    /* ======== Custom Errors ======== */\n    error AlreadyUpgrading();\n    error NoUpgradeScheduled();\n    error UnAuthorizedCall();\n    error InvalidDelay();\n    error InvalidUpgradeCalldata();\n\n    event Callers(address indexed caller, address indexed context);\n\n    /* ======== State Variables ======== */\n    /**\n     * @dev Storage slot for tracking the upgrade operation state.\n     *      Prevents re-entrancy during the upgrade process.\n     *      keccak256(abi.encode(uint256(keccak256(\"UUPSTimelockUpgradeableCore.TimelockUpgradeableStorage\")) - 1)) & ~bytes32(uint256(0xff))\n     */\n    bytes32 private constant UUPS_TIMELOCK_UPGRADEABLE_CORE_STORAGE_SLOT =\n        0x2c9356b94ada349e65b0a691cd15e24beddfc13e05a26de25d9c64509c824400;\n\n    /// @custom:storage-location erc7201:UUPSTimelockUpgradeableCore.TimelockUpgradeableStorage\n    struct TimelockUpgradeableStorage {\n        /// @notice The hash of the currently scheduled upgrade operation, or zero if none.\n        bytes32 operationId;\n        /// @notice The delay in seconds before a queued operation can be executed.\n        uint256 delay;\n    }\n\n    /* ======== Modifiers ======== */\n\n    /// @notice Ensures the contract is not currently upgrading.\n    modifier isNotUpgrading() {\n        if (_isUpgrading()) {\n            revert AlreadyUpgrading();\n        }\n        _;\n    }\n\n    /// @notice Ensures the contract is currently upgrading.\n    modifier isUpgrading() {\n        if (!_isUpgrading()) {\n            revert NoUpgradeScheduled();\n        }\n        _;\n    }\n\n    /// @notice Restricts function to internal calls only.\n    modifier isInternalCall() {\n        emit Callers(msg.sender, address(this));\n        if (msg.sender != address(this)) revert UnAuthorizedCall();\n        _;\n    }\n\n    /* ======== Internal Initializer ======== */\n\n    /**\n     * @notice Initializes the UUPSTimelock with a specified delay.\n     * @dev Idempotent: Only initializes if delay is not already set (default value is 0).\n     *      This preserves existing delay during upgrades - new init data will not override existing delay.\n     * @param _delay The delay in seconds before a queued operation can be executed.\n     */\n    function _UUPSTimelock_init(uint256 _delay) internal {\n        TimelockUpgradeableStorage storage $ = _getTimelockUpgradeableStorage();\n        if ($.delay == 0) {\n            _setDelay(_delay);\n        }\n    }\n\n    /* ======== Internal State-Changing Functions ======== */\n\n    /**\n     * @notice Executes the scheduled upgrade operation after the timelock delay has elapsed.\n     * @dev Finalizes the upgrade by executing the operation previously scheduled via `queueUpgrade`.\n     *      Checks that the upgrade is authorized and the timelock conditions are met before proceeding.\n     *      Decodes the scheduled calldata to extract the new implementation address and initialization data,\n     *      then invokes _authorizeUpgrade before executing the operation.\n     *      Upon successful execution, the upgrade operation is cleared from storage.\n     * @custom:reverts NoUpgradeScheduled if there is no upgrade operation in progress.\n     * @custom:reverts TimelockDoesNotExist if the scheduled operation does not exist.\n     * @custom:reverts TimelockNotReached if the timelock delay has not yet elapsed.\n     * @custom:reverts InvalidUpgradeCalldata if the scheduled calldata is invalid.\n     */\n    function _executeUpgrade() internal {\n        TimelockUpgradeableStorage storage $ = _getTimelockUpgradeableStorage();\n        bytes32 _operationId = $.operationId;\n        (, bytes memory _data, , ) = getScheduledOperationDetails(_operationId);\n\n        // Decode the scheduled calldata to extract newImplementation and initData\n        (address _newImplementation, bytes memory _initData) = _decodeUpgradeCalldata(_data);\n\n        // Authorize the upgrade with the correct parameters\n        _authorizeUpgrade(_newImplementation, _initData);\n\n        _executeScheduledOperation(_operationId);\n        delete $.operationId;\n    }\n\n    /**\n     * @notice Cancels a scheduled upgrade operation.\n     * @dev Allows cancellation of a previously scheduled upgrade operation at any time before it is finalized.\n     *      Decodes the scheduled calldata to extract the new implementation address and initialization data,\n     *      then invokes _authorizeUpgrade before canceling the operation.\n     *      Removes the scheduled operation from storage, preventing it from being executed in the future.\n     *      If no upgrade is currently scheduled, this function has no effect.\n     * @custom:emits Canceled(bytes32 operationId) when the operation is successfully canceled.\n     * @custom:reverts InvalidUpgradeCalldata if the scheduled calldata is invalid.\n     */\n    function _cancelUpgrade() internal {\n        TimelockUpgradeableStorage storage $ = _getTimelockUpgradeableStorage();\n        bytes32 _operationId = $.operationId;\n        (, bytes memory _data, , ) = getScheduledOperationDetails(_operationId);\n\n        // Decode the scheduled calldata to extract newImplementation and initData\n        (address _newImplementation, bytes memory _initData) = _decodeUpgradeCalldata(_data);\n\n        // Authorize the upgrade cancellation with the correct parameters\n        _authorizeUpgrade(_newImplementation, _initData);\n\n        _cancelScheduledOperation(_operationId);\n        delete $.operationId;\n    }\n\n    /**\n     * @notice Executes the upgrade to a new implementation with optional initialization data.\n     * @dev Intended to be called internally by the contract itself as part of the timelock upgrade flow.\n     *      Performs the upgrade to the specified implementation and optionally executes additional setup logic.\n     *      Access is restricted to internal calls only via the `isInternalCall` modifier.\n     * @param _newImplementation The address of the new implementation contract.\n     * @param _data Optional initialization calldata to execute on the new implementation after the upgrade.\n     */\n    function _callUpgradeToAndCallUUPS(\n        address _newImplementation,\n        bytes memory _data\n    ) internal isInternalCall {\n        _upgradeToAndCallUUPS(_newImplementation, _data);\n    }\n\n    /**\n     * @notice Schedules the upgrade operation with the timelock.\n     * This is a overrideable function to be overridden by derived contracts to implement custom validations.\n     * @dev Schedules the upgrade operation to be executed after the timelock delay.\n     * @param _newImplementation The address of the new implementation contract.\n     * @param _data The data to be passed to the `callUpgradeToAndCallUUPS` function.\n     */\n    function _triggerUpgrade(\n        address _newImplementation,\n        bytes memory _data\n    ) internal virtual override {\n        _scheduleUpgrade(_newImplementation, _data);\n    }\n\n    /**\n     * @notice Schedules the upgrade operation with the timelock.\n     * @dev Encodes the upgrade operation and schedules it for execution after the delay.\n     * @param _newImplementation The address of the new implementation contract.\n     * @param _data The data to be passed to the `callUpgradeToAndCallUUPS` function.\n     */\n    function _scheduleUpgrade(\n        address _newImplementation,\n        bytes memory _data\n    ) internal isNotUpgrading {\n        TimelockUpgradeableStorage storage $ = _getTimelockUpgradeableStorage();\n        // Add the delay to the current block timestamp to get the scheduled execution time ahead of the current block.\n        // solhint-disable-next-line not-rely-on-time\n        uint256 _executionTimestamp = block.timestamp + $.delay;\n\n        bytes32 _operationId = _scheduleOperation(\n            address(this),\n            abi.encodeWithSignature(\n                \"callUpgradeToAndCallUUPS(address,bytes)\",\n                _newImplementation,\n                _data\n            ),\n            _executionTimestamp\n        );\n\n        $.operationId = _operationId;\n    }\n\n    /* ======== Private State-Changing Functions ======== */\n\n    /**\n     * @notice Sets the delay for the timelock.\n     * @dev Sets the delay in seconds before a queued operation can be executed.\n     * @param _delay The delay in seconds.\n     */\n    function _setDelay(uint256 _delay) private {\n        if (_delay == 0) revert InvalidDelay();\n        TimelockUpgradeableStorage storage $ = _getTimelockUpgradeableStorage();\n        $.delay = _delay;\n    }\n\n    /* ======== Private View/Pure Functions ======== */\n\n    /**\n     * @notice Decodes and validates scheduled upgrade calldata.\n     * @dev Extracts the new implementation address and initialization data from the scheduled operation calldata.\n     *      Validates that the function selector matches `callUpgradeToAndCallUUPS(address,bytes)`.\n     * @param _data The encoded calldata from the scheduled operation.\n     * @return _newImplementation The address of the new implementation contract.\n     * @return _initData The initialization calldata to be executed on the new implementation.\n     * @custom:reverts InvalidUpgradeCalldata if the function selector does not match or decoding fails.\n     */\n    function _decodeUpgradeCalldata(\n        bytes memory _data\n    ) private pure returns (address _newImplementation, bytes memory _initData) {\n        // Validate minimum length for callUpgradeToAndCallUUPS(address,bytes):\n        // - 4 bytes:  function selector\n        // - 32 bytes: address parameter (newImplementation)\n        // - 32 bytes: offset to dynamic bytes data (required by ABI encoding, points to byte 64)\n        // - 32 bytes: length of bytes array (can be 0 for empty initData)\n        // Total: 100 bytes minimum (data itself can be empty)\n        if (_data.length < 100) {\n            revert InvalidUpgradeCalldata();\n        }\n\n        // Decode the parameters\n        // Skip the first 4 bytes (selector) and decode (address, bytes)\n        (_newImplementation, _initData) = abi.decode(\n            _data.slice(4, _data.length),\n            (address, bytes)\n        );\n    }\n\n    /**\n     * @notice Checks if the contract is currently in the upgrading state.\n     * @return value `true` if the contract is upgrading, `false` otherwise.\n     */\n    function _isUpgrading() private view returns (bool) {\n        TimelockUpgradeableStorage storage $ = _getTimelockUpgradeableStorage();\n        return $.operationId != bytes32(0);\n    }\n\n    /**\n     * @dev Returns the TimelockUpgradeableStorage struct.\n     */\n    function _getTimelockUpgradeableStorage()\n        private\n        pure\n        returns (TimelockUpgradeableStorage storage $)\n    {\n        // Use assembly to simply slot the storage location into a variable\n        // solhint-disable-next-line no-inline-assembly\n        assembly {\n            $.slot := UUPS_TIMELOCK_UPGRADEABLE_CORE_STORAGE_SLOT\n        }\n    }\n}\n"},"libs/UUPS/UUPSTimelockUpgradeableView.sol":{"content":"// SPDX-License-Identifier: UNLICENSED\npragma solidity ^0.8.30;\n\nimport {UUPSTimelockUpgradeableCore} from './UUPSTimelockUpgradeableCore.sol';\nimport {UUPSUtils} from './UUPSUtils.sol';\nimport {IUUPSAsynchronousUpgradeable} from './interface/IUUPSAsynchronousUpgradeable.sol';\n\n/**\n * @custom:security-contact blockchain@sygnum.com\n * @title UUPSTimelockUpgradeableView\n * @author SYGNUM AG - Blockchain team 3301\n * @notice View-only UUPS Timelock upgrade implementation that exposes view functions\n * @dev This contract provides read-only access to UUPS Timelock upgrade state without\n *      allowing upgrade modifications. It's designed for contracts that need to query\n *      upgrade and timelock information but should not perform upgrades directly.\n *      Note: This implementation is independent of UUPSUpgradeableView due to Core\n *      layer inheritance differences (UUPSTimelockUpgradeableCore inherits from both\n *      UUPSUpgradeableCore and Timelock).\n */\nabstract contract UUPSTimelockUpgradeableView is UUPSTimelockUpgradeableCore, IUUPSAsynchronousUpgradeable {\n    /*//////////////////////////////////////////////////////////////\n                        EXTERNAL/PUBLIC VIEW FUNCTIONS\n    //////////////////////////////////////////////////////////////*/\n\n    /**\n     * @notice Returns the storage slot used by the implementation\n     * @dev Reverts if called through a proxy to prevent bricking\n     * @return The storage slot used by the implementation\n     */\n    function proxiableUUID() external view notDelegated returns (bytes32) {\n        return _proxiableUUID();\n    }\n\n    /**\n     * @notice Returns the current implementation address\n     * @dev Returns the address stored in the ERC-1967 implementation slot\n     * @return The address of the current implementation contract\n     */\n    function getImplementation() external view returns (address) {\n        return UUPSUtils.getImplementation();\n    }\n}\n"},"apps/tokenization/SygToken/contracts/SygToken.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.30;\n\nimport {StorageLayout} from './storage/StorageLayout.sol';\nimport {Initializable} from \"libs/Initializable/Initializable.sol\";\nimport {ERC20SygToken} from \"./ERC20SygToken.sol\";\nimport {UUPSTimelockUpgradeable} from \"libs/UUPS/UUPSTimelockUpgradeable.sol\";\nimport {ChainlinkDataFeed} from \"./ChainlinkDataFeed.sol\";\nimport {ISygFactory} from \"apps/tokenization/SygFactory/interfaces/ISygFactory.sol\";\nimport {PausableSygToken} from \"./PausableSygToken.sol\";\nimport {FundRecoveryCore} from \"libs/FundRecovery/FundRecoveryCore.sol\";\n\n/**\n * @title SygToken\n * @author SYGNUM AG - Blockchain team 3301\n * @notice Tokenization contract for creating and managing digital assets with role-based permissions\n * @dev This contract combines ERC20 functionality with permission management for controlled tokenization.\n *      It supports features like minting, burning, and transfer restrictions based on user roles.\n *      Uses UUPSTimelockUpgradeable for secure, delayed upgrades.\n */\n // TODO: Inherit from ISygToken\n/**\n * @custom:security-contact blockchain@sygnum.com\n */\ncontract SygToken is Initializable, ERC20SygToken, UUPSTimelockUpgradeable, ChainlinkDataFeed, PausableSygToken, FundRecoveryCore {\n    /* ======== ERRORS ======== */\n\n    error ContractNotInitializedAfterUpgrade();\n    error UnauthorizedUpgrade(address caller, address expectedPermissionManager);\n    error SameTokenURI(string _tokenURI);\n\n    /* ======== EVENTS ======== */\n\n    event TokenURIUpdated(string previousTokenURI, string newTokenURI);\n    event ForcedTransfer(address indexed from, address indexed to, uint256 amount);\n\n    /* ======== INITIALIZER ======== */\n\n    /**\n     * @notice Initializes the SygToken contract\n     * @param _name The name of the token\n     * @param _symbol The symbol of the token\n     * @param _decimals The number of decimals for the token\n     * @param _tokenURI The URI for the token metadata\n     * @param _permissionManagerAddress Address of the permission manager contract\n     * @param _timelockDelaySeconds The delay in seconds before upgrades can be executed\n     */\n    function initialize(\n        string memory _name,\n        string memory _symbol,\n        uint8 _decimals,\n        string memory _tokenURI,\n        address _permissionManagerAddress,\n        uint256 _timelockDelaySeconds\n    ) public onlyProxy initializer {\n        _erc20_init(_name, _symbol, _decimals);\n        _permissioned_init(_permissionManagerAddress);\n        _UUPSTimelock_init(_timelockDelaySeconds);\n        if (bytes(getTokenURI).length == 0) {\n            getTokenURI = _tokenURI;\n        }\n    }\n\n    /* ======== EXTERNAL/PUBLIC STATE-CHANGING FUNCTIONS ======== */\n\n    /**\n     * @notice Forcefully transfers tokens from any account to a whitelisted receiver\n     * @param _from The sender address\n     * @param _to The recipient address (must be TOKEN_USER)\n     * @param _amount The amount to transfer\n     */\n    function forcedTransfer(address _from, address _to, uint256 _amount) external onlyTokenUser(_to) requiresAuth whenNotPaused {\n        _transfer(_from, _to, _amount);\n        emit ForcedTransfer(_from, _to, _amount);\n    }\n\n    /**\n     * @notice Updates the token URI\n     * @param _newTokenURI The new token URI\n     */\n    function updateTokenURI(string memory _newTokenURI) external requiresAuth whenNotPaused {\n        string memory _previousTokenURI = getTokenURI;\n        if (keccak256(bytes(_previousTokenURI)) == keccak256(bytes(_newTokenURI))) {\n            revert SameTokenURI(_newTokenURI);\n        }\n        getTokenURI = _newTokenURI;\n        emit TokenURIUpdated(_previousTokenURI, _newTokenURI);\n    }\n\n    /**\n     * @notice Recovers funds from the contract\n     * @dev If _token is address(0), recovers native token (ETH), else recovers ERC20 tokens\n     * For ERC-20 tokens, the emitted amounts include both the requested amount and the actual amount received,\n     * which may differ for fee-on-transfer tokens.\n     * @param _token The token address (zero for native)\n     * @param _to The recipient address\n     * @param _amount The amount to recover (in wei for native ETH, in token's smallest unit for ERC-20)\n     */\n    function recoverFunds(address _token, address payable _to, uint256 _amount) external requiresAuth whenNotPaused {\n        _recoverFunds(_token, _to, _amount);\n    }\n\n    /* ======== VIEW FUNCTIONS ======== */\n\n    /**\n     * @notice Marker function to identify SygToken implementations\n     * @dev This function provides a reliable way to check if a contract is a SygToken implementation\n     *      without relying on functions that may revert in certain states (like getPriceFeedDecimals\n     *      when oracle is not configured). This is used by SygTokenChecker for safe interface detection.\n     * @return True, indicating this is a SygToken implementation\n     */\n    function isSygTokenImplementation() external pure returns (bool) {\n        return true;\n    }\n\n    /* ======== UUPS UPGRADE HOOKS ======== */\n\n    /**\n     * @notice Authorizes upgrade to a new implementation\n     * @dev Only callable by the permission manager (TokenManager/SygFactory)\n     */\n    function _authorizeUpgrade(\n        address,\n        bytes memory\n    ) internal view virtual override {\n        if (msg.sender != getPermissionManagerAddress()) {\n            revert UnauthorizedUpgrade(msg.sender, getPermissionManagerAddress());\n        }\n    }\n\n    /**\n     * @notice Hook that is called before an upgrade is executed\n     * @dev Resets the initialized state only if upgrade data is provided (indicating re-initialization is needed)\n     */\n    function _preUpgradeToAndCallUUPS(address, bytes memory _data) internal virtual override {\n        if (_data.length > 0) {\n            _resetInitialized();\n        }\n    }\n\n    /**\n     * @notice Hook that is called after an upgrade is executed\n     * @dev Enforces that initialization must happen after upgrade when data is provided\n     */\n    function _postUpgradeToAndCallUUPS(\n        address,\n        bytes memory _data\n    ) internal view virtual override {\n        if (_data.length > 0 && !isInitialized()) {\n            revert ContractNotInitializedAfterUpgrade();\n        }\n    }\n}\n"},"libs/UUPS/interface/IUUPSSynchronousUpgradeable.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.30;\n\n/**\n * @custom:security-contact blockchain@sygnum.com\n * @title IUUPSSynchronousUpgradeable\n * @author SYGNUM AG - Blockchain team 3301\n * @notice Interface for synchronous UUPS upgrades that complete immediately\n * @dev Contracts implementing this interface perform upgrades synchronously,\n *      meaning the implementation is changed immediately when upgradeToAndCall is called.\n *      This is the classic UUPS upgrade pattern without any delay mechanism.\n */\ninterface IUUPSSynchronousUpgradeable {\n    /**\n     * @notice Upgrades the implementation and optionally executes a function call\n     * @dev The upgrade happens immediately when this function is called\n     * @param _newImplementation The address of the new implementation contract\n     * @param _data Optional calldata to execute after the upgrade\n     */\n    function upgradeToAndCall(address _newImplementation, bytes memory _data) external;\n\n    /**\n     * @notice Returns the current implementation address\n     * @dev Returns the address stored in the ERC-1967 implementation slot\n     * @return The address of the current implementation contract\n     */\n    function getImplementation() external view returns (address);\n}\n"},"libs/UUPS/interface/IUUPSAsynchronousUpgradeable.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.30;\n\nimport \"./IUUPSSynchronousUpgradeable.sol\";\n\n/**\n * @custom:security-contact blockchain@sygnum.com\n * @title IUUPSAsynchronousUpgradeable\n * @author SYGNUM AG - Blockchain team 3301\n * @notice Interface for asynchronous UUPS upgrades with timelock delay\n * @dev Contracts implementing this interface perform upgrades asynchronously,\n *      meaning the upgrade is scheduled when upgradeToAndCall is called and must be\n *      executed later via executeUpgrade after the timelock delay has elapsed.\n *      This provides a safety window for stakeholders to review pending upgrades.\n */\ninterface IUUPSAsynchronousUpgradeable is IUUPSSynchronousUpgradeable {\n    /**\n     * @notice Executes a previously scheduled upgrade after the timelock delay\n     * @dev Can only be called after the timelock delay has elapsed since scheduling\n     */\n    function executeUpgrade() external;\n\n    /**\n     * @notice Cancels a scheduled upgrade operation\n     * @dev Removes the scheduled upgrade before it is executed\n     */\n    function cancelUpgrade() external;\n}\n"},"apps/tokenization/SygToken/contracts/RolesManager.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.30;\n\nimport {PausableCore} from \"libs/Pausable/PausableCore.sol\";\nimport {Permissioned} from \"libs/Permissioned/Permissioned.sol\";\nimport {ISygFactory} from \"apps/tokenization/SygFactory/interfaces/ISygFactory.sol\";\n\n/**\n * @custom:security-contact blockchain@sygnum.com\n * @title RolesManager\n * @author SYGNUM AG - Blockchain team 3301\n * @notice Manages role checking and user management by delegating to SygFactory\n * @dev This contract provides role-based access control functions that delegate to the permission manager (SygFactory).\n *      SygFactory automatically determines the applicable groups based on msg.sender (this token contract).\n */\nabstract contract RolesManager is PausableCore, Permissioned {\n    /* ======== EVENTS ======== */\n\n    event MinterBurnerUpdated(address indexed account, bool minterBurner);\n    event TokenUserManagerUpdated(address indexed account, bool tokenUserManager);\n    event TokenUserUpdated(address indexed account, bool tokenUser);\n    event TokenUserBlacklisted(address indexed account, bool blacklist);\n\n    /* ======== EXTERNAL/PUBLIC VIEW/PURE FUNCTIONS ======== */\n\n    /**\n     * @notice Checks if an account is a role manager\n     * @dev Groups are automatically determined by SygFactory based on this token's address.\n     *      Returns true only if the account is whitelisted in at least one group AND not blacklisted\n     *      in any group (blacklist supersedes whitelist).\n     * @param _account The account address to check\n     * @return True if the account is a role manager\n     */\n    function isRoleManager(address _account) external view returns (bool) {\n        return ISygFactory(getPermissionManagerAddress()).isRoleManager(_account, new uint16[](0));\n    }\n\n    /**\n     * @notice Checks if an account is an operator\n     * @dev Groups are automatically determined by SygFactory based on this token's address.\n     *      Returns true only if the account is whitelisted in at least one group AND not blacklisted\n     *      in any group (blacklist supersedes whitelist).\n     * @param _account The account address to check\n     * @return True if the account is an operator\n     */\n    function isOperator(address _account) external view returns (bool) {\n        return ISygFactory(getPermissionManagerAddress()).isOperator(_account, new uint16[](0));\n    }\n\n    /**\n     * @notice Checks if an account is a system account\n     * @dev Groups are automatically determined by SygFactory based on this token's address.\n     *      Returns true only if the account is whitelisted in at least one group AND not blacklisted\n     *      in any group (blacklist supersedes whitelist).\n     * @param _account The account address to check\n     * @return True if the account is a system account\n     */\n    function isSystem(address _account) external view returns (bool) {\n        return ISygFactory(getPermissionManagerAddress()).isSystem(_account, new uint16[](0));\n    }\n\n    /**\n     * @notice Checks if an account is a pauser\n     * @dev Groups are automatically determined by SygFactory based on this token's address.\n     *      Returns true only if the account is whitelisted in at least one group AND not blacklisted\n     *      in any group (blacklist supersedes whitelist).\n     * @param _account The account address to check\n     * @return True if the account is a pauser\n     */\n    function isPauser(address _account) external view returns (bool) {\n        return ISygFactory(getPermissionManagerAddress()).isPauser(_account, new uint16[](0));\n    }\n\n    /**\n     * @notice Checks if an account is a minter/burner\n     * @dev Groups are automatically determined by SygFactory based on this token's address.\n     *      Returns true only if the account is whitelisted in at least one group AND not blacklisted\n     *      in any group (blacklist supersedes whitelist).\n     * @param _account The account address to check\n     * @return True if the account is a minter/burner\n     */\n    function isMinterBurner(address _account) external view returns (bool) {\n        return ISygFactory(getPermissionManagerAddress()).isMinterBurner(_account, new uint16[](0));\n    }\n\n    /**\n     * @notice Checks if an account is a token user manager\n     * @dev Groups are automatically determined by SygFactory based on this token's address.\n     *      Returns true only if the account is whitelisted in at least one group AND not blacklisted\n     *      in any group (blacklist supersedes whitelist).\n     * @param _account The account address to check\n     * @return True if the account is a token user manager\n     */\n    function isTokenUserManager(address _account) external view returns (bool) {\n        return ISygFactory(getPermissionManagerAddress()).isTokenUserManager(_account, new uint16[](0));\n    }\n\n    /**\n     * @notice Checks if an account is a token user\n     * @dev Groups are automatically determined by SygFactory based on this token's address.\n     *      Returns true only if the account is whitelisted in at least one group AND not blacklisted\n     *      in any group (blacklist supersedes whitelist).\n     * @param _account The account address to check\n     * @return True if the account is a token user\n     */\n    function isTokenUser(address _account) external view returns (bool) {\n        return ISygFactory(getPermissionManagerAddress()).isTokenUser(_account, new uint16[](0));\n    }\n\n    /* ======== EXTERNAL/PUBLIC STATE-CHANGING FUNCTIONS ======== */\n\n    /**\n     * @notice Updates the minter/burner status for a given account by calling SygFactory\n     * @param _account The address of the account to update\n     * @param _minterBurner True to give minter/burner role to the account, false to remove minter/burner role\n     */\n    function updateMinterBurner(address _account, bool _minterBurner) external requiresAuth whenNotPaused {\n        ISygFactory(getPermissionManagerAddress()).updateMinterBurner(0, _account, _minterBurner);\n        emit MinterBurnerUpdated(_account, _minterBurner);\n    }\n\n    /**\n     * @notice Updates the token user manager status for a given account by calling SygFactory\n     * @param _account The address of the account to update\n     * @param _tokenUserManager True to give token user manager role to the account, false to remove token user manager role\n     */\n    function updateTokenUserManager(address _account, bool _tokenUserManager) external requiresAuth whenNotPaused {\n        ISygFactory(getPermissionManagerAddress()).updateTokenUserManager(0, _account, _tokenUserManager);\n        emit TokenUserManagerUpdated(_account, _tokenUserManager);\n    }\n\n    /**\n     * @notice Updates the token user status for a given account by calling SygFactory\n     * @dev Requires custom group ID to be enabled (customGroupId != 0)\n     * @param _account The address of the account to update\n     * @param _tokenUser True to give token user role to the account, false to remove token user role\n     */\n    function updateTokenUser(address _account, bool _tokenUser) external requiresAuth whenNotPaused {\n        ISygFactory(getPermissionManagerAddress()).updateTokenUser(0, _account, _tokenUser);\n        emit TokenUserUpdated(_account, _tokenUser);\n    }\n\n    /**\n     * @notice Blacklist a user from the token user role for a given account by calling SygFactory\n     * @dev Requires custom group ID to be enabled (customGroupId != 0)\n     * @param _account The address of the account to update\n     * @param _blacklist True to blacklist the user from the token user role, false to unblacklist the user from the token user role\n     */\n    function blacklistTokenUser(address _account, bool _blacklist) external requiresAuth whenNotPaused {\n        ISygFactory(getPermissionManagerAddress()).blacklistTokenUser(0, _account, _blacklist);\n        emit TokenUserBlacklisted(_account, _blacklist);\n    }\n}\n"},"apps/tokenization/SygToken/contracts/ERC20SygToken.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.30;\n\nimport {ERC20} from \"libs/ERC20/ERC20.sol\";\nimport {RolesManager} from \"./RolesManager.sol\";\n\n/**\n * @custom:security-contact blockchain@sygnum.com\n * @title ERC20SygToken\n * @author SYGNUM AG - Blockchain team 3301\n * @notice ERC20 implementation with role-based access control and whitelist restrictions\n * @dev This contract extends ERC20 to add TOKEN_USER checks for transfers and approvals,\n *      and provides mint/burn functions restricted to authorized roles.\n *      All transfer operations respect the paused state.\n */\nabstract contract ERC20SygToken is ERC20, RolesManager {\n    /* ======== ERRORS ======== */\n\n    error NotTokenUser(address account);\n\n    /* ======== MODIFIERS ======== */\n\n    /**\n     * @notice Modifier to check if an address is a whitelisted token user\n     * @param _account The address to check\n     */\n    modifier onlyTokenUser(address _account) {\n        if (!this.isTokenUser(_account)) {\n            revert NotTokenUser(_account);\n        }\n        _;\n    }\n\n    /* ======== EXTERNAL/PUBLIC VIEW/PURE FUNCTIONS ======== */\n\n    /**\n     * @notice Transfers tokens from caller to recipient\n     * @dev Overrides ERC20 transfer to add TOKEN_USER whitelist checks and pause protection\n     * @param _to The recipient address\n     * @param _amount The amount to transfer\n     * @return True if transfer succeeded\n     */\n    function transfer(\n        address _to,\n        uint256 _amount\n    ) public virtual override requiresAuth onlyTokenUser(_to) whenNotPaused returns (bool) {\n        return _transfer(msg.sender, _to, _amount);\n    }\n\n    /**\n     * @notice Transfers tokens from one address to another using allowance\n     * @dev Overrides ERC20 transferFrom to add TOKEN_USER whitelist checks and pause protection\n     * @param _from The sender address\n     * @param _to The recipient address\n     * @param _amount The amount to transfer\n     * @return True if transfer succeeded\n     */\n    function transferFrom(\n        address _from,\n        address _to,\n        uint256 _amount\n    ) public override requiresAuth onlyTokenUser(_from) onlyTokenUser(_to) whenNotPaused returns (bool) {\n        return _transferFrom(_from, _to, _amount);\n    }\n\n    /**\n     * @notice Approves a spender to transfer tokens on behalf of caller\n     * @dev Overrides ERC20 approve to add pause protection\n     * @param _spender The address allowed to spend tokens\n     * @param _amount The amount of tokens the spender is allowed to spend\n     * @return True if approval succeeded\n     */\n    function approve(\n        address _spender,\n        uint256 _amount\n    ) public virtual override requiresAuth whenNotPaused returns (bool) {\n        return _approve(msg.sender, _spender, _amount);\n    }\n\n    /* ======== EXTERNAL/PUBLIC STATE-CHANGING FUNCTIONS ======== */\n\n    /**\n     * @notice EIP-2612 permit function to approve spending via signed message\n     * @dev Overrides ERC20 permit to add TOKEN_USER check for owner and pause protection\n     * @param _owner The token owner's address\n     * @param _spender The spender's address\n     * @param _value The amount of tokens to approve\n     * @param _deadline The timestamp after which the signature is no longer valid\n     * @param _v The recovery byte of the signature\n     * @param _r The first 32 bytes of the signature\n     * @param _s The second 32 bytes of the signature\n     */\n    function permit(\n        address _owner,\n        address _spender,\n        uint256 _value,\n        uint256 _deadline,\n        uint8 _v,\n        bytes32 _r,\n        bytes32 _s\n    ) public override requiresAuth onlyTokenUser(_owner) whenNotPaused {\n        _permit(_owner, _spender, _value, _deadline, _v, _r, _s);\n    }\n\n    /**\n     * @notice Mints new tokens to a specified address\n     * @param _to The address to mint tokens to (must be TOKEN_USER)\n     * @param _amount The amount of tokens to mint\n     */\n    function mint(address _to, uint256 _amount) external requiresAuth onlyTokenUser(_to) whenNotPaused {\n        _mint(_to, _amount);\n    }\n\n    /**\n     * @notice Burns tokens from a specified address\n     * @param _from The address to burn tokens from\n     * @param _amount The amount of tokens to burn\n     */\n    function burn(address _from, uint256 _amount) external requiresAuth onlyTokenUser(_from) whenNotPaused {\n        _burn(_from, _amount);\n    }\n}\n"},"apps/tokenization/SygFactory/interfaces/ISygFactory.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.30;\n\n/**\n * @custom:security-contact blockchain@sygnum.com\n * @title ISygFactory\n * @notice Interface for SygFactory contract\n * @dev Defines all public and external SygFactory functions\n */\ninterface ISygFactory {\n    /* ======== INITIALIZATION FUNCTIONS ======== */\n\n    /**\n     * @notice Initializes the SygFactory contract\n     * @param _initialImplementation The initial implementation address\n     * @param _destroyedImplementation The destroyed implementation address for SygTokenDestroyed\n     * @param _platformAdmin The address to be assigned the PLATFORM_ADMIN role\n     * @param _roleManager The address to be assigned the ROLE_MANAGER role\n     * @param _timelockDelaySeconds The delay in seconds before upgrades can be executed\n     */\n    function initialize(\n        address _initialImplementation,\n        address _destroyedImplementation,\n        address _platformAdmin,\n        address _roleManager,\n        uint256 _timelockDelaySeconds\n    ) external;\n\n    /* ======== ROLE CHECKING FUNCTIONS (from RolesManager) ======== */\n\n    /**\n     * @notice Checks if an account has role manager role within any of the specified groups\n     * @param _account The account address to check\n     * @param _groupIds The group IDs to check against\n     * @return True if the account has role manager role within any of the specified groups\n     */\n    function isRoleManager(address _account, uint16[] memory _groupIds) external view returns (bool);\n\n    /**\n     * @notice Checks if an account has operator role within any of the specified groups\n     * @param _account The account address to check\n     * @param _groupIds The group IDs to check against\n     * @return True if the account has operator role within any of the specified groups\n     */\n    function isOperator(address _account, uint16[] memory _groupIds) external view returns (bool);\n\n    /**\n     * @notice Checks if an account has system role within any of the specified groups\n     * @param _account The account address to check\n     * @param _groupIds The group IDs to check against\n     * @return True if the account has system role within any of the specified groups\n     */\n    function isSystem(address _account, uint16[] memory _groupIds) external view returns (bool);\n\n    /**\n     * @notice Checks if an account has pauser role within any of the specified groups\n     * @param _account The account address to check\n     * @param _groupIds The group IDs to check against\n     * @return True if the account has pauser role within any of the specified groups\n     */\n    function isPauser(address _account, uint16[] memory _groupIds) external view returns (bool);\n\n    /**\n     * @notice Checks if an account has minter/burner role within any of the specified groups\n     * @param _account The account address to check\n     * @param _groupIds The group IDs to check against\n     * @return True if the account has minter/burner role within any of the specified groups\n     */\n    function isMinterBurner(address _account, uint16[] memory _groupIds) external view returns (bool);\n\n    /**\n     * @notice Checks if an account has token user manager role within any of the specified groups\n     * @param _account The account address to check\n     * @param _groupIds The group IDs to check against\n     * @return True if the account has token user manager role within any of the specified groups\n     */\n    function isTokenUserManager(address _account, uint16[] memory _groupIds) external view returns (bool);\n\n    /**\n     * @notice Checks if an account has token role within any of the specified groups\n     * @param _account The account address to check\n     * @param _groupIds The group IDs to check against\n     * @return True if the account has token role within any of the specified groups\n     */\n    function isToken(address _account, uint16[] memory _groupIds) external view returns (bool);\n\n    /**\n     * @notice Checks if an account has token user role within any of the specified groups\n     * @param _account The account address to check\n     * @param _groupIds The group IDs to check against\n     * @return True if the account has token user role within any of the specified groups\n     */\n    function isTokenUser(address _account, uint16[] memory _groupIds) external view returns (bool);\n\n    /* ======== USER MANAGEMENT FUNCTIONS (from RolesManager) ======== */\n\n    /**\n     * @notice Updates role manager role for an account within a specific group\n     * @param _groupId The group ID for the account\n     * @param _account The account address to update\n     * @param _roleManager Whether to grant (true) or revoke (false) role manager role\n     */\n    function updateRoleManager(uint16 _groupId, address _account, bool _roleManager) external;\n\n    /**\n     * @notice Updates operator role for an account within a specific group\n     * @param _groupId The group ID for the account\n     * @param _account The account address to update\n     * @param _operator Whether to grant (true) or revoke (false) operator role\n     */\n    function updateOperator(uint16 _groupId, address _account, bool _operator) external;\n\n    /**\n     * @notice Updates system role for an account within a specific group\n     * @param _groupId The group ID for the account\n     * @param _account The account address to update\n     * @param _system Whether to grant (true) or revoke (false) system role\n     */\n    function updateSystem(uint16 _groupId, address _account, bool _system) external;\n\n    /**\n     * @notice Updates pauser role for an account within a specific group\n     * @param _groupId The group ID for the account\n     * @param _account The account address to update\n     * @param _pauser Whether to grant (true) or revoke (false) pauser role\n     */\n    function updatePauser(uint16 _groupId, address _account, bool _pauser) external;\n\n    /**\n     * @notice Updates minter/burner role for an account within a specific group\n     * @param _groupId The group ID for the account\n     * @param _account The account address to update\n     * @param _minterBurner Whether to grant (true) or revoke (false) minter/burner role\n     */\n    function updateMinterBurner(uint16 _groupId, address _account, bool _minterBurner) external;\n\n    /**\n     * @notice Updates token user manager role for an account within a specific group\n     * @param _groupId The group ID for the account\n     * @param _account The account address to update\n     * @param _tokenUserManager Whether to grant (true) or revoke (false) token user manager role\n     */\n    function updateTokenUserManager(uint16 _groupId, address _account, bool _tokenUserManager) external;\n\n    /**\n     * @notice Updates token user role for an account within a specific group\n     * @param _groupId The group ID for the account\n     * @param _account The account address to update\n     * @param _tokenUser Whether to grant (true) or revoke (false) token user role\n     */\n    function updateTokenUser(uint16 _groupId, address _account, bool _tokenUser) external;\n\n    /**\n     * @notice Blacklist a user from the token user role within a specific group\n     * @param _groupId The group ID for the account\n     * @param _account The account address to blacklist / unblacklist\n     * @param _blacklistTokenUser Whether to blacklist (true) or revoke the blacklist (false)\n     */\n    function blacklistTokenUser(uint16 _groupId, address _account, bool _blacklistTokenUser) external;\n\n    /* ======== TOKEN MANAGEMENT FUNCTIONS (from TokenManager) ======== */\n\n    /**\n     * @notice Gets the current SygToken implementation address\n     * @return implementationAddress The implementation address\n     */\n    function getSygTokenImplementation() external view returns (address implementationAddress);\n\n    /**\n     * @notice Updates the SygToken implementation address\n     * @param _newImplementation The new implementation address\n     */\n    function updateSygTokenImplementation(address _newImplementation) external;\n\n    /**\n     * @notice Deploys a new token with specified token configuration and group IDs\n     * @param _name The name of the token\n     * @param _symbol The symbol of the token\n     * @param _decimals The number of decimals for the token\n     * @param _tokenURI The URI for token metadata\n     * @param _groupIds The manual group IDs for the token (must be in range 0-1000), maximum 15 IDs\n     * @return _token The deployed token address\n     */\n    function deployToken(\n        string memory _name,\n        string memory _symbol,\n        uint8 _decimals,\n        string memory _tokenURI,\n        uint16[] memory _groupIds\n    ) external returns (address _token);\n\n    /**\n     * @notice Updates group IDs for a token\n     * @param _token The token address\n     * @param _groupIds The new group IDs for the token, maximum 15 IDs\n     */\n    function updateTokenGroupIds(address _token, uint16[] memory _groupIds) external;\n\n    /**\n     * @notice Enables a custom group ID for a token\n     * @param _token The token address\n     */\n    function enableCustomGroupId(address _token) external;\n\n    /**\n     * @notice Upgrades a token to the latest implementation\n     * @param _token The token address to upgrade\n     * @param _data The data to call on upgrade\n     */\n    function upgradeToken(address _token, bytes memory _data) external;\n\n    /**\n     * @notice Executes a scheduled token upgrade after the timelock delay\n     * @param _token The token address to complete the upgrade for\n     */\n    function executeTokenUpgrade(address _token) external;\n\n    /**\n     * @notice Cancels a scheduled token upgrade\n     * @param _token The token address to cancel the upgrade for\n     */\n    function cancelTokenUpgrade(address _token) external;\n\n    /**\n     * @notice Destroys a token by upgrading it to the destroyed implementation\n     * @dev For asynchronous upgrades, use executeTokenUpgrade to complete the destruction\n     * @param _token The token address to destroy\n     */\n    function destroyToken(address _token) external;\n\n    /**\n     * @notice Gets token information with properly formatted group IDs\n     * @param _tokenAddress The address of the token\n     * @return tokenAddress The token address\n     * @return groupIds Dynamic array containing only the actual group IDs\n     * @return implementationAddress The implementation address\n     * @return customGroupId The custom group ID (0 if not enabled)\n     */\n    function getTokenInfo(address _tokenAddress) external view returns (\n        address tokenAddress,\n        uint16[] memory groupIds,\n        address implementationAddress,\n        uint16 customGroupId\n    );\n\n    /**\n     * @notice Gets the destroyed implementation address for SygToken\n     * @return The address of the SygTokenDestroyed implementation\n     */\n    function getSygTokenDestroyedImplementation() external view returns (address);\n}\n"},"apps/tokenization/SygToken/contracts/PausableSygToken.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.30;\n\nimport {PausableCore} from \"libs/Pausable/PausableCore.sol\";\nimport {PermissionedCore} from \"libs/Permissioned/PermissionedCore.sol\";\nimport {IPausable} from \"libs/Pausable/interfaces/IPausable.sol\";\n\n/**\n * @custom:security-contact blockchain@sygnum.com\n * @title PausableSygToken\n * @author SYGNUM AG - Blockchain team 3301\n * @notice Pausable contract with role-based access control for pause/unpause operations\n * @dev This contract extends PausableCore to add authorization checks for pause/unpause operations.\n *      Only accounts with appropriate permissions can pause or unpause the contract.\n */\nabstract contract PausableSygToken is PausableCore, PermissionedCore, IPausable {\n    /* ======== EXTERNAL/PUBLIC VIEW FUNCTIONS ======== */\n\n    /**\n     * @notice Returns whether the contract is paused\n     * @return Boolean True if the contract is paused, false otherwise\n     */\n    function isPaused() public view returns (bool) {\n        return _isPaused();\n    }\n\n    /* ======== EXTERNAL/PUBLIC STATE-CHANGING FUNCTIONS ======== */\n\n    /**\n     * @notice Pauses the contract\n     * @dev Requires pauser authorization to execute\n     */\n    function pause() external requiresAuth {\n        _pause();\n    }\n\n    /**\n     * @notice Unpauses the contract\n     * @dev Requires pauser authorization to execute\n     */\n    function unpause() external requiresAuth {\n        _unpause();\n    }\n}\n"},"apps/tokenization/SygToken/contracts/ChainlinkDataFeed.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.30;\n\nimport {AggregatorV3Interface} from \"libs/external/chainlink-local/src/data-feeds/interfaces/AggregatorV3Interface.sol\";\nimport {IBundleAggregatorProxy} from\n    \"libs/external/chainlink-evm/contracts/src/v0.8/data-feeds/interfaces/IBundleAggregatorProxy.sol\";\nimport {PausableCore} from \"libs/Pausable/PausableCore.sol\";\nimport {PermissionedCore} from \"libs/Permissioned/PermissionedCore.sol\";\nimport {StorageLayout} from \"./storage/StorageLayout.sol\";\n\n/**\n * @custom:security-contact blockchain@sygnum.com\n * @title ChainlinkDataFeed\n * @author SYGNUM AG - Blockchain team 3301\n * @notice Contract for interacting with Chainlink price feed oracles\n * @dev Provides type-safe functions to fetch price data from AggregatorV3Interface or bundle data from\n *      IBundleAggregatorProxy. Consumers must call the correct function for the configured oracle type.\n */\nabstract contract ChainlinkDataFeed is StorageLayout, PausableCore, PermissionedCore {\n    /* ======== ERRORS ======== */\n\n    error InvalidOracle(address _oracleAddress);\n    error IncompleteRound();\n    error InvalidPrice();\n    error SameOracleAddress(address _oracleAddress);\n\n    /* ======== EVENTS ======== */\n\n    event PriceFeedOracleUpdated(address indexed previousOracle, address indexed newOracle);\n\n    /* ======== EXTERNAL/PUBLIC STATE-CHANGING FUNCTIONS ======== */\n\n    /**\n     * @notice Updates the price feed oracle address\n     * @dev Can be set to zero to disable price feed.\n     * @param _newPriceFeedOracleAddress The new oracle address (can be zero)\n     */\n    function updatePricefeedOracleAddress(address _newPriceFeedOracleAddress) external requiresAuth {\n        address _previousOracle = getPriceFeedOracleAddress;\n        if (_previousOracle == _newPriceFeedOracleAddress) {\n            revert SameOracleAddress(_newPriceFeedOracleAddress);\n        }\n        getPriceFeedOracleAddress = _newPriceFeedOracleAddress;\n        emit PriceFeedOracleUpdated(_previousOracle, _newPriceFeedOracleAddress);\n    }\n\n    /* ======== EXTERNAL/PUBLIC VIEW/PURE FUNCTIONS ======== */\n\n    /**\n     * @notice Gets the latest asset price from an AggregatorV3Interface oracle\n     * @dev Only works when the configured oracle is an AggregatorV3Interface (not a bundle feed).\n     *      Reverts with InvalidOracle if oracle is not set or is a bundle aggregator.\n     * @return _price The latest price as int256 (guaranteed positive)\n     * @return _updatedAt The timestamp of the last price update\n     */\n    function getPrice() external view returns (int256 _price, uint256 _updatedAt) {\n        if (getPriceFeedOracleAddress == address(0) || _isBundleAggregator(getPriceFeedOracleAddress)) {\n            revert InvalidOracle(getPriceFeedOracleAddress);\n        }\n\n        (, _price,, _updatedAt,) = AggregatorV3Interface(getPriceFeedOracleAddress).latestRoundData();\n\n        if (_updatedAt == 0) {\n            revert IncompleteRound();\n        }\n\n        if (_price <= 0) {\n            revert InvalidPrice();\n        }\n    }\n\n    /**\n     * @notice Gets the latest bundle data from an IBundleAggregatorProxy oracle\n     * @dev Only works when the configured oracle is an IBundleAggregatorProxy (not a V3 price feed).\n     *      Reverts with InvalidOracle if oracle is not set or is an AggregatorV3Interface.\n     *      The returned bytes are an opaque payload whose schema depends on the specific feed being queried.\n     *      The caller is responsible for decoding the payload according to that feed's documentation.\n     * @return _bundleData The raw bundle data bytes\n     * @return _updatedAt The timestamp of the last bundle update\n     */\n    function getBundleData() external view returns (bytes memory _bundleData, uint256 _updatedAt) {\n        if (getPriceFeedOracleAddress == address(0) || !_isBundleAggregator(getPriceFeedOracleAddress)) {\n            revert InvalidOracle(getPriceFeedOracleAddress);\n        }\n\n        IBundleAggregatorProxy _bundleFeed = IBundleAggregatorProxy(getPriceFeedOracleAddress);\n        _updatedAt = _bundleFeed.latestBundleTimestamp();\n        _bundleData = _bundleFeed.latestBundle();\n    }\n\n    /**\n     * @notice Gets the number of decimals for the price feed\n     * @dev Automatically detects if the oracle is an AggregatorV3Interface or IBundleAggregatorProxy\n     * @dev For AggregatorV3Interface, returns a single-element array\n     * @dev For IBundleAggregatorProxy, returns the bundleDecimals() array as-is\n     * @dev Reverts if oracle address is zero\n     * @return _decimals The decimals array\n     */\n    function getPriceFeedDecimals() external view returns (uint8[] memory) {\n        if (getPriceFeedOracleAddress == address(0)) {\n            revert InvalidOracle(address(0));\n        }\n\n        if (_isBundleAggregator(getPriceFeedOracleAddress)) {\n            return IBundleAggregatorProxy(getPriceFeedOracleAddress).bundleDecimals();\n        }\n\n        uint8[] memory _decimals = new uint8[](1);\n        _decimals[0] = AggregatorV3Interface(getPriceFeedOracleAddress).decimals();\n        return _decimals;\n    }\n\n    /**\n     * @notice Gets the description of the price feed\n     * @dev Works with both AggregatorV3Interface and IBundleAggregatorProxy (both have description())\n     * @dev Reverts if oracle address is zero\n     * @return The description string\n     */\n    function getPriceFeedDescription() external view returns (string memory) {\n        if (getPriceFeedOracleAddress == address(0)) {\n            revert InvalidOracle(address(0));\n        }\n\n        AggregatorV3Interface _priceFeed = AggregatorV3Interface(getPriceFeedOracleAddress);\n        return _priceFeed.description();\n    }\n\n    /* ======== PRIVATE VIEW/PURE FUNCTIONS ======== */\n\n    /**\n     * @notice Checks if the oracle address implements IBundleAggregatorProxy\n     * @dev Uses try/catch on bundleDecimals() to detect bundle interface\n     * @param _oracleAddress The oracle address to check\n     * @return True if the oracle implements IBundleAggregatorProxy\n     */\n    function _isBundleAggregator(address _oracleAddress) private view returns (bool) {\n        try IBundleAggregatorProxy(_oracleAddress).bundleDecimals() returns (uint8[] memory) {\n            return true;\n        } catch {\n            return false;\n        }\n    }\n}\n"},"apps/tokenization/SygToken/contracts/storage/StorageLayout.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.30;\n\nimport { StorageLayoutV1 } from \"./StorageLayoutV1.sol\";\n\n/**\n * @custom:security-contact blockchain@sygnum.com\n    * @title StorageLayout\n    * @author SYGNUM AG - Blockchain team 3301\n    * @notice This contract is used to store the state variables of SygToken.sol and all its derivatives. The storage is separated from the logic to allow for a more flexible upgradeability pattern, avoiding storage collisions\n    * @dev CRITICAL: Do NOT add variables directly to this contract!\n    * Always create a new versioned base (StorageLayoutV2, StorageLayoutV3, etc.) that inherits from the previous version.\n    *\n    * Example upgrade path:\n    * 1. Create: abstract contract StorageLayoutV2 is StorageLayoutV1 { newVar; }\n    * 2. Update: abstract contract StorageLayout is StorageLayoutV2 {}\n*/\n\nabstract contract StorageLayout is StorageLayoutV1 {\n    // ⚠️ NEVER ADD VARIABLES HERE! See @dev comment above for upgrade instructions.\n}\n"},"apps/tokenization/SygToken/contracts/storage/StorageLayoutV1.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.30;\n\n/**\n * @custom:security-contact blockchain@sygnum.com\n * @title StorageLayoutV1\n * @notice Version 1 of storage layout for SygToken\n * @dev CRITICAL: Once deployed, NEVER modify this contract!\n */\nabstract contract StorageLayoutV1 {\n    /*/////     SygToken Storage     /////*/\n\n    // Token state management\n    string public getTokenURI;\n\n    // Price feed oracle integration\n    address public getPriceFeedOracleAddress;\n}\n"},"libs/external/chainlink-local/src/data-feeds/interfaces/AggregatorV3Interface.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\n/// @title AggregatorV3Interface\n/// @notice Interface for accessing detailed data from an aggregator contract, including round data and metadata.\n/// @dev Provides methods to get the latest data, historical data for specific rounds, and metadata such as decimals and description.\ninterface AggregatorV3Interface {\n    /**\n     * @notice Gets the number of decimals used by the aggregator.\n     * @return uint8 - The number of decimals.\n     */\n    function decimals() external view returns (uint8);\n\n    /**\n     * @notice Gets the description of the aggregator.\n     * @return string memory - The description of the aggregator.\n     */\n    function description() external view returns (string memory);\n\n    /**\n     * @notice Gets the version of the aggregator.\n     * @return uint256 - The version of the aggregator.\n     */\n    function version() external view returns (uint256);\n\n    /**\n     * @notice Gets the round data for a specific round ID.\n     * @param _roundId - The round ID to get the data for.\n     * @return roundId - The round ID.\n     * @return answer - The answer for the round.\n     * @return startedAt - The timestamp when the round started.\n     * @return updatedAt - The timestamp when the round was updated.\n     * @return answeredInRound - The round ID in which the answer was computed.\n     * @dev This function should raise \"No data present\" if no data is available for the given round ID.\n     */\n    function getRoundData(uint80 _roundId)\n        external\n        view\n        returns (uint80 roundId, int256 answer, uint256 startedAt, uint256 updatedAt, uint80 answeredInRound);\n\n    /**\n     * @notice Gets the latest round data.\n     * @return roundId - The latest round ID.\n     * @return answer - The latest answer.\n     * @return startedAt - The timestamp when the latest round started.\n     * @return updatedAt - The timestamp when the latest round was updated.\n     * @return answeredInRound - The round ID in which the latest answer was computed.\n     * @dev This function should raise \"No data present\" if no data is available.\n     */\n    function latestRoundData()\n        external\n        view\n        returns (uint80 roundId, int256 answer, uint256 startedAt, uint256 updatedAt, uint80 answeredInRound);\n}"},"libs/external/chainlink-evm/contracts/src/v0.8/data-feeds/interfaces/ICommonAggregator.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.4;\n\ninterface ICommonAggregator {\n  function description() external view returns (string memory);\n\n  function version() external view returns (uint256);\n}"},"libs/external/chainlink-evm/contracts/src/v0.8/data-feeds/interfaces/IBundleBaseAggregator.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.4;\n\ninterface IBundleBaseAggregator {\n  function latestBundle() external view returns (bytes memory bundle);\n\n  function bundleDecimals() external view returns (uint8[] memory);\n\n  function latestBundleTimestamp() external view returns (uint256);\n}"},"libs/external/chainlink-evm/contracts/src/v0.8/data-feeds/interfaces/IBundleAggregatorProxy.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.4;\n\nimport {IBundleBaseAggregator} from \"./IBundleBaseAggregator.sol\";\nimport {ICommonAggregator} from \"./ICommonAggregator.sol\";\n\ninterface IBundleAggregatorProxy is IBundleBaseAggregator, ICommonAggregator {\n  function proposedAggregator() external view returns (address);\n\n  function confirmAggregator(\n    address aggregatorAddress\n  ) external;\n\n  function aggregator() external view returns (address);\n}"}},"language":"Solidity","settings":{"viaIR":false,"metadata":{"appendCBOR":true,"bytecodeHash":"ipfs","useLiteralContent":false},"libraries":{},"optimizer":{"runs":300,"enabled":true},"evmVersion":"prague","remappings":["@chainlink-contracts-1.3.0/=dependencies/@chainlink-contracts-1.3.0/","@gnosis-pm-safe-contracts-1.3.0/=dependencies/@gnosis-pm-safe-contracts-1.3.0/","forge-std/=dependencies/forge-std-1.9.4/src/","safe-global-safe-smart-account-1.4.1-3/=dependencies/safe-global-safe-smart-account-1.4.1-3/","solmate-6.8.0/=dependencies/solmate-6.8.0/","forge-std-1.9.4/=dependencies/forge-std-1.9.4/src/"]}},"stdJsonOutput":{"sources":{"libs/ERC20/ERC20.sol":{"id":8},"libs/UUPS/UUPSUtils.sol":{"id":28},"libs/ERC20/ERC20Core.sol":{"id":9},"libs/ERC20/ERC20View.sol":{"id":10},"libs/Timelock/Timelock.sol":{"id":21},"libs/utils/bytes/BytesLib.sol":{"id":37},"libs/Pausable/PausableCore.sol":{"id":16},"libs/Timelock/TimelockCore.sol":{"id":22},"libs/Timelock/TimelockView.sol":{"id":23},"libs/ERC20/interfaces/IERC20.sol":{"id":11},"libs/UUPS/interface/IERC1822.sol":{"id":29},"libs/UUPS/interface/IERC1967.sol":{"id":30},"libs/UUPS/UUPSUpgradeableCore.sol":{"id":27},"libs/Permissioned/Permissioned.sol":{"id":18},"libs/Initializable/Initializable.sol":{"id":13},"libs/UUPS/UUPSTimelockUpgradeable.sol":{"id":24},"libs/FundRecovery/FundRecoveryCore.sol":{"id":12},"libs/Pausable/interfaces/IPausable.sol":{"id":17},"libs/Permissioned/PermissionedCore.sol":{"id":19},"libs/Permissioned/PermissionedView.sol":{"id":20},"libs/Initializable/InitializableCore.sol":{"id":14},"libs/Initializable/InitializableView.sol":{"id":15},"libs/UUPS/UUPSTimelockUpgradeableCore.sol":{"id":25},"libs/UUPS/UUPSTimelockUpgradeableView.sol":{"id":26},"apps/tokenization/SygToken/contracts/SygToken.sol":{"id":5},"libs/UUPS/interface/IUUPSSynchronousUpgradeable.sol":{"id":32},"libs/UUPS/interface/IUUPSAsynchronousUpgradeable.sol":{"id":31},"apps/tokenization/SygToken/contracts/RolesManager.sol":{"id":4},"apps/tokenization/SygToken/contracts/ERC20SygToken.sol":{"id":2},"apps/tokenization/SygFactory/interfaces/ISygFactory.sol":{"id":0},"apps/tokenization/SygToken/contracts/PausableSygToken.sol":{"id":3},"apps/tokenization/SygToken/contracts/ChainlinkDataFeed.sol":{"id":1},"apps/tokenization/SygToken/contracts/storage/StorageLayout.sol":{"id":6},"apps/tokenization/SygToken/contracts/storage/StorageLayoutV1.sol":{"id":7},"libs/external/chainlink-local/src/data-feeds/interfaces/AggregatorV3Interface.sol":{"id":36},"libs/external/chainlink-evm/contracts/src/v0.8/data-feeds/interfaces/ICommonAggregator.sol":{"id":35},"libs/external/chainlink-evm/contracts/src/v0.8/data-feeds/interfaces/IBundleBaseAggregator.sol":{"id":34},"libs/external/chainlink-evm/contracts/src/v0.8/data-feeds/interfaces/IBundleAggregatorProxy.sol":{"id":33}},"contracts":{"apps/tokenization/SygToken/contracts/SygToken.sol":{"SygToken":{"abi":[{"name":"AlreadyUpgrading","type":"error","inputs":[]},{"name":"ContractNotInitializedAfterUpgrade","type":"error","inputs":[]},{"name":"ContractNotPaused","type":"error","inputs":[]},{"name":"ContractPaused","type":"error","inputs":[]},{"name":"ERC1967InvalidImplementation","type":"error","inputs":[{"name":"implementation","type":"address","internalType":"address"}]},{"name":"ERC1967NonPayable","type":"error","inputs":[]},{"name":"FailedCall","type":"error","inputs":[]},{"name":"IncompleteRound","type":"error","inputs":[]},{"name":"InsufficientFunds","type":"error","inputs":[{"name":"given","type":"uint256","internalType":"uint256"},{"name":"expected","type":"uint256","internalType":"uint256"}]},{"name":"InvalidDelay","type":"error","inputs":[]},{"name":"InvalidInitialization","type":"error","inputs":[]},{"name":"InvalidOracle","type":"error","inputs":[{"name":"_oracleAddress","type":"address","internalType":"address"}]},{"name":"InvalidPrice","type":"error","inputs":[]},{"name":"InvalidSigner","type":"error","inputs":[]},{"name":"InvalidTimestamp","type":"error","inputs":[]},{"name":"InvalidUpgradeCalldata","type":"error","inputs":[]},{"name":"NoUpgradeScheduled","type":"error","inputs":[]},{"name":"NotTokenUser","type":"error","inputs":[{"name":"account","type":"address","internalType":"address"}]},{"name":"OperationExecutionFailed","type":"error","inputs":[{"name":"operationId","type":"bytes32","internalType":"bytes32"}]},{"name":"PermitDeadlineExpired","type":"error","inputs":[]},{"name":"SameOracleAddress","type":"error","inputs":[{"name":"_oracleAddress","type":"address","internalType":"address"}]},{"name":"SameTokenURI","type":"error","inputs":[{"name":"_tokenURI","type":"string","internalType":"string"}]},{"name":"TimeLockAlreadyExist","type":"error","inputs":[]},{"name":"TimelockDoesNotExist","type":"error","inputs":[]},{"name":"TimelockNotReached","type":"error","inputs":[]},{"name":"TransferFailed","type":"error","inputs":[]},{"name":"UUPSUnauthorizedCallContext","type":"error","inputs":[]},{"name":"UnAuthorizedCall","type":"error","inputs":[]},{"name":"Unauthorized","type":"error","inputs":[]},{"name":"UnauthorizedUpgrade","type":"error","inputs":[{"name":"caller","type":"address","internalType":"address"},{"name":"expectedPermissionManager","type":"address","internalType":"address"}]},{"name":"ZeroAddress","type":"error","inputs":[]},{"name":"Approval","type":"event","inputs":[{"name":"owner","type":"address","indexed":true,"internalType":"address"},{"name":"spender","type":"address","indexed":true,"internalType":"address"},{"name":"amount","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"name":"Callers","type":"event","inputs":[{"name":"caller","type":"address","indexed":true,"internalType":"address"},{"name":"context","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"name":"Canceled","type":"event","inputs":[{"name":"operationId","type":"bytes32","indexed":true,"internalType":"bytes32"}],"anonymous":false},{"name":"Executed","type":"event","inputs":[{"name":"operationId","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"target","type":"address","indexed":false,"internalType":"address"},{"name":"value","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"data","type":"bytes","indexed":false,"internalType":"bytes"},{"name":"timestamp","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"name":"ForcedTransfer","type":"event","inputs":[{"name":"from","type":"address","indexed":true,"internalType":"address"},{"name":"to","type":"address","indexed":true,"internalType":"address"},{"name":"amount","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"name":"FundsRecovered","type":"event","inputs":[{"name":"token","type":"address","indexed":true,"internalType":"address"},{"name":"to","type":"address","indexed":true,"internalType":"address"},{"name":"requestedAmount","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"actualAmountReceived","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"name":"Initialized","type":"event","inputs":[],"anonymous":false},{"name":"MinterBurnerUpdated","type":"event","inputs":[{"name":"account","type":"address","indexed":true,"internalType":"address"},{"name":"minterBurner","type":"bool","indexed":false,"internalType":"bool"}],"anonymous":false},{"name":"Paused","type":"event","inputs":[],"anonymous":false},{"name":"PriceFeedOracleUpdated","type":"event","inputs":[{"name":"previousOracle","type":"address","indexed":true,"internalType":"address"},{"name":"newOracle","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"name":"Queued","type":"event","inputs":[{"name":"operationId","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"target","type":"address","indexed":false,"internalType":"address"},{"name":"value","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"data","type":"bytes","indexed":false,"internalType":"bytes"},{"name":"eta","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"name":"TokenURIUpdated","type":"event","inputs":[{"name":"previousTokenURI","type":"string","indexed":false,"internalType":"string"},{"name":"newTokenURI","type":"string","indexed":false,"internalType":"string"}],"anonymous":false},{"name":"TokenUserBlacklisted","type":"event","inputs":[{"name":"account","type":"address","indexed":true,"internalType":"address"},{"name":"blacklist","type":"bool","indexed":false,"internalType":"bool"}],"anonymous":false},{"name":"TokenUserManagerUpdated","type":"event","inputs":[{"name":"account","type":"address","indexed":true,"internalType":"address"},{"name":"tokenUserManager","type":"bool","indexed":false,"internalType":"bool"}],"anonymous":false},{"name":"TokenUserUpdated","type":"event","inputs":[{"name":"account","type":"address","indexed":true,"internalType":"address"},{"name":"tokenUser","type":"bool","indexed":false,"internalType":"bool"}],"anonymous":false},{"name":"Transfer","type":"event","inputs":[{"name":"from","type":"address","indexed":true,"internalType":"address"},{"name":"to","type":"address","indexed":true,"internalType":"address"},{"name":"amount","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"name":"Unpaused","type":"event","inputs":[],"anonymous":false},{"name":"Upgraded","type":"event","inputs":[{"name":"implementation","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"name":"DOMAIN_SEPARATOR","type":"function","inputs":[],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"name":"allowance","type":"function","inputs":[{"name":"_owner","type":"address","internalType":"address"},{"name":"_spender","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"approve","type":"function","inputs":[{"name":"_spender","type":"address","internalType":"address"},{"name":"_amount","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"nonpayable"},{"name":"balanceOf","type":"function","inputs":[{"name":"_account","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"blacklistTokenUser","type":"function","inputs":[{"name":"_account","type":"address","internalType":"address"},{"name":"_blacklist","type":"bool","internalType":"bool"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"burn","type":"function","inputs":[{"name":"_from","type":"address","internalType":"address"},{"name":"_amount","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"callUpgradeToAndCallUUPS","type":"function","inputs":[{"name":"_newImplementation","type":"address","internalType":"address"},{"name":"_data","type":"bytes","internalType":"bytes"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"cancelUpgrade","type":"function","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"name":"decimals","type":"function","inputs":[],"outputs":[{"name":"","type":"uint8","internalType":"uint8"}],"stateMutability":"view"},{"name":"executeUpgrade","type":"function","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"name":"forcedTransfer","type":"function","inputs":[{"name":"_from","type":"address","internalType":"address"},{"name":"_to","type":"address","internalType":"address"},{"name":"_amount","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"getBundleData","type":"function","inputs":[],"outputs":[{"name":"_bundleData","type":"bytes","internalType":"bytes"},{"name":"_updatedAt","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"getImplementation","type":"function","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"name":"getPermissionManagerAddress","type":"function","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"name":"getPrice","type":"function","inputs":[],"outputs":[{"name":"_price","type":"int256","internalType":"int256"},{"name":"_updatedAt","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"getPriceFeedDecimals","type":"function","inputs":[],"outputs":[{"name":"","type":"uint8[]","internalType":"uint8[]"}],"stateMutability":"view"},{"name":"getPriceFeedDescription","type":"function","inputs":[],"outputs":[{"name":"","type":"string","internalType":"string"}],"stateMutability":"view"},{"name":"getPriceFeedOracleAddress","type":"function","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"name":"getScheduledOperationDetails","type":"function","inputs":[{"name":"_operationId","type":"bytes32","internalType":"bytes32"}],"outputs":[{"name":"target","type":"address","internalType":"address"},{"name":"data","type":"bytes","internalType":"bytes"},{"name":"value","type":"uint256","internalType":"uint256"},{"name":"eta","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"getTokenURI","type":"function","inputs":[],"outputs":[{"name":"","type":"string","internalType":"string"}],"stateMutability":"view"},{"name":"initialize","type":"function","inputs":[{"name":"_name","type":"string","internalType":"string"},{"name":"_symbol","type":"string","internalType":"string"},{"name":"_decimals","type":"uint8","internalType":"uint8"},{"name":"_tokenURI","type":"string","internalType":"string"},{"name":"_permissionManagerAddress","type":"address","internalType":"address"},{"name":"_timelockDelaySeconds","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"isInitialized","type":"function","inputs":[],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"name":"isMinterBurner","type":"function","inputs":[{"name":"_account","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"name":"isOperator","type":"function","inputs":[{"name":"_account","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"name":"isPaused","type":"function","inputs":[],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"name":"isPauser","type":"function","inputs":[{"name":"_account","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"name":"isRoleManager","type":"function","inputs":[{"name":"_account","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"name":"isSygTokenImplementation","type":"function","inputs":[],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"pure"},{"name":"isSystem","type":"function","inputs":[{"name":"_account","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"name":"isTokenUser","type":"function","inputs":[{"name":"_account","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"name":"isTokenUserManager","type":"function","inputs":[{"name":"_account","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"name":"mint","type":"function","inputs":[{"name":"_to","type":"address","internalType":"address"},{"name":"_amount","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"name","type":"function","inputs":[],"outputs":[{"name":"","type":"string","internalType":"string"}],"stateMutability":"view"},{"name":"nonces","type":"function","inputs":[{"name":"_account","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"pause","type":"function","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"name":"permit","type":"function","inputs":[{"name":"_owner","type":"address","internalType":"address"},{"name":"_spender","type":"address","internalType":"address"},{"name":"_value","type":"uint256","internalType":"uint256"},{"name":"_deadline","type":"uint256","internalType":"uint256"},{"name":"_v","type":"uint8","internalType":"uint8"},{"name":"_r","type":"bytes32","internalType":"bytes32"},{"name":"_s","type":"bytes32","internalType":"bytes32"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"proxiableUUID","type":"function","inputs":[],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"name":"recoverFunds","type":"function","inputs":[{"name":"_token","type":"address","internalType":"address"},{"name":"_to","type":"address","internalType":"address payable"},{"name":"_amount","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"setPermissionManagerAddress","type":"function","inputs":[{"name":"_permissionManagerAddress","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"symbol","type":"function","inputs":[],"outputs":[{"name":"","type":"string","internalType":"string"}],"stateMutability":"view"},{"name":"totalSupply","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"transfer","type":"function","inputs":[{"name":"_to","type":"address","internalType":"address"},{"name":"_amount","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"nonpayable"},{"name":"transferFrom","type":"function","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":"nonpayable"},{"name":"unpause","type":"function","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"name":"updateMinterBurner","type":"function","inputs":[{"name":"_account","type":"address","internalType":"address"},{"name":"_minterBurner","type":"bool","internalType":"bool"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"updatePricefeedOracleAddress","type":"function","inputs":[{"name":"_newPriceFeedOracleAddress","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"updateTokenURI","type":"function","inputs":[{"name":"_newTokenURI","type":"string","internalType":"string"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"updateTokenUser","type":"function","inputs":[{"name":"_account","type":"address","internalType":"address"},{"name":"_tokenUser","type":"bool","internalType":"bool"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"updateTokenUserManager","type":"function","inputs":[{"name":"_account","type":"address","internalType":"address"},{"name":"_tokenUserManager","type":"bool","internalType":"bool"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"upgradeToAndCall","type":"function","inputs":[{"name":"_newImplementation","type":"address","internalType":"address"},{"name":"_data","type":"bytes","internalType":"bytes"}],"outputs":[],"stateMutability":"nonpayable"}],"metadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"name\":\"AlreadyUpgrading\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ContractNotInitializedAfterUpgrade\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ContractNotPaused\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ContractPaused\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"implementation\",\"type\":\"address\"}],\"name\":\"ERC1967InvalidImplementation\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ERC1967NonPayable\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"FailedCall\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"IncompleteRound\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"given\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"expected\",\"type\":\"uint256\"}],\"name\":\"InsufficientFunds\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidDelay\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidInitialization\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_oracleAddress\",\"type\":\"address\"}],\"name\":\"InvalidOracle\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidPrice\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidSigner\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidTimestamp\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidUpgradeCalldata\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NoUpgradeScheduled\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"NotTokenUser\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"operationId\",\"type\":\"bytes32\"}],\"name\":\"OperationExecutionFailed\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"PermitDeadlineExpired\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_oracleAddress\",\"type\":\"address\"}],\"name\":\"SameOracleAddress\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_tokenURI\",\"type\":\"string\"}],\"name\":\"SameTokenURI\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"TimeLockAlreadyExist\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"TimelockDoesNotExist\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"TimelockNotReached\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"TransferFailed\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"UUPSUnauthorizedCallContext\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"UnAuthorizedCall\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Unauthorized\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"caller\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"expectedPermissionManager\",\"type\":\"address\"}],\"name\":\"UnauthorizedUpgrade\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ZeroAddress\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"caller\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"context\",\"type\":\"address\"}],\"name\":\"Callers\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"operationId\",\"type\":\"bytes32\"}],\"name\":\"Canceled\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"operationId\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"timestamp\",\"type\":\"uint256\"}],\"name\":\"Executed\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"ForcedTransfer\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"requestedAmount\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"actualAmountReceived\",\"type\":\"uint256\"}],\"name\":\"FundsRecovered\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[],\"name\":\"Initialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"minterBurner\",\"type\":\"bool\"}],\"name\":\"MinterBurnerUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[],\"name\":\"Paused\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOracle\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOracle\",\"type\":\"address\"}],\"name\":\"PriceFeedOracleUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"operationId\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"eta\",\"type\":\"uint256\"}],\"name\":\"Queued\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"string\",\"name\":\"previousTokenURI\",\"type\":\"string\"},{\"indexed\":false,\"internalType\":\"string\",\"name\":\"newTokenURI\",\"type\":\"string\"}],\"name\":\"TokenURIUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"blacklist\",\"type\":\"bool\"}],\"name\":\"TokenUserBlacklisted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"tokenUserManager\",\"type\":\"bool\"}],\"name\":\"TokenUserManagerUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"tokenUser\",\"type\":\"bool\"}],\"name\":\"TokenUserUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[],\"name\":\"Unpaused\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"implementation\",\"type\":\"address\"}],\"name\":\"Upgraded\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"DOMAIN_SEPARATOR\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_spender\",\"type\":\"address\"}],\"name\":\"allowance\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_amount\",\"type\":\"uint256\"}],\"name\":\"approve\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_account\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_account\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"_blacklist\",\"type\":\"bool\"}],\"name\":\"blacklistTokenUser\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_from\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_amount\",\"type\":\"uint256\"}],\"name\":\"burn\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_newImplementation\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"_data\",\"type\":\"bytes\"}],\"name\":\"callUpgradeToAndCallUUPS\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"cancelUpgrade\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"decimals\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"executeUpgrade\",\"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\":\"forcedTransfer\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getBundleData\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"_bundleData\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"_updatedAt\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getImplementation\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getPermissionManagerAddress\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getPrice\",\"outputs\":[{\"internalType\":\"int256\",\"name\":\"_price\",\"type\":\"int256\"},{\"internalType\":\"uint256\",\"name\":\"_updatedAt\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getPriceFeedDecimals\",\"outputs\":[{\"internalType\":\"uint8[]\",\"name\":\"\",\"type\":\"uint8[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getPriceFeedDescription\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getPriceFeedOracleAddress\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_operationId\",\"type\":\"bytes32\"}],\"name\":\"getScheduledOperationDetails\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"eta\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getTokenURI\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"_symbol\",\"type\":\"string\"},{\"internalType\":\"uint8\",\"name\":\"_decimals\",\"type\":\"uint8\"},{\"internalType\":\"string\",\"name\":\"_tokenURI\",\"type\":\"string\"},{\"internalType\":\"address\",\"name\":\"_permissionManagerAddress\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_timelockDelaySeconds\",\"type\":\"uint256\"}],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"isInitialized\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_account\",\"type\":\"address\"}],\"name\":\"isMinterBurner\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_account\",\"type\":\"address\"}],\"name\":\"isOperator\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"isPaused\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_account\",\"type\":\"address\"}],\"name\":\"isPauser\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_account\",\"type\":\"address\"}],\"name\":\"isRoleManager\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"isSygTokenImplementation\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_account\",\"type\":\"address\"}],\"name\":\"isSystem\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_account\",\"type\":\"address\"}],\"name\":\"isTokenUser\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_account\",\"type\":\"address\"}],\"name\":\"isTokenUserManager\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_amount\",\"type\":\"uint256\"}],\"name\":\"mint\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_account\",\"type\":\"address\"}],\"name\":\"nonces\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"pause\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_value\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_deadline\",\"type\":\"uint256\"},{\"internalType\":\"uint8\",\"name\":\"_v\",\"type\":\"uint8\"},{\"internalType\":\"bytes32\",\"name\":\"_r\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"_s\",\"type\":\"bytes32\"}],\"name\":\"permit\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"proxiableUUID\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_token\",\"type\":\"address\"},{\"internalType\":\"address payable\",\"name\":\"_to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_amount\",\"type\":\"uint256\"}],\"name\":\"recoverFunds\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_permissionManagerAddress\",\"type\":\"address\"}],\"name\":\"setPermissionManagerAddress\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"symbol\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"totalSupply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_amount\",\"type\":\"uint256\"}],\"name\":\"transfer\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_amount\",\"type\":\"uint256\"}],\"name\":\"transferFrom\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"unpause\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_account\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"_minterBurner\",\"type\":\"bool\"}],\"name\":\"updateMinterBurner\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_newPriceFeedOracleAddress\",\"type\":\"address\"}],\"name\":\"updatePricefeedOracleAddress\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_newTokenURI\",\"type\":\"string\"}],\"name\":\"updateTokenURI\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_account\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"_tokenUser\",\"type\":\"bool\"}],\"name\":\"updateTokenUser\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_account\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"_tokenUserManager\",\"type\":\"bool\"}],\"name\":\"updateTokenUserManager\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_newImplementation\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"_data\",\"type\":\"bytes\"}],\"name\":\"upgradeToAndCall\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"custom:security-contact\":\"blockchain@sygnum.com\",\"events\":{\"Canceled(bytes32)\":{\"params\":{\"operationId\":\"The unique ID of the operation.\"}},\"Executed(bytes32,address,uint256,bytes,uint256)\":{\"params\":{\"data\":\"The data that was sent with the call.\",\"operationId\":\"The unique ID of the operation.\",\"target\":\"The address of the contract that was called.\",\"timestamp\":\"The timestamp (in seconds since Unix epoch) when the operation is executed.\",\"value\":\"The amount of Ether (in wei) that was sent with the call.\"}},\"Queued(bytes32,address,uint256,bytes,uint256)\":{\"params\":{\"data\":\"The data to send with the call (ABI-encoded function arguments).\",\"eta\":\"The timestamp (in seconds since Unix epoch) after which the operation can be executed.\",\"operationId\":\"The unique ID of the operation.\",\"target\":\"The address of the contract to call.\",\"value\":\"The amount of Ether (in wei) to send with the call.\"}},\"Upgraded(address)\":{\"details\":\"Emitted when the implementation is upgraded.\",\"params\":{\"implementation\":\"The address of the new implementation.\"}}},\"kind\":\"dev\",\"methods\":{\"DOMAIN_SEPARATOR()\":{\"returns\":{\"_0\":\"The domain separator hash\"}},\"allowance(address,address)\":{\"params\":{\"_owner\":\"The address of the token owner\",\"_spender\":\"The address of the spender\"},\"returns\":{\"_0\":\"The allowance amount\"}},\"approve(address,uint256)\":{\"details\":\"Overrides ERC20 approve to add pause protection\",\"params\":{\"_amount\":\"The amount of tokens the spender is allowed to spend\",\"_spender\":\"The address allowed to spend tokens\"},\"returns\":{\"_0\":\"True if approval succeeded\"}},\"balanceOf(address)\":{\"params\":{\"_account\":\"The address to query the balance of\"},\"returns\":{\"_0\":\"The balance of the specified address\"}},\"blacklistTokenUser(address,bool)\":{\"details\":\"Requires custom group ID to be enabled (customGroupId != 0)\",\"params\":{\"_account\":\"The address of the account to update\",\"_blacklist\":\"True to blacklist the user from the token user role, false to unblacklist the user from the token user role\"}},\"burn(address,uint256)\":{\"params\":{\"_amount\":\"The amount of tokens to burn\",\"_from\":\"The address to burn tokens from\"}},\"callUpgradeToAndCallUUPS(address,bytes)\":{\"details\":\"Intended to be called internally by the contract itself as part of the timelock upgrade flow.      Performs the upgrade to the specified implementation and optionally executes additional setup logic.      Access control is enforced within the internal _callUpgradeToAndCallUUPS function via the `isInternalCall` modifier.\",\"params\":{\"_data\":\"Optional initialization calldata to execute on the new implementation after the upgrade.\",\"_newImplementation\":\"The address of the new implementation contract.\"}},\"cancelUpgrade()\":{\"custom:emits\":\"Canceled(bytes32 operationId) when the operation is successfully canceled.\",\"details\":\"Allows cancellation of a previously scheduled upgrade operation at any time before it is finalized.      Removes the scheduled operation from storage, preventing it from being executed in the future.      If no upgrade is currently scheduled, this function has no effect.\"},\"decimals()\":{\"returns\":{\"_0\":\"The number of decimals\"}},\"executeUpgrade()\":{\"custom:reverts\":\"NoUpgradeScheduled if there is no upgrade operation in progress.TimelockDoesNotExist if the scheduled operation does not exist.TimelockNotReached if the timelock delay has not yet elapsed.\",\"details\":\"Finalizes the upgrade by executing the operation previously scheduled via `queueUpgrade`.      Checks that the upgrade is authorized and the timelock conditions are met before proceeding.      Upon successful execution, the upgrade operation is cleared from storage.\"},\"forcedTransfer(address,address,uint256)\":{\"params\":{\"_amount\":\"The amount to transfer\",\"_from\":\"The sender address\",\"_to\":\"The recipient address (must be TOKEN_USER)\"}},\"getBundleData()\":{\"details\":\"Only works when the configured oracle is an IBundleAggregatorProxy (not a V3 price feed).      Reverts with InvalidOracle if oracle is not set or is an AggregatorV3Interface.      The returned bytes are an opaque payload whose schema depends on the specific feed being queried.      The caller is responsible for decoding the payload according to that feed's documentation.\",\"returns\":{\"_bundleData\":\"The raw bundle data bytes\",\"_updatedAt\":\"The timestamp of the last bundle update\"}},\"getImplementation()\":{\"details\":\"Returns the address stored in the ERC-1967 implementation slot\",\"returns\":{\"_0\":\"The address of the current implementation contract\"}},\"getPermissionManagerAddress()\":{\"returns\":{\"_0\":\"The address of the permission manager, or zero address if not set\"}},\"getPrice()\":{\"details\":\"Only works when the configured oracle is an AggregatorV3Interface (not a bundle feed).      Reverts with InvalidOracle if oracle is not set or is a bundle aggregator.\",\"returns\":{\"_price\":\"The latest price as int256 (guaranteed positive)\",\"_updatedAt\":\"The timestamp of the last price update\"}},\"getPriceFeedDecimals()\":{\"details\":\"Automatically detects if the oracle is an AggregatorV3Interface or IBundleAggregatorProxyFor AggregatorV3Interface, returns a single-element arrayFor IBundleAggregatorProxy, returns the bundleDecimals() array as-isReverts if oracle address is zero\",\"returns\":{\"_0\":\"_decimals The decimals array\"}},\"getPriceFeedDescription()\":{\"details\":\"Works with both AggregatorV3Interface and IBundleAggregatorProxy (both have description())Reverts if oracle address is zero\",\"returns\":{\"_0\":\"The description string\"}},\"getScheduledOperationDetails(bytes32)\":{\"params\":{\"_operationId\":\"The unique ID of the scheduled operation\"},\"returns\":{\"data\":\"The calldata to be sent with the call\",\"eta\":\"The earliest timestamp at which the operation can be executed\",\"target\":\"The address of the contract to be called\",\"value\":\"The amount of Ether (in wei) to be sent with the call\"}},\"initialize(string,string,uint8,string,address,uint256)\":{\"params\":{\"_decimals\":\"The number of decimals for the token\",\"_name\":\"The name of the token\",\"_permissionManagerAddress\":\"Address of the permission manager contract\",\"_symbol\":\"The symbol of the token\",\"_timelockDelaySeconds\":\"The delay in seconds before upgrades can be executed\",\"_tokenURI\":\"The URI for the token metadata\"}},\"isInitialized()\":{\"returns\":{\"_0\":\"Whether the contract has been initialized\"}},\"isMinterBurner(address)\":{\"details\":\"Groups are automatically determined by SygFactory based on this token's address.      Returns true only if the account is whitelisted in at least one group AND not blacklisted      in any group (blacklist supersedes whitelist).\",\"params\":{\"_account\":\"The account address to check\"},\"returns\":{\"_0\":\"True if the account is a minter/burner\"}},\"isOperator(address)\":{\"details\":\"Groups are automatically determined by SygFactory based on this token's address.      Returns true only if the account is whitelisted in at least one group AND not blacklisted      in any group (blacklist supersedes whitelist).\",\"params\":{\"_account\":\"The account address to check\"},\"returns\":{\"_0\":\"True if the account is an operator\"}},\"isPaused()\":{\"returns\":{\"_0\":\"Boolean True if the contract is paused, false otherwise\"}},\"isPauser(address)\":{\"details\":\"Groups are automatically determined by SygFactory based on this token's address.      Returns true only if the account is whitelisted in at least one group AND not blacklisted      in any group (blacklist supersedes whitelist).\",\"params\":{\"_account\":\"The account address to check\"},\"returns\":{\"_0\":\"True if the account is a pauser\"}},\"isRoleManager(address)\":{\"details\":\"Groups are automatically determined by SygFactory based on this token's address.      Returns true only if the account is whitelisted in at least one group AND not blacklisted      in any group (blacklist supersedes whitelist).\",\"params\":{\"_account\":\"The account address to check\"},\"returns\":{\"_0\":\"True if the account is a role manager\"}},\"isSygTokenImplementation()\":{\"details\":\"This function provides a reliable way to check if a contract is a SygToken implementation      without relying on functions that may revert in certain states (like getPriceFeedDecimals      when oracle is not configured). This is used by SygTokenChecker for safe interface detection.\",\"returns\":{\"_0\":\"True, indicating this is a SygToken implementation\"}},\"isSystem(address)\":{\"details\":\"Groups are automatically determined by SygFactory based on this token's address.      Returns true only if the account is whitelisted in at least one group AND not blacklisted      in any group (blacklist supersedes whitelist).\",\"params\":{\"_account\":\"The account address to check\"},\"returns\":{\"_0\":\"True if the account is a system account\"}},\"isTokenUser(address)\":{\"details\":\"Groups are automatically determined by SygFactory based on this token's address.      Returns true only if the account is whitelisted in at least one group AND not blacklisted      in any group (blacklist supersedes whitelist).\",\"params\":{\"_account\":\"The account address to check\"},\"returns\":{\"_0\":\"True if the account is a token user\"}},\"isTokenUserManager(address)\":{\"details\":\"Groups are automatically determined by SygFactory based on this token's address.      Returns true only if the account is whitelisted in at least one group AND not blacklisted      in any group (blacklist supersedes whitelist).\",\"params\":{\"_account\":\"The account address to check\"},\"returns\":{\"_0\":\"True if the account is a token user manager\"}},\"mint(address,uint256)\":{\"params\":{\"_amount\":\"The amount of tokens to mint\",\"_to\":\"The address to mint tokens to (must be TOKEN_USER)\"}},\"name()\":{\"returns\":{\"_0\":\"The name of the token\"}},\"nonces(address)\":{\"params\":{\"_account\":\"The address to query the nonce of\"},\"returns\":{\"_0\":\"The nonce of the specified address\"}},\"pause()\":{\"details\":\"Requires pauser authorization to execute\"},\"permit(address,address,uint256,uint256,uint8,bytes32,bytes32)\":{\"details\":\"Overrides ERC20 permit to add TOKEN_USER check for owner and pause protection\",\"params\":{\"_deadline\":\"The timestamp after which the signature is no longer valid\",\"_owner\":\"The token owner's address\",\"_r\":\"The first 32 bytes of the signature\",\"_s\":\"The second 32 bytes of the signature\",\"_spender\":\"The spender's address\",\"_v\":\"The recovery byte of the signature\",\"_value\":\"The amount of tokens to approve\"}},\"proxiableUUID()\":{\"details\":\"Reverts if called through a proxy to prevent bricking\",\"returns\":{\"_0\":\"The storage slot used by the implementation\"}},\"recoverFunds(address,address,uint256)\":{\"details\":\"If _token is address(0), recovers native token (ETH), else recovers ERC20 tokens For ERC-20 tokens, the emitted amounts include both the requested amount and the actual amount received, which may differ for fee-on-transfer tokens.\",\"params\":{\"_amount\":\"The amount to recover (in wei for native ETH, in token's smallest unit for ERC-20)\",\"_to\":\"The recipient address\",\"_token\":\"The token address (zero for native)\"}},\"setPermissionManagerAddress(address)\":{\"params\":{\"_permissionManagerAddress\":\"The new permission manager address\"}},\"symbol()\":{\"returns\":{\"_0\":\"The symbol of the token\"}},\"totalSupply()\":{\"returns\":{\"_0\":\"The total supply of tokens\"}},\"transfer(address,uint256)\":{\"details\":\"Overrides ERC20 transfer to add TOKEN_USER whitelist checks and pause protection\",\"params\":{\"_amount\":\"The amount to transfer\",\"_to\":\"The recipient address\"},\"returns\":{\"_0\":\"True if transfer succeeded\"}},\"transferFrom(address,address,uint256)\":{\"details\":\"Overrides ERC20 transferFrom to add TOKEN_USER whitelist checks and pause protection\",\"params\":{\"_amount\":\"The amount to transfer\",\"_from\":\"The sender address\",\"_to\":\"The recipient address\"},\"returns\":{\"_0\":\"True if transfer succeeded\"}},\"unpause()\":{\"details\":\"Requires pauser authorization to execute\"},\"updateMinterBurner(address,bool)\":{\"params\":{\"_account\":\"The address of the account to update\",\"_minterBurner\":\"True to give minter/burner role to the account, false to remove minter/burner role\"}},\"updatePricefeedOracleAddress(address)\":{\"details\":\"Can be set to zero to disable price feed.\",\"params\":{\"_newPriceFeedOracleAddress\":\"The new oracle address (can be zero)\"}},\"updateTokenURI(string)\":{\"params\":{\"_newTokenURI\":\"The new token URI\"}},\"updateTokenUser(address,bool)\":{\"details\":\"Requires custom group ID to be enabled (customGroupId != 0)\",\"params\":{\"_account\":\"The address of the account to update\",\"_tokenUser\":\"True to give token user role to the account, false to remove token user role\"}},\"updateTokenUserManager(address,bool)\":{\"params\":{\"_account\":\"The address of the account to update\",\"_tokenUserManager\":\"True to give token user manager role to the account, false to remove token user manager role\"}},\"upgradeToAndCall(address,bytes)\":{\"params\":{\"_data\":\"Optional memory to execute after the upgrade.\",\"_newImplementation\":\"The address of the new implementation contract.\"}}},\"version\":1},\"userdoc\":{\"events\":{\"Canceled(bytes32)\":{\"notice\":\"Emitted when an operation is cancelled.\"},\"Executed(bytes32,address,uint256,bytes,uint256)\":{\"notice\":\"Emitted when an operation is executed.\"},\"Queued(bytes32,address,uint256,bytes,uint256)\":{\"notice\":\"Emitted when an operation is scheduled.\"}},\"kind\":\"user\",\"methods\":{\"DOMAIN_SEPARATOR()\":{\"notice\":\"Returns the domain separator used in the encoding of the signature for permits (EIP-2612)\"},\"allowance(address,address)\":{\"notice\":\"Returns the remaining number of tokens that spender will be allowed to spend on behalf of owner\"},\"approve(address,uint256)\":{\"notice\":\"Approves a spender to transfer tokens on behalf of caller\"},\"balanceOf(address)\":{\"notice\":\"Returns the amount of tokens owned by account\"},\"blacklistTokenUser(address,bool)\":{\"notice\":\"Blacklist a user from the token user role for a given account by calling SygFactory\"},\"burn(address,uint256)\":{\"notice\":\"Burns tokens from a specified address\"},\"callUpgradeToAndCallUUPS(address,bytes)\":{\"notice\":\"Executes the upgrade to a new implementation with optional initialization data.\"},\"cancelUpgrade()\":{\"notice\":\"Cancels a scheduled upgrade operation.\"},\"decimals()\":{\"notice\":\"Returns the number of decimals used to get its user representation\"},\"executeUpgrade()\":{\"notice\":\"Executes the scheduled upgrade operation after the timelock delay has elapsed.\"},\"forcedTransfer(address,address,uint256)\":{\"notice\":\"Forcefully transfers tokens from any account to a whitelisted receiver\"},\"getBundleData()\":{\"notice\":\"Gets the latest bundle data from an IBundleAggregatorProxy oracle\"},\"getImplementation()\":{\"notice\":\"Returns the current implementation address\"},\"getPermissionManagerAddress()\":{\"notice\":\"Returns the address of the permission manager contract\"},\"getPrice()\":{\"notice\":\"Gets the latest asset price from an AggregatorV3Interface oracle\"},\"getPriceFeedDecimals()\":{\"notice\":\"Gets the number of decimals for the price feed\"},\"getPriceFeedDescription()\":{\"notice\":\"Gets the description of the price feed\"},\"getScheduledOperationDetails(bytes32)\":{\"notice\":\"Returns the details of a scheduled timelock operation\"},\"initialize(string,string,uint8,string,address,uint256)\":{\"notice\":\"Initializes the SygToken contract\"},\"isInitialized()\":{\"notice\":\"Returns the initialization status of the contract\"},\"isMinterBurner(address)\":{\"notice\":\"Checks if an account is a minter/burner\"},\"isOperator(address)\":{\"notice\":\"Checks if an account is an operator\"},\"isPaused()\":{\"notice\":\"Returns whether the contract is paused\"},\"isPauser(address)\":{\"notice\":\"Checks if an account is a pauser\"},\"isRoleManager(address)\":{\"notice\":\"Checks if an account is a role manager\"},\"isSygTokenImplementation()\":{\"notice\":\"Marker function to identify SygToken implementations\"},\"isSystem(address)\":{\"notice\":\"Checks if an account is a system account\"},\"isTokenUser(address)\":{\"notice\":\"Checks if an account is a token user\"},\"isTokenUserManager(address)\":{\"notice\":\"Checks if an account is a token user manager\"},\"mint(address,uint256)\":{\"notice\":\"Mints new tokens to a specified address\"},\"name()\":{\"notice\":\"Returns the name of the token\"},\"nonces(address)\":{\"notice\":\"Returns the current nonce for owner (EIP-2612)\"},\"pause()\":{\"notice\":\"Pauses the contract\"},\"permit(address,address,uint256,uint256,uint8,bytes32,bytes32)\":{\"notice\":\"EIP-2612 permit function to approve spending via signed message\"},\"proxiableUUID()\":{\"notice\":\"Returns the storage slot used by the implementation\"},\"recoverFunds(address,address,uint256)\":{\"notice\":\"Recovers funds from the contract\"},\"setPermissionManagerAddress(address)\":{\"notice\":\"Sets the permission manager address\"},\"symbol()\":{\"notice\":\"Returns the symbol of the token\"},\"totalSupply()\":{\"notice\":\"Returns the amount of tokens in existence\"},\"transfer(address,uint256)\":{\"notice\":\"Transfers tokens from caller to recipient\"},\"transferFrom(address,address,uint256)\":{\"notice\":\"Transfers tokens from one address to another using allowance\"},\"unpause()\":{\"notice\":\"Unpauses the contract\"},\"updateMinterBurner(address,bool)\":{\"notice\":\"Updates the minter/burner status for a given account by calling SygFactory\"},\"updatePricefeedOracleAddress(address)\":{\"notice\":\"Updates the price feed oracle address\"},\"updateTokenURI(string)\":{\"notice\":\"Updates the token URI\"},\"updateTokenUser(address,bool)\":{\"notice\":\"Updates the token user status for a given account by calling SygFactory\"},\"updateTokenUserManager(address,bool)\":{\"notice\":\"Updates the token user manager status for a given account by calling SygFactory\"},\"upgradeToAndCall(address,bytes)\":{\"notice\":\"Upgrades the implementation and optionally executes a function call.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"apps/tokenization/SygToken/contracts/SygToken.sol\":\"SygToken\"},\"evmVersion\":\"prague\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":300},\"remappings\":[\":@chainlink-contracts-1.3.0/=dependencies/@chainlink-contracts-1.3.0/\",\":@gnosis-pm-safe-contracts-1.3.0/=dependencies/@gnosis-pm-safe-contracts-1.3.0/\",\":forge-std-1.9.4/=dependencies/forge-std-1.9.4/src/\",\":forge-std/=dependencies/forge-std-1.9.4/src/\",\":safe-global-safe-smart-account-1.4.1-3/=dependencies/safe-global-safe-smart-account-1.4.1-3/\",\":solmate-6.8.0/=dependencies/solmate-6.8.0/\"]},\"sources\":{\"apps/tokenization/SygFactory/interfaces/ISygFactory.sol\":{\"keccak256\":\"0x871a9cd79df76b39c9a82961e4417c9c90e21e2a68c08272916586a316625d8d\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://092df8bbe5242b73916a02b4c0b05c3b049df342486a959d06a3025af2312b42\",\"dweb:/ipfs/QmeFfMQNS6EKmdqKkoWztRQBxSgGQo4ufRf7Jtd32Y8idx\"]},\"apps/tokenization/SygToken/contracts/ChainlinkDataFeed.sol\":{\"keccak256\":\"0x5c944b99cf38d5b9e50450e0db374999641fbfadf3476229605e63ab69fbb37b\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://c627e0a83e83225bf437711d7423fd6126c68f0bb0f0501a06b7bd9abdc4f5f5\",\"dweb:/ipfs/QmUvPddBEm1gqf4Urj1pC8YLt1NzpgkbHujo5mtDhjkNcY\"]},\"apps/tokenization/SygToken/contracts/ERC20SygToken.sol\":{\"keccak256\":\"0xd72c9a040778f24736371f4be7cdd1e78a8fcb9cb88f7fae31242ff63460a730\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://9c37e84e9351eb64b94ae10f9c6a579b0a7725fdb28251e45fdb802614f0d205\",\"dweb:/ipfs/QmbbksPtmPguJAMCMbixqHfUDhQ8ptUBgHUq8XPnEYamcZ\"]},\"apps/tokenization/SygToken/contracts/PausableSygToken.sol\":{\"keccak256\":\"0x310992ad00552fb666535d43951998f7f0899807138025233bcb6895eab3ae09\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://3b7a08c500441e3e744c5cfb6cc9b3eaaf5b2fea039e8ad3782e3a204bc85f81\",\"dweb:/ipfs/QmfUmyLvipZGj7xes9LHRrFr5Yu5hwft2VFjMVWaQpyHoJ\"]},\"apps/tokenization/SygToken/contracts/RolesManager.sol\":{\"keccak256\":\"0xbb8f460ba0cc5bf376392ff02fb567380f66e5a73d72e8be7a069c6f76c797c3\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://af987720a3568a0366ea4891b835b22dc539975bd241600b38dc158516f5f4dd\",\"dweb:/ipfs/QmbeRjXCD6qu1XVrdswE1h9p3o3aqHA6aZTFmsfGB5kbmL\"]},\"apps/tokenization/SygToken/contracts/SygToken.sol\":{\"keccak256\":\"0x24464a2a0e8dd4c60a65a4b3656d9680f2a8eab86b57c5520e16c6c754d65618\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://83a3340cc325ea3ff3b74d03f31ca00b8ced5eeca2511716e44e6a0ea34dd122\",\"dweb:/ipfs/QmRWHVxb1bNk9HCTBTFHZWJcnHyvy7KDqdborFAQK8z41p\"]},\"apps/tokenization/SygToken/contracts/storage/StorageLayout.sol\":{\"keccak256\":\"0x53b4f1a5eae76a23a856180e7570f85123ef76ee79e5d218edf989046fa58ba9\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://5c161004e6e9960917a9ae79972ec13b438916bf4d155045281ce42282c35733\",\"dweb:/ipfs/QmZz3H3BcghYP7aXT2MXfXopZFqkBYnotfVqQDDhmiZnHq\"]},\"apps/tokenization/SygToken/contracts/storage/StorageLayoutV1.sol\":{\"keccak256\":\"0x6dda4283ecfb7937a10ea64a12dc260e790c4717bd3f69daba7063dfad9bee15\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://c3a6eb7afb2267a62e7e21844d4ddcf6b17cc12161d48ebfff1fb7ed95aeab7d\",\"dweb:/ipfs/Qmaq4AUf4wY2J5GhZsMWfZfbPE2PXEfpJGKVtgpeH7vbx9\"]},\"libs/ERC20/ERC20.sol\":{\"keccak256\":\"0x021b7f2c4fd06026fbfeb47c5afb51cb77e5b2d2d3695922cc8ebc141478bfe6\",\"license\":\"AGPL-3.0-only\",\"urls\":[\"bzz-raw://2d0c3c10fe6d5206a4cace3fb0c42b0425dbd0917c193bfca9a606112b7a1e9f\",\"dweb:/ipfs/QmXtJs3y7axG8Jr8CY3sW3VmPWc9FHSnynouS9RWL12AAF\"]},\"libs/ERC20/ERC20Core.sol\":{\"keccak256\":\"0x6282eefdd68ef4317a9e92888f048352d4263665e0d86ae6da2af8115118452d\",\"license\":\"AGPL-3.0-only\",\"urls\":[\"bzz-raw://014f5eb6c946a987d500e1398ef380f663cbd9c8532cb050217066ed2df0b297\",\"dweb:/ipfs/Qmczh8G1HECjyRUkU3HiDTyWQ8ZNqr5cHvH7Ae8K7fCgch\"]},\"libs/ERC20/ERC20View.sol\":{\"keccak256\":\"0x476e9f605764d451609465ac12aa3fb80d6cb4b186617fcb2bffa49b4c5f1c31\",\"license\":\"AGPL-3.0-only\",\"urls\":[\"bzz-raw://9e78df5953f810010542883174cd37ef3d8134d2e1f2f1c8fd41819d6cf37570\",\"dweb:/ipfs/QmdyEzVebm8KcTTCYYyiFkwUspsiF4cbhkFVt32wyedC8k\"]},\"libs/ERC20/interfaces/IERC20.sol\":{\"keccak256\":\"0x42db71c052fb5034880609d4d6a13ae583813c070583bc955fb7ca40aadf0956\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://69ff0931e67efec758f35f2c6cd1d942b49c7e0593ff2c45cf71045b8366bf31\",\"dweb:/ipfs/QmfP8MLR4toXGFJgVSMv4AUCuUZHhi4CNt5zXs2ptMcBZs\"]},\"libs/FundRecovery/FundRecoveryCore.sol\":{\"keccak256\":\"0x71bcc7205bef72d275a3bbe5873ec3fbb18fe851d0ca0e0ba8294c698ace761b\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://ab75bb0d105c45895c6ea7a3fb1b1080064861447d04735c6f2752f85da89241\",\"dweb:/ipfs/QmXTu3BRr5u3D1GFHHhBMVZDsP72tSk7z7EMWK7uYWkAe4\"]},\"libs/Initializable/Initializable.sol\":{\"keccak256\":\"0x792fcf47ddbd94cc497211655f7ba565045f7843e4760e0372e4404c3e5982aa\",\"license\":\"UNLICENSED\",\"urls\":[\"bzz-raw://63958cd8e14c358d6c474c8c5e9418a93535915f554acf0300571a8595e353f2\",\"dweb:/ipfs/QmRwtEbryowmucSSwgnHJXWr7VrayVFAChrgA1MXXSduGR\"]},\"libs/Initializable/InitializableCore.sol\":{\"keccak256\":\"0x98310b0e87da9b1d2ced673743e2d14e2951a5c2be56b9475d2b637c4285737e\",\"license\":\"UNLICENSED\",\"urls\":[\"bzz-raw://687070c74a9f8ea3c4139e7d07ef665a043fbd7946121c29a8ddd9b0cfff503c\",\"dweb:/ipfs/QmQopkJwD3rnVENHKVKzkvNNW2JzG8AG4nFngoNoCBfeFz\"]},\"libs/Initializable/InitializableView.sol\":{\"keccak256\":\"0x1664897cb0d126efe0d1a0f9148c6096de1dd836f9c4f66e9d6e133fb8ab722b\",\"license\":\"UNLICENSED\",\"urls\":[\"bzz-raw://3e18dc0fb78b705ae8dfc92df337a6b3f7d989c074028e1587964eaba6e279a0\",\"dweb:/ipfs/Qmb5y6rw6Thbw6QetErP6i3VHxtenzuH3x6w4daUh1HoyX\"]},\"libs/Pausable/PausableCore.sol\":{\"keccak256\":\"0x07d4e1bb7b6df2bc789e7b79c9659fdfd13096f898964de0df499291727904a3\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://addf8fd5e689aae404ad86f631f2d2ed8e0207b0a5db1770c4a8ee3c88473d2d\",\"dweb:/ipfs/QmWpNaK8cG4nNTfVnYRc7rzHmakXzeYs7L2vBVxmL2ba7K\"]},\"libs/Pausable/interfaces/IPausable.sol\":{\"keccak256\":\"0xac8fb6d60213ac590e0c92e8035568a8129fbf2f87ca97098c4456249f991648\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://a2014a4d845dffb71e7e9d8fb866fc5129c986e331598fbd7f20e5ebd591c5cb\",\"dweb:/ipfs/QmPPW7CAtyiZoHr78tvK3jSJasSRQ2Z9hCTR3AxhtzE8qy\"]},\"libs/Permissioned/Permissioned.sol\":{\"keccak256\":\"0x7f8977cbf68bc705adebceabec03cf746ef770e14342ca95828accb79f94364b\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://02bda7704daca86ce5211e2c110950ed630c62b28f8ef373371c860de4e41d0b\",\"dweb:/ipfs/QmPxmEPs1h8jsDuWRCRhR6gui9bvdcvXhiQCfVhCdypux6\"]},\"libs/Permissioned/PermissionedCore.sol\":{\"keccak256\":\"0x5649b87e6ec3f0708522f7c29ff4417b0cb5c55ee1ee246fa0e561334e56ad73\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://c673a789594c9f7ef6865a578f5bfb4db35b480cd188b538327f83e8603a3cba\",\"dweb:/ipfs/QmUhHgfarfPScQqHLNTdbbzwfVUQed6pupggv45sP3yAHY\"]},\"libs/Permissioned/PermissionedView.sol\":{\"keccak256\":\"0x284be39a83b5045b25621168b35d1bf4aca24f6894901b6daee5b9005f71fece\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://8102e72060c60b40c5a4b5b6df29a1162fbbf37c46d54eb42161ecfe1594eaa6\",\"dweb:/ipfs/QmNufyhu4Lc5LPTUuAYsJt7SjAWbEwNiaBKobFj6S9jic1\"]},\"libs/Timelock/Timelock.sol\":{\"keccak256\":\"0x2b83442be65661f6b3dc93ee9077d2a79e07c02e252a4902784a0ce90eb6c9cf\",\"license\":\"UNLICENSED\",\"urls\":[\"bzz-raw://41eb97168ca4aeac7a4df944d110481faaa9b390f1886b0a071d8eb077181e85\",\"dweb:/ipfs/QmZ88CEgGxkMfy9uAKjzQ3Phym8Ha6WwVDeoyGHedY2kpW\"]},\"libs/Timelock/TimelockCore.sol\":{\"keccak256\":\"0x3189d504d1315f9e5f849827590f5ecdfd2c390988e14b84f6128ab4aa5c54f8\",\"license\":\"UNLICENSED\",\"urls\":[\"bzz-raw://d15bd0c5272203a2a8086b3250c61545a481d00e67828730731a72a764e11361\",\"dweb:/ipfs/QmY95WqHu75zu9d7ipS1v5W9WSRoec5VUY81u4bqUByFyP\"]},\"libs/Timelock/TimelockView.sol\":{\"keccak256\":\"0xb772a41e65958d13f377bf4f9f0a4dfeb399d446d749ab95f57e8f29e6c64a0f\",\"license\":\"UNLICENSED\",\"urls\":[\"bzz-raw://f1be1ff416c11164c00d04cc67a426018a7ed5bbf9c55894d35175b0e90dfac6\",\"dweb:/ipfs/QmfDJygKTEnoWN3S99RkqxKiiY1urZJhxQoWd37iJqeKZd\"]},\"libs/UUPS/UUPSTimelockUpgradeable.sol\":{\"keccak256\":\"0xd15ce193bf7df819e0c69de76152bf51b496fe22e32c2cd3bd8ccd20708fc282\",\"license\":\"UNLICENSED\",\"urls\":[\"bzz-raw://d4bee663eca36ab919be0af8ffc34ab554dbd930e26724444ffb9f097d832794\",\"dweb:/ipfs/QmYAhW9F4L7AcMczyby7JpCf3Eqmk4pn4g5zo5VApcKmv7\"]},\"libs/UUPS/UUPSTimelockUpgradeableCore.sol\":{\"keccak256\":\"0x9bc4febac6a0f339ec67f470947728e121add0fb1a5ffc4270cca8009cf054cc\",\"license\":\"UNLICENSED\",\"urls\":[\"bzz-raw://a342890c759d1b34690836514329f9d1b26b3a6a5b5e12a493c3d3c02ca1f9de\",\"dweb:/ipfs/QmV6dxf4Qshj1E272dH8ZJEPCGgZeLSBF7dV9YBLigqcR4\"]},\"libs/UUPS/UUPSTimelockUpgradeableView.sol\":{\"keccak256\":\"0x0c885f7aa18f08e521cc3d008928ace06f332f9e80714255045ffa6b714681c9\",\"license\":\"UNLICENSED\",\"urls\":[\"bzz-raw://898beda9daee3f48655ab568ac3e8473688ca161912cc9f21e28a4aad59a9ab7\",\"dweb:/ipfs/QmdjdEBnVhBZjCnD6KXXR5ZEk58tg3Yi4afdMhogC2qdrs\"]},\"libs/UUPS/UUPSUpgradeableCore.sol\":{\"keccak256\":\"0x7b05e5e3f77c0a1b9665da790cf9fd6e943b0f7581c5e5bf0224b72abd2f2b4e\",\"license\":\"UNLICENSED\",\"urls\":[\"bzz-raw://95348e083b59220fac8ed3a3103975da7402930ca854e34e6a2080524e4424e7\",\"dweb:/ipfs/QmQCYaPnT7EgsN1i62AhyPNGBJdEHxPfRbZ4WaYSKTyNZd\"]},\"libs/UUPS/UUPSUtils.sol\":{\"keccak256\":\"0xdf64f08be5ecd0067461507295c023794e86c193698dd58388eee89f21035dc8\",\"license\":\"UNLICENSED\",\"urls\":[\"bzz-raw://4404c56390edbb6559853bd312e70a35222a01a84349df95b419e1612e9a12ed\",\"dweb:/ipfs/QmZnwdxCGaZtTKBdKpKvhhCdBFVjAoqj5ZCHHjDiFpKdTf\"]},\"libs/UUPS/interface/IERC1822.sol\":{\"keccak256\":\"0x516c2481a3e6137447a3fa6aafc7c5e19a52563c9e3706b88a99f1cabf25b3a3\",\"license\":\"UNLICENSED\",\"urls\":[\"bzz-raw://98676562c44dfe01451330529c1ca9bdce3dc615836a7cc127df2ac5ffeb2cc6\",\"dweb:/ipfs/QmQgSyhCi41C2sNCwjVSwEPWtwmSxmqBNAcSD8x1jA6jR9\"]},\"libs/UUPS/interface/IERC1967.sol\":{\"keccak256\":\"0x20d04b7f75be1292dc90df36cddda12aaffa0a1cfff3a2e05abbb3a4daa9112a\",\"license\":\"UNLICENSED\",\"urls\":[\"bzz-raw://bc9e462195d994f013d13fa052c594030dbd19492dcc278f2df3b3ed50678633\",\"dweb:/ipfs/QmcWZnXpYeiXUDgJGS5pTaMYHbaeq4DaMr5zRGJFNFZtXT\"]},\"libs/UUPS/interface/IUUPSAsynchronousUpgradeable.sol\":{\"keccak256\":\"0xd1b8afd41edfef524620b6da0843e717b390a4090ef226327df4020cbc45ecc6\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://b2a717c5cda2b487c7a747979c291ef86ac1c7170e7c6461eb7407a95db6e4af\",\"dweb:/ipfs/QmUDyyrV52xrKLX36BANiJWkE1CDZ2V2LAvsPERPsNoVd2\"]},\"libs/UUPS/interface/IUUPSSynchronousUpgradeable.sol\":{\"keccak256\":\"0x893f2ad223fd5f3885fdf6031868f96306c81fdaef3634d9980fdecf7c85e8dd\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://c26c8134b117640438aa068f35b34b318591f1907888d9b2ba80409c380bda51\",\"dweb:/ipfs/Qmbd4c8SPAMgLHG1qE61MEsSjPZw8hJ9pV9kzB4rovNHuN\"]},\"libs/external/chainlink-evm/contracts/src/v0.8/data-feeds/interfaces/IBundleAggregatorProxy.sol\":{\"keccak256\":\"0xe8e76227569495fb92a78c0147d1f29f79b898324964592b35955f8bab991fe1\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://da3f0c12c070b5c50415b48f82f99f4103192b9319bb5644a250bf5ea43408e7\",\"dweb:/ipfs/QmXB9xYr5ryWiVPyRytfYgT77TxEfv2RRW7rDRe8x9z46o\"]},\"libs/external/chainlink-evm/contracts/src/v0.8/data-feeds/interfaces/IBundleBaseAggregator.sol\":{\"keccak256\":\"0x1a5a387e40b4feed8669a741045b7c840785c0a38f20bf39b81175d90372e4d1\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://f1273aaca70c6791ff0b161394e9cfb86cf96120d3a0501a1f2199262d731b57\",\"dweb:/ipfs/QmVkyre8NVmTpvPEf4r8NGVyEZSAzYCpsMTmymdF1p2VEP\"]},\"libs/external/chainlink-evm/contracts/src/v0.8/data-feeds/interfaces/ICommonAggregator.sol\":{\"keccak256\":\"0xa663405601c73448f3e4357ff1621c17af12d8b1b12fd102dc88ed2e7d2cafc1\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://19db634eaaef286716b72517eb29257f93ac87002068e5d3a797557a0bb2efae\",\"dweb:/ipfs/QmaQRcLsc9BumatBijok6hchuanhFPeicjiTruG1t5xoNc\"]},\"libs/external/chainlink-local/src/data-feeds/interfaces/AggregatorV3Interface.sol\":{\"keccak256\":\"0x2109ef309663ddc8789bf7ae3baf11d4ca7a62a549c72a3d9d0976de709ce5a5\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://d03dedacdcc03bccde9cffb22920c7f292dda1f592a983ec16c5f113439a7e9d\",\"dweb:/ipfs/QmW7CtFT6gqXnXs1CAViCua4VDPuwStMhxPxD45BqaP9XX\"]},\"libs/utils/bytes/BytesLib.sol\":{\"keccak256\":\"0xf2e133b716e0d9700427fbfe44089fe11b6924d41fd12eadbc5ff30287c772d2\",\"license\":\"UNLICENSED\",\"urls\":[\"bzz-raw://efa7599b4c3ce297a8c6d9fc05902128343d0c0e363558fc9115f94b73b7ee6f\",\"dweb:/ipfs/QmTHbQUzYWnh1FL2DWdCwh2qUc98aCQhy13NhqvNFN6Kpv\"]}},\"version\":1}","userdoc":{"kind":"user","events":{"Canceled(bytes32)":{"notice":"Emitted when an operation is cancelled."},"Queued(bytes32,address,uint256,bytes,uint256)":{"notice":"Emitted when an operation is scheduled."},"Executed(bytes32,address,uint256,bytes,uint256)":{"notice":"Emitted when an operation is executed."}},"methods":{"name()":{"notice":"Returns the name of the token"},"pause()":{"notice":"Pauses the contract"},"symbol()":{"notice":"Returns the symbol of the token"},"unpause()":{"notice":"Unpauses the contract"},"decimals()":{"notice":"Returns the number of decimals used to get its user representation"},"getPrice()":{"notice":"Gets the latest asset price from an AggregatorV3Interface oracle"},"isPaused()":{"notice":"Returns whether the contract is paused"},"totalSupply()":{"notice":"Returns the amount of tokens in existence"},"cancelUpgrade()":{"notice":"Cancels a scheduled upgrade operation."},"getBundleData()":{"notice":"Gets the latest bundle data from an IBundleAggregatorProxy oracle"},"isInitialized()":{"notice":"Returns the initialization status of the contract"},"nonces(address)":{"notice":"Returns the current nonce for owner (EIP-2612)"},"proxiableUUID()":{"notice":"Returns the storage slot used by the implementation"},"executeUpgrade()":{"notice":"Executes the scheduled upgrade operation after the timelock delay has elapsed."},"isPauser(address)":{"notice":"Checks if an account is a pauser"},"isSystem(address)":{"notice":"Checks if an account is a system account"},"DOMAIN_SEPARATOR()":{"notice":"Returns the domain separator used in the encoding of the signature for permits (EIP-2612)"},"balanceOf(address)":{"notice":"Returns the amount of tokens owned by account"},"getImplementation()":{"notice":"Returns the current implementation address"},"isOperator(address)":{"notice":"Checks if an account is an operator"},"isTokenUser(address)":{"notice":"Checks if an account is a token user"},"burn(address,uint256)":{"notice":"Burns tokens from a specified address"},"mint(address,uint256)":{"notice":"Mints new tokens to a specified address"},"getPriceFeedDecimals()":{"notice":"Gets the number of decimals for the price feed"},"isRoleManager(address)":{"notice":"Checks if an account is a role manager"},"updateTokenURI(string)":{"notice":"Updates the token URI"},"isMinterBurner(address)":{"notice":"Checks if an account is a minter/burner"},"approve(address,uint256)":{"notice":"Approves a spender to transfer tokens on behalf of caller"},"getPriceFeedDescription()":{"notice":"Gets the description of the price feed"},"transfer(address,uint256)":{"notice":"Transfers tokens from caller to recipient"},"allowance(address,address)":{"notice":"Returns the remaining number of tokens that spender will be allowed to spend on behalf of owner"},"isSygTokenImplementation()":{"notice":"Marker function to identify SygToken implementations"},"isTokenUserManager(address)":{"notice":"Checks if an account is a token user manager"},"getPermissionManagerAddress()":{"notice":"Returns the address of the permission manager contract"},"updateTokenUser(address,bool)":{"notice":"Updates the token user status for a given account by calling SygFactory"},"upgradeToAndCall(address,bytes)":{"notice":"Upgrades the implementation and optionally executes a function call."},"blacklistTokenUser(address,bool)":{"notice":"Blacklist a user from the token user role for a given account by calling SygFactory"},"updateMinterBurner(address,bool)":{"notice":"Updates the minter/burner status for a given account by calling SygFactory"},"setPermissionManagerAddress(address)":{"notice":"Sets the permission manager address"},"updateTokenUserManager(address,bool)":{"notice":"Updates the token user manager status for a given account by calling SygFactory"},"getScheduledOperationDetails(bytes32)":{"notice":"Returns the details of a scheduled timelock operation"},"recoverFunds(address,address,uint256)":{"notice":"Recovers funds from the contract"},"transferFrom(address,address,uint256)":{"notice":"Transfers tokens from one address to another using allowance"},"updatePricefeedOracleAddress(address)":{"notice":"Updates the price feed oracle address"},"callUpgradeToAndCallUUPS(address,bytes)":{"notice":"Executes the upgrade to a new implementation with optional initialization data."},"forcedTransfer(address,address,uint256)":{"notice":"Forcefully transfers tokens from any account to a whitelisted receiver"},"initialize(string,string,uint8,string,address,uint256)":{"notice":"Initializes the SygToken contract"},"permit(address,address,uint256,uint256,uint8,bytes32,bytes32)":{"notice":"EIP-2612 permit function to approve spending via signed message"}},"version":1},"devdoc":{"kind":"dev","events":{"Canceled(bytes32)":{"params":{"operationId":"The unique ID of the operation."}},"Upgraded(address)":{"params":{"implementation":"The address of the new implementation."},"details":"Emitted when the implementation is upgraded."},"Queued(bytes32,address,uint256,bytes,uint256)":{"params":{"eta":"The timestamp (in seconds since Unix epoch) after which the operation can be executed.","data":"The data to send with the call (ABI-encoded function arguments).","value":"The amount of Ether (in wei) to send with the call.","target":"The address of the contract to call.","operationId":"The unique ID of the operation."}},"Executed(bytes32,address,uint256,bytes,uint256)":{"params":{"data":"The data that was sent with the call.","value":"The amount of Ether (in wei) that was sent with the call.","target":"The address of the contract that was called.","timestamp":"The timestamp (in seconds since Unix epoch) when the operation is executed.","operationId":"The unique ID of the operation."}}},"methods":{"name()":{"returns":{"_0":"The name of the token"}},"pause()":{"details":"Requires pauser authorization to execute"},"symbol()":{"returns":{"_0":"The symbol of the token"}},"unpause()":{"details":"Requires pauser authorization to execute"},"decimals()":{"returns":{"_0":"The number of decimals"}},"getPrice()":{"details":"Only works when the configured oracle is an AggregatorV3Interface (not a bundle feed).      Reverts with InvalidOracle if oracle is not set or is a bundle aggregator.","returns":{"_price":"The latest price as int256 (guaranteed positive)","_updatedAt":"The timestamp of the last price update"}},"isPaused()":{"returns":{"_0":"Boolean True if the contract is paused, false otherwise"}},"totalSupply()":{"returns":{"_0":"The total supply of tokens"}},"cancelUpgrade()":{"details":"Allows cancellation of a previously scheduled upgrade operation at any time before it is finalized.      Removes the scheduled operation from storage, preventing it from being executed in the future.      If no upgrade is currently scheduled, this function has no effect.","custom:emits":"Canceled(bytes32 operationId) when the operation is successfully canceled."},"getBundleData()":{"details":"Only works when the configured oracle is an IBundleAggregatorProxy (not a V3 price feed).      Reverts with InvalidOracle if oracle is not set or is an AggregatorV3Interface.      The returned bytes are an opaque payload whose schema depends on the specific feed being queried.      The caller is responsible for decoding the payload according to that feed's documentation.","returns":{"_updatedAt":"The timestamp of the last bundle update","_bundleData":"The raw bundle data bytes"}},"isInitialized()":{"returns":{"_0":"Whether the contract has been initialized"}},"nonces(address)":{"params":{"_account":"The address to query the nonce of"},"returns":{"_0":"The nonce of the specified address"}},"proxiableUUID()":{"details":"Reverts if called through a proxy to prevent bricking","returns":{"_0":"The storage slot used by the implementation"}},"executeUpgrade()":{"details":"Finalizes the upgrade by executing the operation previously scheduled via `queueUpgrade`.      Checks that the upgrade is authorized and the timelock conditions are met before proceeding.      Upon successful execution, the upgrade operation is cleared from storage.","custom:reverts":"NoUpgradeScheduled if there is no upgrade operation in progress.TimelockDoesNotExist if the scheduled operation does not exist.TimelockNotReached if the timelock delay has not yet elapsed."},"isPauser(address)":{"params":{"_account":"The account address to check"},"details":"Groups are automatically determined by SygFactory based on this token's address.      Returns true only if the account is whitelisted in at least one group AND not blacklisted      in any group (blacklist supersedes whitelist).","returns":{"_0":"True if the account is a pauser"}},"isSystem(address)":{"params":{"_account":"The account address to check"},"details":"Groups are automatically determined by SygFactory based on this token's address.      Returns true only if the account is whitelisted in at least one group AND not blacklisted      in any group (blacklist supersedes whitelist).","returns":{"_0":"True if the account is a system account"}},"DOMAIN_SEPARATOR()":{"returns":{"_0":"The domain separator hash"}},"balanceOf(address)":{"params":{"_account":"The address to query the balance of"},"returns":{"_0":"The balance of the specified address"}},"getImplementation()":{"details":"Returns the address stored in the ERC-1967 implementation slot","returns":{"_0":"The address of the current implementation contract"}},"isOperator(address)":{"params":{"_account":"The account address to check"},"details":"Groups are automatically determined by SygFactory based on this token's address.      Returns true only if the account is whitelisted in at least one group AND not blacklisted      in any group (blacklist supersedes whitelist).","returns":{"_0":"True if the account is an operator"}},"isTokenUser(address)":{"params":{"_account":"The account address to check"},"details":"Groups are automatically determined by SygFactory based on this token's address.      Returns true only if the account is whitelisted in at least one group AND not blacklisted      in any group (blacklist supersedes whitelist).","returns":{"_0":"True if the account is a token user"}},"burn(address,uint256)":{"params":{"_from":"The address to burn tokens from","_amount":"The amount of tokens to burn"}},"mint(address,uint256)":{"params":{"_to":"The address to mint tokens to (must be TOKEN_USER)","_amount":"The amount of tokens to mint"}},"getPriceFeedDecimals()":{"details":"Automatically detects if the oracle is an AggregatorV3Interface or IBundleAggregatorProxyFor AggregatorV3Interface, returns a single-element arrayFor IBundleAggregatorProxy, returns the bundleDecimals() array as-isReverts if oracle address is zero","returns":{"_0":"_decimals The decimals array"}},"isRoleManager(address)":{"params":{"_account":"The account address to check"},"details":"Groups are automatically determined by SygFactory based on this token's address.      Returns true only if the account is whitelisted in at least one group AND not blacklisted      in any group (blacklist supersedes whitelist).","returns":{"_0":"True if the account is a role manager"}},"updateTokenURI(string)":{"params":{"_newTokenURI":"The new token URI"}},"isMinterBurner(address)":{"params":{"_account":"The account address to check"},"details":"Groups are automatically determined by SygFactory based on this token's address.      Returns true only if the account is whitelisted in at least one group AND not blacklisted      in any group (blacklist supersedes whitelist).","returns":{"_0":"True if the account is a minter/burner"}},"approve(address,uint256)":{"params":{"_amount":"The amount of tokens the spender is allowed to spend","_spender":"The address allowed to spend tokens"},"details":"Overrides ERC20 approve to add pause protection","returns":{"_0":"True if approval succeeded"}},"getPriceFeedDescription()":{"details":"Works with both AggregatorV3Interface and IBundleAggregatorProxy (both have description())Reverts if oracle address is zero","returns":{"_0":"The description string"}},"transfer(address,uint256)":{"params":{"_to":"The recipient address","_amount":"The amount to transfer"},"details":"Overrides ERC20 transfer to add TOKEN_USER whitelist checks and pause protection","returns":{"_0":"True if transfer succeeded"}},"allowance(address,address)":{"params":{"_owner":"The address of the token owner","_spender":"The address of the spender"},"returns":{"_0":"The allowance amount"}},"isSygTokenImplementation()":{"details":"This function provides a reliable way to check if a contract is a SygToken implementation      without relying on functions that may revert in certain states (like getPriceFeedDecimals      when oracle is not configured). This is used by SygTokenChecker for safe interface detection.","returns":{"_0":"True, indicating this is a SygToken implementation"}},"isTokenUserManager(address)":{"params":{"_account":"The account address to check"},"details":"Groups are automatically determined by SygFactory based on this token's address.      Returns true only if the account is whitelisted in at least one group AND not blacklisted      in any group (blacklist supersedes whitelist).","returns":{"_0":"True if the account is a token user manager"}},"getPermissionManagerAddress()":{"returns":{"_0":"The address of the permission manager, or zero address if not set"}},"updateTokenUser(address,bool)":{"params":{"_account":"The address of the account to update","_tokenUser":"True to give token user role to the account, false to remove token user role"},"details":"Requires custom group ID to be enabled (customGroupId != 0)"},"upgradeToAndCall(address,bytes)":{"params":{"_data":"Optional memory to execute after the upgrade.","_newImplementation":"The address of the new implementation contract."}},"blacklistTokenUser(address,bool)":{"params":{"_account":"The address of the account to update","_blacklist":"True to blacklist the user from the token user role, false to unblacklist the user from the token user role"},"details":"Requires custom group ID to be enabled (customGroupId != 0)"},"updateMinterBurner(address,bool)":{"params":{"_account":"The address of the account to update","_minterBurner":"True to give minter/burner role to the account, false to remove minter/burner role"}},"setPermissionManagerAddress(address)":{"params":{"_permissionManagerAddress":"The new permission manager address"}},"updateTokenUserManager(address,bool)":{"params":{"_account":"The address of the account to update","_tokenUserManager":"True to give token user manager role to the account, false to remove token user manager role"}},"getScheduledOperationDetails(bytes32)":{"params":{"_operationId":"The unique ID of the scheduled operation"},"returns":{"eta":"The earliest timestamp at which the operation can be executed","data":"The calldata to be sent with the call","value":"The amount of Ether (in wei) to be sent with the call","target":"The address of the contract to be called"}},"recoverFunds(address,address,uint256)":{"params":{"_to":"The recipient address","_token":"The token address (zero for native)","_amount":"The amount to recover (in wei for native ETH, in token's smallest unit for ERC-20)"},"details":"If _token is address(0), recovers native token (ETH), else recovers ERC20 tokens For ERC-20 tokens, the emitted amounts include both the requested amount and the actual amount received, which may differ for fee-on-transfer tokens."},"transferFrom(address,address,uint256)":{"params":{"_to":"The recipient address","_from":"The sender address","_amount":"The amount to transfer"},"details":"Overrides ERC20 transferFrom to add TOKEN_USER whitelist checks and pause protection","returns":{"_0":"True if transfer succeeded"}},"updatePricefeedOracleAddress(address)":{"params":{"_newPriceFeedOracleAddress":"The new oracle address (can be zero)"},"details":"Can be set to zero to disable price feed."},"callUpgradeToAndCallUUPS(address,bytes)":{"params":{"_data":"Optional initialization calldata to execute on the new implementation after the upgrade.","_newImplementation":"The address of the new implementation contract."},"details":"Intended to be called internally by the contract itself as part of the timelock upgrade flow.      Performs the upgrade to the specified implementation and optionally executes additional setup logic.      Access control is enforced within the internal _callUpgradeToAndCallUUPS function via the `isInternalCall` modifier."},"forcedTransfer(address,address,uint256)":{"params":{"_to":"The recipient address (must be TOKEN_USER)","_from":"The sender address","_amount":"The amount to transfer"}},"initialize(string,string,uint8,string,address,uint256)":{"params":{"_name":"The name of the token","_symbol":"The symbol of the token","_decimals":"The number of decimals for the token","_tokenURI":"The URI for the token metadata","_timelockDelaySeconds":"The delay in seconds before upgrades can be executed","_permissionManagerAddress":"Address of the permission manager contract"}},"permit(address,address,uint256,uint256,uint8,bytes32,bytes32)":{"params":{"_r":"The first 32 bytes of the signature","_s":"The second 32 bytes of the signature","_v":"The recovery byte of the signature","_owner":"The token owner's address","_value":"The amount of tokens to approve","_spender":"The spender's address","_deadline":"The timestamp after which the signature is no longer valid"},"details":"Overrides ERC20 permit to add TOKEN_USER check for owner and pause protection"}},"version":1,"custom:security-contact":"blockchain@sygnum.com"},"storageLayout":{"types":{"t_address":{"label":"address","encoding":"inplace","numberOfBytes":"20"},"t_string_storage":{"label":"string","encoding":"bytes","numberOfBytes":"32"}},"storage":[{"slot":"0","type":"t_string_storage","astId":1388,"label":"getTokenURI","offset":0,"contract":"apps/tokenization/SygToken/contracts/SygToken.sol:SygToken"},{"slot":"1","type":"t_address","astId":1390,"label":"getPriceFeedOracleAddress","offset":0,"contract":"apps/tokenization/SygToken/contracts/SygToken.sol:SygToken"}]},"transientStorageLayout":{"types":null,"storage":[]},"evm":{"bytecode":{"object":"60a0604052306080523480156012575f5ffd5b506080516142b16100395f395f8181611fdb0152818161200401526123d701526142b15ff3fe608060405234801561000f575f5ffd5b5060043610610325575f3560e01c806364dad32f116101a85780639fc1d0e7116100f3578063c9c16fbd1161009e578063dd62ed3e11610079578063dd62ed3e1461066c578063ef3e8f221461067f578063f2e23d2214610692578063f8fa842b1461069a575f5ffd5b8063c9c16fbd1461063e578063d4a1911614610651578063d505accf14610659575f5ffd5b8063b187bd26116100ce578063b187bd2614610619578063bf4dc4b614610621578063c1491c5814610628575f5ffd5b80639fc1d0e7146105eb578063a9059cbb146105fe578063aaf10f4214610611575f5ffd5b80638456cb591161015357806398d2082f1161012e57806398d2082f1461059857806398d5fdca146105bb5780639dc29fac146105d8575f5ffd5b80638456cb591461057557806395d89b411461057d57806398cd615314610585575f5ffd5b80637ab8bf5a116101835780637ab8bf5a146105475780637e8962141461055a5780637ecebe0014610562575f5ffd5b806364dad32f1461050e5780636d70f7ae1461052157806370a0823114610534575f5ffd5b80633f4ba83a116102735780634f1ef2861161021e5780635845394b116101f95780635845394b146104aa5780635965959e146104d55780635ca13f04146104e85780635d3590d5146104fb575f5ffd5b80634f1ef2861461048757806352d1902d1461049a57806355f29166146104a2575f5ffd5b8063426796831161024e578063426796831461044e578063440fde4e1461046157806346fbf68e14610474575f5ffd5b80633f4ba83a1461041e57806340c10f1914610426578063422f8c0a14610439575f5ffd5b80632d524393116102d357806334cdcf26116102ae57806334cdcf26146103fb5780633644e5151461040e578063392e53cd14610416575f5ffd5b80632d524393146103bb578063313ce567146103ce57806333999fa6146103e8575f5ffd5b806318160ddd1161030357806318160ddd1461037f57806323b872dd14610395578063257e224c146103a8575f5ffd5b806306fdde031461032957806307e2a26014610347578063095ea7b31461035c575b5f5ffd5b6103316106a2565b60405161033e91906137ba565b60405180910390f35b61035a6103553660046137ed565b6106b1565b005b61036f61036a366004613824565b6107ad565b604051901515815260200161033e565b610387610807565b60405190815260200161033e565b61036f6103a336600461384e565b610830565b61035a6103b636600461395f565b6109b0565b61036f6103c9366004613a1c565b610a33565b6103d6610ad3565b60405160ff909116815260200161033e565b61035a6103f6366004613a3e565b610aff565b61036f610409366004613a1c565b610b0d565b610387610b2b565b61036f610b34565b61035a610b4a565b61035a610434366004613824565b610b69565b610441610c4d565b60405161033e9190613a9e565b61036f61045c366004613a1c565b610dc0565b61035a61046f366004613a1c565b610dde565b61036f610482366004613a1c565b610e7e565b61035a610495366004613a3e565b610e9c565b610387610eae565b61035a610ebf565b6001546104bd906001600160a01b031681565b6040516001600160a01b03909116815260200161033e565b61035a6104e33660046137ed565b610ef3565b61035a6104f63660046137ed565b610fe3565b61035a61050936600461384e565b6110d3565b61036f61051c366004613a1c565b611123565b61036f61052f366004613a1c565b611141565b610387610542366004613a1c565b61115f565b61036f610555366004613a1c565b61119b565b61035a6111b9565b610387610570366004613a1c565b6111ed565b61035a611229565b610331611246565b61035a610593366004613ae3565b611250565b6105ab6105a6366004613b15565b611399565b60405161033e9493929190613b2c565b6105c36113b6565b6040805192835260208301919091520161033e565b61035a6105e6366004613824565b6114d0565b61035a6105f936600461384e565b6115af565b61036f61060c366004613824565b6116e3565b6104bd6117cc565b61036f6117e2565b600161036f565b6106306117fb565b60405161033e929190613b60565b61035a61064c3660046137ed565b61192f565b610331611a1e565b61035a610667366004613b81565b611aa9565b61038761067a366004613bed565b611b97565b61035a61068d366004613a1c565b611be2565b6104bd611c03565b610331611c22565b60606106ac611cc5565b905090565b6106c6335f356001600160e01b031916611d66565b5f5160206141fc5f395f51905f525460ff16156106f65760405163ab35696f60e01b815260040160405180910390fd5b6106fe611c03565b604051636bcd157760e11b81525f60048201526001600160a01b0384811660248301528315156044830152919091169063d79a2aee906064015f604051808303815f87803b15801561074e575f5ffd5b505af1158015610760573d5f5f3e3d5ffd5b50505050816001600160a01b03167fd4145d5d40015b9d77048466bbe3ff2411630f7b70f80f9d79c273b6311aba74826040516107a1911515815260200190565b60405180910390a25050565b5f6107c3335f356001600160e01b031916611d66565b5f5160206141fc5f395f51905f525460ff16156107f35760405163ab35696f60e01b815260040160405180910390fd5b6107fe338484611e69565b90505b92915050565b5f6106ac7f67df8e602072ae967fe4567cec1273e29da0bd7a5a1af20d9b5c8d3f0d8385035490565b5f610846335f356001600160e01b031916611d66565b6040516364dad32f60e01b81526001600160a01b0385166004820152849030906364dad32f90602401602060405180830381865afa15801561088a573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108ae9190613c19565b6108db576040516326865f9b60e21b81526001600160a01b03821660048201526024015b60405180910390fd5b6040516364dad32f60e01b81526001600160a01b0385166004820152849030906364dad32f90602401602060405180830381865afa15801561091f573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109439190613c19565b61096b576040516326865f9b60e21b81526001600160a01b03821660048201526024016108d2565b5f5160206141fc5f395f51905f525460ff161561099b5760405163ab35696f60e01b815260040160405180910390fd5b6109a6868686611f3c565b9695505050505050565b6109b8611fd0565b5f5160206141bc5f395f51905f5254156109e55760405163f92ee8a960e01b815260040160405180910390fd5b6109ed61206b565b6109f88686866120a6565b610a0182612122565b610a0a81612148565b5f8054610a1690613c34565b90505f03610a2b575f610a298482613cb7565b505b505050505050565b5f610a3c611c03565b6001600160a01b031663970f8482835f5b604051908082528060200260200182016040528015610a76578160200160208202803683370190505b506040518363ffffffff1660e01b8152600401610a94929190613d72565b602060405180830381865afa158015610aaf573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108019190613c19565b5f6106ac7f67df8e602072ae967fe4567cec1273e29da0bd7a5a1af20d9b5c8d3f0d8385025460ff1690565b610b098282612188565b5050565b5f610b16611c03565b6001600160a01b031663f5fe5787835f610a4d565b5f6106ac6121dd565b5f6106ac5f5160206141bc5f395f51905f525490565b610b5f335f356001600160e01b031916611d66565b610b6761222c565b565b610b7e335f356001600160e01b031916611d66565b6040516364dad32f60e01b81526001600160a01b0383166004820152829030906364dad32f90602401602060405180830381865afa158015610bc2573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610be69190613c19565b610c0e576040516326865f9b60e21b81526001600160a01b03821660048201526024016108d2565b5f5160206141fc5f395f51905f525460ff1615610c3e5760405163ab35696f60e01b815260040160405180910390fd5b610c48838361229c565b505050565b6001546060906001600160a01b0316610c7b57604051631f93601760e01b81525f60048201526024016108d2565b600154610c90906001600160a01b0316612339565b15610d0b5760015f9054906101000a90046001600160a01b03166001600160a01b0316639d91348d6040518163ffffffff1660e01b81526004015f60405180830381865afa158015610ce4573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526106ac9190810190613dcc565b6040805160018082528183019092525f916020808301908036833750506001546040805163313ce56760e01b815290519394506001600160a01b039091169263313ce567925060048083019260209291908290030181865afa158015610d73573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d979190613e80565b815f81518110610da957610da9613e9b565b60ff90921660209283029190910190910152919050565b5f610dc9611c03565b6001600160a01b031663ffb2f26f835f610a4d565b610df3335f356001600160e01b031916611d66565b6001546001600160a01b039081169082168103610e2e57604051631eeb14f160e01b81526001600160a01b03831660048201526024016108d2565b600180546001600160a01b0319166001600160a01b0384811691821790925560405190918316907fd76fb624f0e2e090c9f82772a08d122c79250c90c7a896b1ed0de8bbe3e9e2e4905f90a35050565b5f610e87611c03565b6001600160a01b0316636f06fa43835f610a4d565b610ea4611fd0565b610b0982826123b0565b5f610eb76123cc565b6106ac612415565b5f51602061421c5f395f51905f5254610eeb57604051630604a9ff60e01b815260040160405180910390fd5b610b67612430565b610f08335f356001600160e01b031916611d66565b5f5160206141fc5f395f51905f525460ff1615610f385760405163ab35696f60e01b815260040160405180910390fd5b610f40611c03565b604051632b73cd6360e21b81525f60048201526001600160a01b0384811660248301528315156044830152919091169063adcf358c906064015f604051808303815f87803b158015610f90575f5ffd5b505af1158015610fa2573d5f5f3e3d5ffd5b50505050816001600160a01b03167fc71e52f779c12ade7cbf75a51deb27377b5addd6a3945e0b356bff858ffad7fb826040516107a1911515815260200190565b610ff8335f356001600160e01b031916611d66565b5f5160206141fc5f395f51905f525460ff16156110285760405163ab35696f60e01b815260040160405180910390fd5b611030611c03565b60405163361fa22b60e01b81525f60048201526001600160a01b0384811660248301528315156044830152919091169063361fa22b906064015f604051808303815f87803b158015611080575f5ffd5b505af1158015611092573d5f5f3e3d5ffd5b50505050816001600160a01b03167f6b410344a541a2ad2ffec50ea1cafabe58c50db82f72ae4f46a4bd2419155b15826040516107a1911515815260200190565b6110e8335f356001600160e01b031916611d66565b5f5160206141fc5f395f51905f525460ff16156111185760405163ab35696f60e01b815260040160405180910390fd5b610c4883838361247b565b5f61112c611c03565b6001600160a01b031663f2563ef3835f610a4d565b5f61114a611c03565b6001600160a01b031663394340e8835f610a4d565b6001600160a01b0381165f9081527f67df8e602072ae967fe4567cec1273e29da0bd7a5a1af20d9b5c8d3f0d8385046020526040812054610801565b5f6111a4611c03565b6001600160a01b03166378143d56835f610a4d565b5f51602061421c5f395f51905f52546111e557604051630604a9ff60e01b815260040160405180910390fd5b610b67612730565b6001600160a01b0381165f9081527f67df8e602072ae967fe4567cec1273e29da0bd7a5a1af20d9b5c8d3f0d8385086020526040812054610801565b61123e335f356001600160e01b031916611d66565b610b67612771565b60606106ac6127e5565b611265335f356001600160e01b031916611d66565b5f5160206141fc5f395f51905f525460ff16156112955760405163ab35696f60e01b815260040160405180910390fd5b5f5f80546112a290613c34565b80601f01602080910402602001604051908101604052809291908181526020018280546112ce90613c34565b80156113195780601f106112f057610100808354040283529160200191611319565b820191905f5260205f20905b8154815290600101906020018083116112fc57829003601f168201915b5050505050905081805190602001208180519060200120036113505781604051638651f2a560e01b81526004016108d291906137ba565b5f61135b8382613cb7565b507ffd07e2c2d6dc82f4d6b1b46f25e49eb888aba92d238fb40945856412cce2f2dd818360405161138d929190613eaf565b60405180910390a15050565b5f60605f5f6113a785612823565b93509350935093509193509193565b6001545f9081906001600160a01b031615806113e257506001546113e2906001600160a01b0316612339565b1561140f57600154604051631f93601760e01b81526001600160a01b0390911660048201526024016108d2565b60015f9054906101000a90046001600160a01b03166001600160a01b031663feaf968c6040518163ffffffff1660e01b815260040160a060405180830381865afa15801561145f573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906114839190613ef5565b5091945090925050505f8190036114ad57604051638ad52bdd60e01b815260040160405180910390fd5b5f82136114cc5760405162bfc92160e01b815260040160405180910390fd5b9091565b6114e5335f356001600160e01b031916611d66565b6040516364dad32f60e01b81526001600160a01b0383166004820152829030906364dad32f90602401602060405180830381865afa158015611529573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061154d9190613c19565b611575576040516326865f9b60e21b81526001600160a01b03821660048201526024016108d2565b5f5160206141fc5f395f51905f525460ff16156115a55760405163ab35696f60e01b815260040160405180910390fd5b610c48838361294f565b6040516364dad32f60e01b81526001600160a01b0383166004820152829030906364dad32f90602401602060405180830381865afa1580156115f3573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906116179190613c19565b61163f576040516326865f9b60e21b81526001600160a01b03821660048201526024016108d2565b611654335f356001600160e01b031916611d66565b5f5160206141fc5f395f51905f525460ff16156116845760405163ab35696f60e01b815260040160405180910390fd5b61168f8484846129f1565b50826001600160a01b0316846001600160a01b03167f7b3ce50c216d2ccf9919c6b9f1bfb33f0350a33010f188750b4af38e00448138846040516116d591815260200190565b60405180910390a350505050565b5f6116f9335f356001600160e01b031916611d66565b6040516364dad32f60e01b81526001600160a01b0384166004820152839030906364dad32f90602401602060405180830381865afa15801561173d573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906117619190613c19565b611789576040516326865f9b60e21b81526001600160a01b03821660048201526024016108d2565b5f5160206141fc5f395f51905f525460ff16156117b95760405163ab35696f60e01b815260040160405180910390fd5b6117c43385856129f1565b949350505050565b5f6106ac5f5160206141dc5f395f51905f525490565b5f6106ac5f5160206141fc5f395f51905f525460ff1690565b6001546060905f906001600160a01b0316158061182a5750600154611828906001600160a01b0316612339565b155b1561185757600154604051631f93601760e01b81526001600160a01b0390911660048201526024016108d2565b600154604080516328f5843360e21b815290516001600160a01b0390921691829163a3d610cc9160048083019260209291908290030181865afa1580156118a0573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906118c49190613f43565b9150806001600160a01b0316639198274f6040518163ffffffff1660e01b81526004015f60405180830381865afa158015611901573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526119289190810190613fae565b9250509091565b611944335f356001600160e01b031916611d66565b5f5160206141fc5f395f51905f525460ff16156119745760405163ab35696f60e01b815260040160405180910390fd5b61197c611c03565b604051624ff82360e21b81525f60048201526001600160a01b0384811660248301528315156044830152919091169063013fe08c906064015f604051808303815f87803b1580156119cb575f5ffd5b505af11580156119dd573d5f5f3e3d5ffd5b50505050816001600160a01b03167f5e20cf47b2259b331d4b7c60c19f771fc77bd7b207cb6438d0d217ea67755b57826040516107a1911515815260200190565b5f8054611a2a90613c34565b80601f0160208091040260200160405190810160405280929190818152602001828054611a5690613c34565b8015611aa15780601f10611a7857610100808354040283529160200191611aa1565b820191905f5260205f20905b815481529060010190602001808311611a8457829003601f168201915b505050505081565b611abe335f356001600160e01b031916611d66565b6040516364dad32f60e01b81526001600160a01b0388166004820152879030906364dad32f90602401602060405180830381865afa158015611b02573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611b269190613c19565b611b4e576040516326865f9b60e21b81526001600160a01b03821660048201526024016108d2565b5f5160206141fc5f395f51905f525460ff1615611b7e5760405163ab35696f60e01b815260040160405180910390fd5b611b8d88888888888888612ade565b5050505050505050565b6001600160a01b038083165f9081527f67df8e602072ae967fe4567cec1273e29da0bd7a5a1af20d9b5c8d3f0d838505602090815260408083209385168352929052908120546107fe565b611bf7335f356001600160e01b031916611d66565b611c0081612d08565b50565b5f6106ac5f51602061423c5f395f51905f52546001600160a01b031690565b6001546060906001600160a01b0316611c5057604051631f93601760e01b81525f60048201526024016108d2565b60015460408051633942720b60e11b815290516001600160a01b03909216918291637284e416916004808301925f9291908290030181865afa158015611c98573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611cbf9190810190613fe0565b91505090565b5f51602061425c5f395f51905f528054606091908190611ce490613c34565b80601f0160208091040260200160405190810160405280929190818152602001828054611d1090613c34565b8015611d5b5780601f10611d3257610100808354040283529160200191611d5b565b820191905f5260205f20905b815481529060010190602001808311611d3e57829003601f168201915b505050505091505090565b5f5f611d865f51602061423c5f395f51905f52546001600160a01b031690565b6040516001600160a01b0386811660248301526001600160e01b031986166044830152919091169060640160408051601f198184030181529181526020820180516001600160e01b0316630435f69f60e51b17905251611de69190614025565b5f60405180830381855afa9150503d805f8114611e1e576040519150601f19603f3d011682016040523d82523d5f602084013e611e23565b606091505b5091509150811580611e46575080806020019051810190611e449190613c19565b155b15611e63576040516282b42960e81b815260040160405180910390fd5b50505050565b5f6001600160a01b0384161580611e8757506001600160a01b038316155b15611ea55760405163d92e233d60e01b815260040160405180910390fd5b6001600160a01b038481165f8181527f67df8e602072ae967fe4567cec1273e29da0bd7a5a1af20d9b5c8d3f0d838505602090815260408083209488168084529482529182902086905590518581525f51602061425c5f395f51905f529392917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3506001949350505050565b6001600160a01b0383165f9081527f67df8e602072ae967fe4567cec1273e29da0bd7a5a1af20d9b5c8d3f0d838505602090815260408083203384529091528120545f51602061425c5f395f51905f52905f198114611fc557611f9f848261404f565b6001600160a01b0387165f90815260058401602090815260408083203384529091529020555b6109a68686866129f1565b306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148061204d57507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166120415f5160206141dc5f395f51905f525490565b6001600160a01b031614155b15610b675760405163703e46dd60e11b815260040160405180910390fd5b60015f5160206141bc5f395f51905f52556040517f5daa87a0e9463431830481fd4b6e3403442dfb9a12b9c07597e9f61d50b633c8905f90a1565b7f67df8e602072ae967fe4567cec1273e29da0bd7a5a1af20d9b5c8d3f0d838506545f51602061425c5f395f51905f52905f03611e6357806120e88582613cb7565b50600181016120f78482613cb7565b5060028101805460ff191660ff8416179055466006820155612117612d36565b600782015550505050565b5f51602061423c5f395f51905f5280546001600160a01b0316610b0957610b0982612d08565b7f2c9356b94ada349e65b0a691cd15e24beddfc13e05a26de25d9c64509c824401545f51602061421c5f395f51905f52905f03610b0957610b0982612de0565b604051309033907f16f2354671bbabcb07367cc01a78931a00a812ee080430be4e8f1a76ab58212b905f90a33330146121d35760405162e6155960e41b815260040160405180910390fd5b610b098282612e24565b7f67df8e602072ae967fe4567cec1273e29da0bd7a5a1af20d9b5c8d3f0d838506545f905f51602061425c5f395f51905f529046146122235761221e612d36565b611cbf565b60070154919050565b5f5160206141fc5f395f51905f525460ff1661225b5760405163dcdde9dd60e01b815260040160405180910390fd5b5f5160206141fc5f395f51905f52805460ff191681556040517fa45f47fdea8a1efdd9029a5691c7f759c32b7c698632b563573e155625d16933905f90a150565b7f67df8e602072ae967fe4567cec1273e29da0bd7a5a1af20d9b5c8d3f0d83850380545f51602061425c5f395f51905f529183915f906122dd908490614062565b90915550506001600160a01b0383165f8181526004830160209081526040808320805487019055518581527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91015b60405180910390a3505050565b5f816001600160a01b0316639d91348d6040518163ffffffff1660e01b81526004015f60405180830381865afa92505050801561239757506040513d5f823e601f3d908101601f191682016040526123949190810190613dcc565b60015b6123a257505f919050565b50600192915050565b919050565b6123b8611fd0565b6123c28282612e42565b610b098282612e97565b306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610b675760405163703e46dd60e11b815260040160405180910390fd5b5f61241e6123cc565b505f5160206141dc5f395f51905f5290565b5f51602061421c5f395f51905f5280545f61244a82611399565b50509150505f5f61245a83612ea1565b915091506124688282612e42565b61247184612ef4565b50505f9092555050565b5f806001600160a01b038516612501576040516001600160a01b0385169084905f81818185875af1925050503d805f81146124d1576040519150601f19603f3d011682016040523d82523d5f602084013e6124d6565b606091505b505080925050816124fa576040516312171d8360e31b815260040160405180910390fd5b50816126d3565b6040516370a0823160e01b81526001600160a01b03858116600483015286915f918316906370a0823190602401602060405180830381865afa158015612549573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061256d9190613f43565b604080516001600160a01b03898116602483015260448083018a905283518084039091018152606490920183526020820180516001600160e01b031663a9059cbb60e01b1790529151929350606092918a16916125ca9190614025565b5f604051808303815f865af19150503d805f8114612603576040519150601f19603f3d011682016040523d82523d5f602084013e612608565b606091505b50909550905084158061263757505f81511180156126375750808060200190518101906126359190613c19565b155b15612655576040516312171d8360e31b815260040160405180910390fd5b6040516370a0823160e01b81526001600160a01b0388811660048301525f91908516906370a0823190602401602060405180830381865afa15801561269c573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906126c09190613f43565b90506126cc838261404f565b9450505050505b836001600160a01b0316856001600160a01b03167f7a43eea7e0e6937c4baa97b10dabb89519feb249fe9ddcb442415b029148520d8584604051612721929190918252602082015260400190565b60405180910390a35050505050565b5f51602061421c5f395f51905f5280545f61274a82611399565b50509150505f5f61275a83612ea1565b915091506127688282612e42565b61247184612faf565b5f5160206141fc5f395f51905f525460ff16156127a15760405163ab35696f60e01b815260040160405180910390fd5b5f5160206141fc5f395f51905f52805460ff191660011781556040517f9e87fac88ff661f02d44f95383c817fece4bce600a3dab7a54406878b965e752905f90a150565b7f67df8e602072ae967fe4567cec1273e29da0bd7a5a1af20d9b5c8d3f0d83850180546060915f51602061425c5f395f51905f5291611ce490613c34565b5f8181527f1626844f871e5080d673ecb96ea8a32c7bdf671ea137282b2886cd9d0fd9a70260209081526040808320815160808101835281546001600160a01b03168152600182015493810193909352600281018054606094869485945f51602061419c5f395f51905f52948694919284019161289f90613c34565b80601f01602080910402602001604051908101604052809291908181526020018280546128cb90613c34565b80156129165780601f106128ed57610100808354040283529160200191612916565b820191905f5260205f20905b8154815290600101906020018083116128f957829003601f168201915b505050505081526020016003820154815250509050805f0151816040015182602001518360600151955095509550955050509193509193565b6001600160a01b0382165f9081527f67df8e602072ae967fe4567cec1273e29da0bd7a5a1af20d9b5c8d3f0d8385046020526040812080545f51602061425c5f395f51905f52928492916129a490849061404f565b909155505060038101805483900390556040518281525f906001600160a01b038516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200161232c565b5f6001600160a01b0384161580612a0f57506001600160a01b038316155b15612a2d5760405163d92e233d60e01b815260040160405180910390fd5b6001600160a01b0384165f9081527f67df8e602072ae967fe4567cec1273e29da0bd7a5a1af20d9b5c8d3f0d8385046020526040812080545f51602061425c5f395f51905f5292859291612a8290849061404f565b90915550506001600160a01b038085165f818152600484016020526040908190208054870190555190918716907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90611f299087815260200190565b42841015612aff576040516305787bdf60e01b815260040160405180910390fd5b6001600160a01b0387165f9081527f67df8e602072ae967fe4567cec1273e29da0bd7a5a1af20d9b5c8d3f0d83850860205260408120805460018082019092555f51602061425c5f395f51905f52929091612b586121dd565b604080517f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c960208201526001600160a01b03808f1692820192909252908c166060820152608081018b905260a0810185905260c081018a905260e00160405160208183030381529060405280519060200120604051602001612bf192919061190160f01b81526002810192909252602282015260420190565b60408051601f1981840301815282825280516020918201205f84529083018083525260ff891690820152606081018790526080810186905260a0016020604051602081039080840390855afa158015612c4c573d5f5f3e3d5ffd5b5050604051601f1901519150506001600160a01b0381161580612c815750896001600160a01b0316816001600160a01b031614155b15612c9f57604051632057875960e21b815260040160405180910390fd5b50506001600160a01b038881165f8181526005840160209081526040808320948c16808452948252918290208a905590518981527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a35050505050505050565b5f51602061423c5f395f51905f5280546001600160a01b0319166001600160a01b0392909216919091179055565b6040515f905f51602061425c5f395f51905f52907f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f90612d77908390614075565b6040805191829003822060208301939093528101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608201524660808201523060a082015260c0016040516020818303038152906040528051906020012091505090565b805f03612e00576040516327df2edd60e11b815260040160405180910390fd5b7f2c9356b94ada349e65b0a691cd15e24beddfc13e05a26de25d9c64509c82440155565b612e2e8282613202565b612e38828261321e565b610b098282613273565b612e4a611c03565b6001600160a01b0316336001600160a01b031614610b095733612e6b611c03565b60405163fe6cd27560e01b81526001600160a01b039283166004820152911660248201526044016108d2565b610b0982826132a6565b5f6060606483511015612ec75760405163fc69850b60e01b815260040160405180910390fd5b8251612ed7908490600490613363565b806020019051810190612eea91906140e6565b9094909350915050565b5f8181527f1626844f871e5080d673ecb96ea8a32c7bdf671ea137282b2886cd9d0fd9a70160205260409020545f51602061419c5f395f51905f529015610b09575f8281526001808301602090815260408084208490556002808601909252832080546001600160a01b0319168155918201839055909190612f7890830182613742565b505f60039190910181905560405183917f134fdd648feeaf30251f0157f9624ef8608ff9a042aad6d13e73f35d21d3f88d91a25050565b612fb8816133e2565b5f8181527f1626844f871e5080d673ecb96ea8a32c7bdf671ea137282b2886cd9d0fd9a70260209081526040808320815160808101835281546001600160a01b031681526001820154938101939093526002810180545f51602061419c5f395f51905f529594938401919061302c90613c34565b80601f016020809104026020016040519081016040528092919081815260200182805461305890613c34565b80156130a35780601f1061307a576101008083540402835291602001916130a3565b820191905f5260205f20905b81548152906001019060200180831161308657829003601f168201915b50505091835250506003919091015460209182015281519082015160408301519293509091478211156130f15760405162fae2d560e21b8152600481018390524760248201526044016108d2565b5f8681526001808701602090815260408084208490556002808a01909252832080546001600160a01b031916815591820183905590919061313490830182613742565b600382015f905550505f836001600160a01b031683836040516131579190614025565b5f6040518083038185875af1925050503d805f8114613191576040519150601f19603f3d011682016040523d82523d5f602084013e613196565b606091505b50509050806131bb5760405163165a1d4160e01b8152600481018890526024016108d2565b867fbc76564aec85e3f50672da2d1ddca0390851fecefe61cd19d89dea91a8267829858585426040516131f1949392919061412a565b60405180910390a250505050505050565b805115610b0957610b095f5f5160206141bc5f395f51905f5255565b6132278261345f565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a280511561326b57610c488282613479565b610b09613505565b5f81511180156132885750613286610b34565b155b15610b095760405163b3a31bfd60e01b815260040160405180910390fd5b5f51602061421c5f395f51905f5254156132d35760405163e741fd4560e01b815260040160405180910390fd5b7f2c9356b94ada349e65b0a691cd15e24beddfc13e05a26de25d9c64509c824401545f51602061421c5f395f51905f52905f906133109042614062565b90505f61335a30868660405160240161332a929190614162565b60408051601f198184030181529190526020810180516001600160e01b03166319cccfd360e11b17905284613524565b90925550505050565b606061337082855161363e565b915061337c838361363e565b9250613388838361404f565b67ffffffffffffffff8111156133a0576133a061388c565b6040519080825280601f01601f1916602001820160405280156133ca576020820181803683370190505b509050828203836020860101602083015e9392505050565b5f8181527f1626844f871e5080d673ecb96ea8a32c7bdf671ea137282b2886cd9d0fd9a70160205260408120545f51602061419c5f395f51905f529181900361343e57604051634b9aaa0960e11b815260040160405180910390fd5b80421015610c4857604051630f0b32ff60e11b815260040160405180910390fd5b61346881613653565b5f5160206141dc5f395f51905f5255565b60605f5f846001600160a01b0316846040516134959190614025565b5f60405180830381855af49150503d805f81146134cd576040519150601f19603f3d011682016040523d82523d5f602084013e6134d2565b606091505b5091509150816117c4578051156134ec5780518082602001fd5b60405163d6bda27560e01b815260040160405180910390fd5b3415610b675760405163b398979f60e01b815260040160405180910390fd5b5f8142106135455760405163b7d0949760e01b815260040160405180910390fd5b5f51602061419c5f395f51905f5280543490825f61356283614183565b909155505081545f81815260018085016020908152604080842089905580516080810182526001600160a01b038c811682528184018881528284018d8152606084018d90528888526002808c0190965293909620825181546001600160a01b0319169216919091178155945193850193909355519396509092908201906135e99082613cb7565b5060608201518160030155905050827f8d6fedd41517ab865c3658696c50923b3493c8a93ffd016d919a599f03c7531b8783888860405161362d949392919061412a565b60405180910390a250509392505050565b5f81831061364c57816107fe565b5090919050565b806001600160a01b03163b5f0361368857604051634c9c8ce360e01b81526001600160a01b03821660048201526024016108d2565b806001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa9250505080156136e2575060408051601f3d908101601f191682019092526136df91810190613f43565b60015b61370a57604051634c9c8ce360e01b81526001600160a01b03821660048201526024016108d2565b5f5160206141dc5f395f51905f528114610b0957604051634c9c8ce360e01b81526001600160a01b03831660048201526024016108d2565b50805461374e90613c34565b5f825580601f1061375d575050565b601f0160209004905f5260205f2090810190611c0091905b80821115613788575f8155600101613775565b5090565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f6107fe602083018461378c565b6001600160a01b0381168114611c00575f5ffd5b8015158114611c00575f5ffd5b5f5f604083850312156137fe575f5ffd5b8235613809816137cc565b91506020830135613819816137e0565b809150509250929050565b5f5f60408385031215613835575f5ffd5b8235613840816137cc565b946020939093013593505050565b5f5f5f60608486031215613860575f5ffd5b833561386b816137cc565b9250602084013561387b816137cc565b929592945050506040919091013590565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f1916810167ffffffffffffffff811182821017156138c9576138c961388c565b604052919050565b5f67ffffffffffffffff8211156138ea576138ea61388c565b50601f01601f191660200190565b5f61390a613905846138d1565b6138a0565b905082815283838301111561391d575f5ffd5b828260208301375f602084830101529392505050565b5f82601f830112613942575f5ffd5b6107fe838335602085016138f8565b60ff81168114611c00575f5ffd5b5f5f5f5f5f5f60c08789031215613974575f5ffd5b863567ffffffffffffffff81111561398a575f5ffd5b61399689828a01613933565b965050602087013567ffffffffffffffff8111156139b2575f5ffd5b6139be89828a01613933565b95505060408701356139cf81613951565b9350606087013567ffffffffffffffff8111156139ea575f5ffd5b6139f689828a01613933565b9350506080870135613a07816137cc565b9598949750929591949360a090920135925050565b5f60208284031215613a2c575f5ffd5b8135613a37816137cc565b9392505050565b5f5f60408385031215613a4f575f5ffd5b8235613a5a816137cc565b9150602083013567ffffffffffffffff811115613a75575f5ffd5b8301601f81018513613a85575f5ffd5b613a94858235602084016138f8565b9150509250929050565b602080825282518282018190525f918401906040840190835b81811015613ad857835160ff16835260209384019390920191600101613ab7565b509095945050505050565b5f60208284031215613af3575f5ffd5b813567ffffffffffffffff811115613b09575f5ffd5b6117c484828501613933565b5f60208284031215613b25575f5ffd5b5035919050565b6001600160a01b0385168152608060208201525f613b4d608083018661378c565b6040830194909452506060015292915050565b604081525f613b72604083018561378c565b90508260208301529392505050565b5f5f5f5f5f5f5f60e0888a031215613b97575f5ffd5b8735613ba2816137cc565b96506020880135613bb2816137cc565b955060408801359450606088013593506080880135613bd081613951565b9699959850939692959460a0840135945060c09093013592915050565b5f5f60408385031215613bfe575f5ffd5b8235613c09816137cc565b91506020830135613819816137cc565b5f60208284031215613c29575f5ffd5b8151613a37816137e0565b600181811c90821680613c4857607f821691505b602082108103613c6657634e487b7160e01b5f52602260045260245ffd5b50919050565b601f821115610c4857805f5260205f20601f840160051c81016020851015613c915750805b601f840160051c820191505b81811015613cb0575f8155600101613c9d565b5050505050565b815167ffffffffffffffff811115613cd157613cd161388c565b613ce581613cdf8454613c34565b84613c6c565b6020601f821160018114613d17575f8315613d005750848201515b5f19600385901b1c1916600184901b178455613cb0565b5f84815260208120601f198516915b82811015613d465787850151825560209485019460019092019101613d26565b5084821015613d6357868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b5f604082016001600160a01b0385168352604060208401528084518083526060850191506020860192505f5b81811015613dc057835161ffff16835260209384019390920191600101613d9e565b50909695505050505050565b5f60208284031215613ddc575f5ffd5b815167ffffffffffffffff811115613df2575f5ffd5b8201601f81018413613e02575f5ffd5b805167ffffffffffffffff811115613e1c57613e1c61388c565b8060051b613e2c602082016138a0565b91825260208184018101929081019087841115613e47575f5ffd5b6020850194505b83851015613e755784519250613e6383613951565b82825260209485019490910190613e4e565b979650505050505050565b5f60208284031215613e90575f5ffd5b8151613a3781613951565b634e487b7160e01b5f52603260045260245ffd5b604081525f613ec1604083018561378c565b8281036020840152613ed3818561378c565b95945050505050565b805169ffffffffffffffffffff811681146123ab575f5ffd5b5f5f5f5f5f60a08688031215613f09575f5ffd5b613f1286613edc565b60208701516040880151606089015192975090955093509150613f3760808701613edc565b90509295509295909350565b5f60208284031215613f53575f5ffd5b5051919050565b5f613f67613905846138d1565b9050828152838383011115613f7a575f5ffd5b8282602083015e5f602084830101529392505050565b5f82601f830112613f9f575f5ffd5b6107fe83835160208501613f5a565b5f60208284031215613fbe575f5ffd5b815167ffffffffffffffff811115613fd4575f5ffd5b6117c484828501613f90565b5f60208284031215613ff0575f5ffd5b815167ffffffffffffffff811115614006575f5ffd5b8201601f81018413614016575f5ffd5b6117c484825160208401613f5a565b5f82518060208501845e5f920191825250919050565b634e487b7160e01b5f52601160045260245ffd5b818103818111156108015761080161403b565b808201808211156108015761080161403b565b5f5f835461408281613c34565b60018216801561409957600181146140ae576140db565b60ff19831686528115158202860193506140db565b865f5260205f205f5b838110156140d3578154888201526001909101906020016140b7565b505081860193505b509195945050505050565b5f5f604083850312156140f7575f5ffd5b8251614102816137cc565b602084015190925067ffffffffffffffff81111561411e575f5ffd5b613a9485828601613f90565b6001600160a01b0385168152836020820152608060408201525f614151608083018561378c565b905082606083015295945050505050565b6001600160a01b0383168152604060208201525f6117c4604083018461378c565b5f600182016141945761419461403b565b506001019056fe1626844f871e5080d673ecb96ea8a32c7bdf671ea137282b2886cd9d0fd9a700112dd7b7d700a9bfd03edf4d4ce6f92b1f5f1a2fd81fde871f4db11384aa0b00360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbcfedd7b171e5aaf71411eb61c81513b977191128c387240284b4edb396fcbdb002c9356b94ada349e65b0a691cd15e24beddfc13e05a26de25d9c64509c8244001fa5656f3245be71aa51744436d19e5d46b909e499930c5c32c93901cab5290067df8e602072ae967fe4567cec1273e29da0bd7a5a1af20d9b5c8d3f0d838500a264697066735822122035e0410d4d866dbce71da568bdb6a948e20748cc7ea05eb3930bbfd8a939035964736f6c634300081e0033","sourceMap":"1127:5125:5:-:0;;;1629:4:27;1586:48;;1127:5125:5;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;","linkReferences":{}},"deployedBytecode":{"object":"608060405234801561000f575f5ffd5b5060043610610325575f3560e01c806364dad32f116101a85780639fc1d0e7116100f3578063c9c16fbd1161009e578063dd62ed3e11610079578063dd62ed3e1461066c578063ef3e8f221461067f578063f2e23d2214610692578063f8fa842b1461069a575f5ffd5b8063c9c16fbd1461063e578063d4a1911614610651578063d505accf14610659575f5ffd5b8063b187bd26116100ce578063b187bd2614610619578063bf4dc4b614610621578063c1491c5814610628575f5ffd5b80639fc1d0e7146105eb578063a9059cbb146105fe578063aaf10f4214610611575f5ffd5b80638456cb591161015357806398d2082f1161012e57806398d2082f1461059857806398d5fdca146105bb5780639dc29fac146105d8575f5ffd5b80638456cb591461057557806395d89b411461057d57806398cd615314610585575f5ffd5b80637ab8bf5a116101835780637ab8bf5a146105475780637e8962141461055a5780637ecebe0014610562575f5ffd5b806364dad32f1461050e5780636d70f7ae1461052157806370a0823114610534575f5ffd5b80633f4ba83a116102735780634f1ef2861161021e5780635845394b116101f95780635845394b146104aa5780635965959e146104d55780635ca13f04146104e85780635d3590d5146104fb575f5ffd5b80634f1ef2861461048757806352d1902d1461049a57806355f29166146104a2575f5ffd5b8063426796831161024e578063426796831461044e578063440fde4e1461046157806346fbf68e14610474575f5ffd5b80633f4ba83a1461041e57806340c10f1914610426578063422f8c0a14610439575f5ffd5b80632d524393116102d357806334cdcf26116102ae57806334cdcf26146103fb5780633644e5151461040e578063392e53cd14610416575f5ffd5b80632d524393146103bb578063313ce567146103ce57806333999fa6146103e8575f5ffd5b806318160ddd1161030357806318160ddd1461037f57806323b872dd14610395578063257e224c146103a8575f5ffd5b806306fdde031461032957806307e2a26014610347578063095ea7b31461035c575b5f5ffd5b6103316106a2565b60405161033e91906137ba565b60405180910390f35b61035a6103553660046137ed565b6106b1565b005b61036f61036a366004613824565b6107ad565b604051901515815260200161033e565b610387610807565b60405190815260200161033e565b61036f6103a336600461384e565b610830565b61035a6103b636600461395f565b6109b0565b61036f6103c9366004613a1c565b610a33565b6103d6610ad3565b60405160ff909116815260200161033e565b61035a6103f6366004613a3e565b610aff565b61036f610409366004613a1c565b610b0d565b610387610b2b565b61036f610b34565b61035a610b4a565b61035a610434366004613824565b610b69565b610441610c4d565b60405161033e9190613a9e565b61036f61045c366004613a1c565b610dc0565b61035a61046f366004613a1c565b610dde565b61036f610482366004613a1c565b610e7e565b61035a610495366004613a3e565b610e9c565b610387610eae565b61035a610ebf565b6001546104bd906001600160a01b031681565b6040516001600160a01b03909116815260200161033e565b61035a6104e33660046137ed565b610ef3565b61035a6104f63660046137ed565b610fe3565b61035a61050936600461384e565b6110d3565b61036f61051c366004613a1c565b611123565b61036f61052f366004613a1c565b611141565b610387610542366004613a1c565b61115f565b61036f610555366004613a1c565b61119b565b61035a6111b9565b610387610570366004613a1c565b6111ed565b61035a611229565b610331611246565b61035a610593366004613ae3565b611250565b6105ab6105a6366004613b15565b611399565b60405161033e9493929190613b2c565b6105c36113b6565b6040805192835260208301919091520161033e565b61035a6105e6366004613824565b6114d0565b61035a6105f936600461384e565b6115af565b61036f61060c366004613824565b6116e3565b6104bd6117cc565b61036f6117e2565b600161036f565b6106306117fb565b60405161033e929190613b60565b61035a61064c3660046137ed565b61192f565b610331611a1e565b61035a610667366004613b81565b611aa9565b61038761067a366004613bed565b611b97565b61035a61068d366004613a1c565b611be2565b6104bd611c03565b610331611c22565b60606106ac611cc5565b905090565b6106c6335f356001600160e01b031916611d66565b5f5160206141fc5f395f51905f525460ff16156106f65760405163ab35696f60e01b815260040160405180910390fd5b6106fe611c03565b604051636bcd157760e11b81525f60048201526001600160a01b0384811660248301528315156044830152919091169063d79a2aee906064015f604051808303815f87803b15801561074e575f5ffd5b505af1158015610760573d5f5f3e3d5ffd5b50505050816001600160a01b03167fd4145d5d40015b9d77048466bbe3ff2411630f7b70f80f9d79c273b6311aba74826040516107a1911515815260200190565b60405180910390a25050565b5f6107c3335f356001600160e01b031916611d66565b5f5160206141fc5f395f51905f525460ff16156107f35760405163ab35696f60e01b815260040160405180910390fd5b6107fe338484611e69565b90505b92915050565b5f6106ac7f67df8e602072ae967fe4567cec1273e29da0bd7a5a1af20d9b5c8d3f0d8385035490565b5f610846335f356001600160e01b031916611d66565b6040516364dad32f60e01b81526001600160a01b0385166004820152849030906364dad32f90602401602060405180830381865afa15801561088a573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108ae9190613c19565b6108db576040516326865f9b60e21b81526001600160a01b03821660048201526024015b60405180910390fd5b6040516364dad32f60e01b81526001600160a01b0385166004820152849030906364dad32f90602401602060405180830381865afa15801561091f573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109439190613c19565b61096b576040516326865f9b60e21b81526001600160a01b03821660048201526024016108d2565b5f5160206141fc5f395f51905f525460ff161561099b5760405163ab35696f60e01b815260040160405180910390fd5b6109a6868686611f3c565b9695505050505050565b6109b8611fd0565b5f5160206141bc5f395f51905f5254156109e55760405163f92ee8a960e01b815260040160405180910390fd5b6109ed61206b565b6109f88686866120a6565b610a0182612122565b610a0a81612148565b5f8054610a1690613c34565b90505f03610a2b575f610a298482613cb7565b505b505050505050565b5f610a3c611c03565b6001600160a01b031663970f8482835f5b604051908082528060200260200182016040528015610a76578160200160208202803683370190505b506040518363ffffffff1660e01b8152600401610a94929190613d72565b602060405180830381865afa158015610aaf573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108019190613c19565b5f6106ac7f67df8e602072ae967fe4567cec1273e29da0bd7a5a1af20d9b5c8d3f0d8385025460ff1690565b610b098282612188565b5050565b5f610b16611c03565b6001600160a01b031663f5fe5787835f610a4d565b5f6106ac6121dd565b5f6106ac5f5160206141bc5f395f51905f525490565b610b5f335f356001600160e01b031916611d66565b610b6761222c565b565b610b7e335f356001600160e01b031916611d66565b6040516364dad32f60e01b81526001600160a01b0383166004820152829030906364dad32f90602401602060405180830381865afa158015610bc2573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610be69190613c19565b610c0e576040516326865f9b60e21b81526001600160a01b03821660048201526024016108d2565b5f5160206141fc5f395f51905f525460ff1615610c3e5760405163ab35696f60e01b815260040160405180910390fd5b610c48838361229c565b505050565b6001546060906001600160a01b0316610c7b57604051631f93601760e01b81525f60048201526024016108d2565b600154610c90906001600160a01b0316612339565b15610d0b5760015f9054906101000a90046001600160a01b03166001600160a01b0316639d91348d6040518163ffffffff1660e01b81526004015f60405180830381865afa158015610ce4573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526106ac9190810190613dcc565b6040805160018082528183019092525f916020808301908036833750506001546040805163313ce56760e01b815290519394506001600160a01b039091169263313ce567925060048083019260209291908290030181865afa158015610d73573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d979190613e80565b815f81518110610da957610da9613e9b565b60ff90921660209283029190910190910152919050565b5f610dc9611c03565b6001600160a01b031663ffb2f26f835f610a4d565b610df3335f356001600160e01b031916611d66565b6001546001600160a01b039081169082168103610e2e57604051631eeb14f160e01b81526001600160a01b03831660048201526024016108d2565b600180546001600160a01b0319166001600160a01b0384811691821790925560405190918316907fd76fb624f0e2e090c9f82772a08d122c79250c90c7a896b1ed0de8bbe3e9e2e4905f90a35050565b5f610e87611c03565b6001600160a01b0316636f06fa43835f610a4d565b610ea4611fd0565b610b0982826123b0565b5f610eb76123cc565b6106ac612415565b5f51602061421c5f395f51905f5254610eeb57604051630604a9ff60e01b815260040160405180910390fd5b610b67612430565b610f08335f356001600160e01b031916611d66565b5f5160206141fc5f395f51905f525460ff1615610f385760405163ab35696f60e01b815260040160405180910390fd5b610f40611c03565b604051632b73cd6360e21b81525f60048201526001600160a01b0384811660248301528315156044830152919091169063adcf358c906064015f604051808303815f87803b158015610f90575f5ffd5b505af1158015610fa2573d5f5f3e3d5ffd5b50505050816001600160a01b03167fc71e52f779c12ade7cbf75a51deb27377b5addd6a3945e0b356bff858ffad7fb826040516107a1911515815260200190565b610ff8335f356001600160e01b031916611d66565b5f5160206141fc5f395f51905f525460ff16156110285760405163ab35696f60e01b815260040160405180910390fd5b611030611c03565b60405163361fa22b60e01b81525f60048201526001600160a01b0384811660248301528315156044830152919091169063361fa22b906064015f604051808303815f87803b158015611080575f5ffd5b505af1158015611092573d5f5f3e3d5ffd5b50505050816001600160a01b03167f6b410344a541a2ad2ffec50ea1cafabe58c50db82f72ae4f46a4bd2419155b15826040516107a1911515815260200190565b6110e8335f356001600160e01b031916611d66565b5f5160206141fc5f395f51905f525460ff16156111185760405163ab35696f60e01b815260040160405180910390fd5b610c4883838361247b565b5f61112c611c03565b6001600160a01b031663f2563ef3835f610a4d565b5f61114a611c03565b6001600160a01b031663394340e8835f610a4d565b6001600160a01b0381165f9081527f67df8e602072ae967fe4567cec1273e29da0bd7a5a1af20d9b5c8d3f0d8385046020526040812054610801565b5f6111a4611c03565b6001600160a01b03166378143d56835f610a4d565b5f51602061421c5f395f51905f52546111e557604051630604a9ff60e01b815260040160405180910390fd5b610b67612730565b6001600160a01b0381165f9081527f67df8e602072ae967fe4567cec1273e29da0bd7a5a1af20d9b5c8d3f0d8385086020526040812054610801565b61123e335f356001600160e01b031916611d66565b610b67612771565b60606106ac6127e5565b611265335f356001600160e01b031916611d66565b5f5160206141fc5f395f51905f525460ff16156112955760405163ab35696f60e01b815260040160405180910390fd5b5f5f80546112a290613c34565b80601f01602080910402602001604051908101604052809291908181526020018280546112ce90613c34565b80156113195780601f106112f057610100808354040283529160200191611319565b820191905f5260205f20905b8154815290600101906020018083116112fc57829003601f168201915b5050505050905081805190602001208180519060200120036113505781604051638651f2a560e01b81526004016108d291906137ba565b5f61135b8382613cb7565b507ffd07e2c2d6dc82f4d6b1b46f25e49eb888aba92d238fb40945856412cce2f2dd818360405161138d929190613eaf565b60405180910390a15050565b5f60605f5f6113a785612823565b93509350935093509193509193565b6001545f9081906001600160a01b031615806113e257506001546113e2906001600160a01b0316612339565b1561140f57600154604051631f93601760e01b81526001600160a01b0390911660048201526024016108d2565b60015f9054906101000a90046001600160a01b03166001600160a01b031663feaf968c6040518163ffffffff1660e01b815260040160a060405180830381865afa15801561145f573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906114839190613ef5565b5091945090925050505f8190036114ad57604051638ad52bdd60e01b815260040160405180910390fd5b5f82136114cc5760405162bfc92160e01b815260040160405180910390fd5b9091565b6114e5335f356001600160e01b031916611d66565b6040516364dad32f60e01b81526001600160a01b0383166004820152829030906364dad32f90602401602060405180830381865afa158015611529573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061154d9190613c19565b611575576040516326865f9b60e21b81526001600160a01b03821660048201526024016108d2565b5f5160206141fc5f395f51905f525460ff16156115a55760405163ab35696f60e01b815260040160405180910390fd5b610c48838361294f565b6040516364dad32f60e01b81526001600160a01b0383166004820152829030906364dad32f90602401602060405180830381865afa1580156115f3573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906116179190613c19565b61163f576040516326865f9b60e21b81526001600160a01b03821660048201526024016108d2565b611654335f356001600160e01b031916611d66565b5f5160206141fc5f395f51905f525460ff16156116845760405163ab35696f60e01b815260040160405180910390fd5b61168f8484846129f1565b50826001600160a01b0316846001600160a01b03167f7b3ce50c216d2ccf9919c6b9f1bfb33f0350a33010f188750b4af38e00448138846040516116d591815260200190565b60405180910390a350505050565b5f6116f9335f356001600160e01b031916611d66565b6040516364dad32f60e01b81526001600160a01b0384166004820152839030906364dad32f90602401602060405180830381865afa15801561173d573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906117619190613c19565b611789576040516326865f9b60e21b81526001600160a01b03821660048201526024016108d2565b5f5160206141fc5f395f51905f525460ff16156117b95760405163ab35696f60e01b815260040160405180910390fd5b6117c43385856129f1565b949350505050565b5f6106ac5f5160206141dc5f395f51905f525490565b5f6106ac5f5160206141fc5f395f51905f525460ff1690565b6001546060905f906001600160a01b0316158061182a5750600154611828906001600160a01b0316612339565b155b1561185757600154604051631f93601760e01b81526001600160a01b0390911660048201526024016108d2565b600154604080516328f5843360e21b815290516001600160a01b0390921691829163a3d610cc9160048083019260209291908290030181865afa1580156118a0573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906118c49190613f43565b9150806001600160a01b0316639198274f6040518163ffffffff1660e01b81526004015f60405180830381865afa158015611901573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526119289190810190613fae565b9250509091565b611944335f356001600160e01b031916611d66565b5f5160206141fc5f395f51905f525460ff16156119745760405163ab35696f60e01b815260040160405180910390fd5b61197c611c03565b604051624ff82360e21b81525f60048201526001600160a01b0384811660248301528315156044830152919091169063013fe08c906064015f604051808303815f87803b1580156119cb575f5ffd5b505af11580156119dd573d5f5f3e3d5ffd5b50505050816001600160a01b03167f5e20cf47b2259b331d4b7c60c19f771fc77bd7b207cb6438d0d217ea67755b57826040516107a1911515815260200190565b5f8054611a2a90613c34565b80601f0160208091040260200160405190810160405280929190818152602001828054611a5690613c34565b8015611aa15780601f10611a7857610100808354040283529160200191611aa1565b820191905f5260205f20905b815481529060010190602001808311611a8457829003601f168201915b505050505081565b611abe335f356001600160e01b031916611d66565b6040516364dad32f60e01b81526001600160a01b0388166004820152879030906364dad32f90602401602060405180830381865afa158015611b02573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611b269190613c19565b611b4e576040516326865f9b60e21b81526001600160a01b03821660048201526024016108d2565b5f5160206141fc5f395f51905f525460ff1615611b7e5760405163ab35696f60e01b815260040160405180910390fd5b611b8d88888888888888612ade565b5050505050505050565b6001600160a01b038083165f9081527f67df8e602072ae967fe4567cec1273e29da0bd7a5a1af20d9b5c8d3f0d838505602090815260408083209385168352929052908120546107fe565b611bf7335f356001600160e01b031916611d66565b611c0081612d08565b50565b5f6106ac5f51602061423c5f395f51905f52546001600160a01b031690565b6001546060906001600160a01b0316611c5057604051631f93601760e01b81525f60048201526024016108d2565b60015460408051633942720b60e11b815290516001600160a01b03909216918291637284e416916004808301925f9291908290030181865afa158015611c98573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611cbf9190810190613fe0565b91505090565b5f51602061425c5f395f51905f528054606091908190611ce490613c34565b80601f0160208091040260200160405190810160405280929190818152602001828054611d1090613c34565b8015611d5b5780601f10611d3257610100808354040283529160200191611d5b565b820191905f5260205f20905b815481529060010190602001808311611d3e57829003601f168201915b505050505091505090565b5f5f611d865f51602061423c5f395f51905f52546001600160a01b031690565b6040516001600160a01b0386811660248301526001600160e01b031986166044830152919091169060640160408051601f198184030181529181526020820180516001600160e01b0316630435f69f60e51b17905251611de69190614025565b5f60405180830381855afa9150503d805f8114611e1e576040519150601f19603f3d011682016040523d82523d5f602084013e611e23565b606091505b5091509150811580611e46575080806020019051810190611e449190613c19565b155b15611e63576040516282b42960e81b815260040160405180910390fd5b50505050565b5f6001600160a01b0384161580611e8757506001600160a01b038316155b15611ea55760405163d92e233d60e01b815260040160405180910390fd5b6001600160a01b038481165f8181527f67df8e602072ae967fe4567cec1273e29da0bd7a5a1af20d9b5c8d3f0d838505602090815260408083209488168084529482529182902086905590518581525f51602061425c5f395f51905f529392917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3506001949350505050565b6001600160a01b0383165f9081527f67df8e602072ae967fe4567cec1273e29da0bd7a5a1af20d9b5c8d3f0d838505602090815260408083203384529091528120545f51602061425c5f395f51905f52905f198114611fc557611f9f848261404f565b6001600160a01b0387165f90815260058401602090815260408083203384529091529020555b6109a68686866129f1565b306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148061204d57507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166120415f5160206141dc5f395f51905f525490565b6001600160a01b031614155b15610b675760405163703e46dd60e11b815260040160405180910390fd5b60015f5160206141bc5f395f51905f52556040517f5daa87a0e9463431830481fd4b6e3403442dfb9a12b9c07597e9f61d50b633c8905f90a1565b7f67df8e602072ae967fe4567cec1273e29da0bd7a5a1af20d9b5c8d3f0d838506545f51602061425c5f395f51905f52905f03611e6357806120e88582613cb7565b50600181016120f78482613cb7565b5060028101805460ff191660ff8416179055466006820155612117612d36565b600782015550505050565b5f51602061423c5f395f51905f5280546001600160a01b0316610b0957610b0982612d08565b7f2c9356b94ada349e65b0a691cd15e24beddfc13e05a26de25d9c64509c824401545f51602061421c5f395f51905f52905f03610b0957610b0982612de0565b604051309033907f16f2354671bbabcb07367cc01a78931a00a812ee080430be4e8f1a76ab58212b905f90a33330146121d35760405162e6155960e41b815260040160405180910390fd5b610b098282612e24565b7f67df8e602072ae967fe4567cec1273e29da0bd7a5a1af20d9b5c8d3f0d838506545f905f51602061425c5f395f51905f529046146122235761221e612d36565b611cbf565b60070154919050565b5f5160206141fc5f395f51905f525460ff1661225b5760405163dcdde9dd60e01b815260040160405180910390fd5b5f5160206141fc5f395f51905f52805460ff191681556040517fa45f47fdea8a1efdd9029a5691c7f759c32b7c698632b563573e155625d16933905f90a150565b7f67df8e602072ae967fe4567cec1273e29da0bd7a5a1af20d9b5c8d3f0d83850380545f51602061425c5f395f51905f529183915f906122dd908490614062565b90915550506001600160a01b0383165f8181526004830160209081526040808320805487019055518581527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91015b60405180910390a3505050565b5f816001600160a01b0316639d91348d6040518163ffffffff1660e01b81526004015f60405180830381865afa92505050801561239757506040513d5f823e601f3d908101601f191682016040526123949190810190613dcc565b60015b6123a257505f919050565b50600192915050565b919050565b6123b8611fd0565b6123c28282612e42565b610b098282612e97565b306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610b675760405163703e46dd60e11b815260040160405180910390fd5b5f61241e6123cc565b505f5160206141dc5f395f51905f5290565b5f51602061421c5f395f51905f5280545f61244a82611399565b50509150505f5f61245a83612ea1565b915091506124688282612e42565b61247184612ef4565b50505f9092555050565b5f806001600160a01b038516612501576040516001600160a01b0385169084905f81818185875af1925050503d805f81146124d1576040519150601f19603f3d011682016040523d82523d5f602084013e6124d6565b606091505b505080925050816124fa576040516312171d8360e31b815260040160405180910390fd5b50816126d3565b6040516370a0823160e01b81526001600160a01b03858116600483015286915f918316906370a0823190602401602060405180830381865afa158015612549573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061256d9190613f43565b604080516001600160a01b03898116602483015260448083018a905283518084039091018152606490920183526020820180516001600160e01b031663a9059cbb60e01b1790529151929350606092918a16916125ca9190614025565b5f604051808303815f865af19150503d805f8114612603576040519150601f19603f3d011682016040523d82523d5f602084013e612608565b606091505b50909550905084158061263757505f81511180156126375750808060200190518101906126359190613c19565b155b15612655576040516312171d8360e31b815260040160405180910390fd5b6040516370a0823160e01b81526001600160a01b0388811660048301525f91908516906370a0823190602401602060405180830381865afa15801561269c573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906126c09190613f43565b90506126cc838261404f565b9450505050505b836001600160a01b0316856001600160a01b03167f7a43eea7e0e6937c4baa97b10dabb89519feb249fe9ddcb442415b029148520d8584604051612721929190918252602082015260400190565b60405180910390a35050505050565b5f51602061421c5f395f51905f5280545f61274a82611399565b50509150505f5f61275a83612ea1565b915091506127688282612e42565b61247184612faf565b5f5160206141fc5f395f51905f525460ff16156127a15760405163ab35696f60e01b815260040160405180910390fd5b5f5160206141fc5f395f51905f52805460ff191660011781556040517f9e87fac88ff661f02d44f95383c817fece4bce600a3dab7a54406878b965e752905f90a150565b7f67df8e602072ae967fe4567cec1273e29da0bd7a5a1af20d9b5c8d3f0d83850180546060915f51602061425c5f395f51905f5291611ce490613c34565b5f8181527f1626844f871e5080d673ecb96ea8a32c7bdf671ea137282b2886cd9d0fd9a70260209081526040808320815160808101835281546001600160a01b03168152600182015493810193909352600281018054606094869485945f51602061419c5f395f51905f52948694919284019161289f90613c34565b80601f01602080910402602001604051908101604052809291908181526020018280546128cb90613c34565b80156129165780601f106128ed57610100808354040283529160200191612916565b820191905f5260205f20905b8154815290600101906020018083116128f957829003601f168201915b505050505081526020016003820154815250509050805f0151816040015182602001518360600151955095509550955050509193509193565b6001600160a01b0382165f9081527f67df8e602072ae967fe4567cec1273e29da0bd7a5a1af20d9b5c8d3f0d8385046020526040812080545f51602061425c5f395f51905f52928492916129a490849061404f565b909155505060038101805483900390556040518281525f906001600160a01b038516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200161232c565b5f6001600160a01b0384161580612a0f57506001600160a01b038316155b15612a2d5760405163d92e233d60e01b815260040160405180910390fd5b6001600160a01b0384165f9081527f67df8e602072ae967fe4567cec1273e29da0bd7a5a1af20d9b5c8d3f0d8385046020526040812080545f51602061425c5f395f51905f5292859291612a8290849061404f565b90915550506001600160a01b038085165f818152600484016020526040908190208054870190555190918716907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90611f299087815260200190565b42841015612aff576040516305787bdf60e01b815260040160405180910390fd5b6001600160a01b0387165f9081527f67df8e602072ae967fe4567cec1273e29da0bd7a5a1af20d9b5c8d3f0d83850860205260408120805460018082019092555f51602061425c5f395f51905f52929091612b586121dd565b604080517f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c960208201526001600160a01b03808f1692820192909252908c166060820152608081018b905260a0810185905260c081018a905260e00160405160208183030381529060405280519060200120604051602001612bf192919061190160f01b81526002810192909252602282015260420190565b60408051601f1981840301815282825280516020918201205f84529083018083525260ff891690820152606081018790526080810186905260a0016020604051602081039080840390855afa158015612c4c573d5f5f3e3d5ffd5b5050604051601f1901519150506001600160a01b0381161580612c815750896001600160a01b0316816001600160a01b031614155b15612c9f57604051632057875960e21b815260040160405180910390fd5b50506001600160a01b038881165f8181526005840160209081526040808320948c16808452948252918290208a905590518981527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a35050505050505050565b5f51602061423c5f395f51905f5280546001600160a01b0319166001600160a01b0392909216919091179055565b6040515f905f51602061425c5f395f51905f52907f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f90612d77908390614075565b6040805191829003822060208301939093528101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608201524660808201523060a082015260c0016040516020818303038152906040528051906020012091505090565b805f03612e00576040516327df2edd60e11b815260040160405180910390fd5b7f2c9356b94ada349e65b0a691cd15e24beddfc13e05a26de25d9c64509c82440155565b612e2e8282613202565b612e38828261321e565b610b098282613273565b612e4a611c03565b6001600160a01b0316336001600160a01b031614610b095733612e6b611c03565b60405163fe6cd27560e01b81526001600160a01b039283166004820152911660248201526044016108d2565b610b0982826132a6565b5f6060606483511015612ec75760405163fc69850b60e01b815260040160405180910390fd5b8251612ed7908490600490613363565b806020019051810190612eea91906140e6565b9094909350915050565b5f8181527f1626844f871e5080d673ecb96ea8a32c7bdf671ea137282b2886cd9d0fd9a70160205260409020545f51602061419c5f395f51905f529015610b09575f8281526001808301602090815260408084208490556002808601909252832080546001600160a01b0319168155918201839055909190612f7890830182613742565b505f60039190910181905560405183917f134fdd648feeaf30251f0157f9624ef8608ff9a042aad6d13e73f35d21d3f88d91a25050565b612fb8816133e2565b5f8181527f1626844f871e5080d673ecb96ea8a32c7bdf671ea137282b2886cd9d0fd9a70260209081526040808320815160808101835281546001600160a01b031681526001820154938101939093526002810180545f51602061419c5f395f51905f529594938401919061302c90613c34565b80601f016020809104026020016040519081016040528092919081815260200182805461305890613c34565b80156130a35780601f1061307a576101008083540402835291602001916130a3565b820191905f5260205f20905b81548152906001019060200180831161308657829003601f168201915b50505091835250506003919091015460209182015281519082015160408301519293509091478211156130f15760405162fae2d560e21b8152600481018390524760248201526044016108d2565b5f8681526001808701602090815260408084208490556002808a01909252832080546001600160a01b031916815591820183905590919061313490830182613742565b600382015f905550505f836001600160a01b031683836040516131579190614025565b5f6040518083038185875af1925050503d805f8114613191576040519150601f19603f3d011682016040523d82523d5f602084013e613196565b606091505b50509050806131bb5760405163165a1d4160e01b8152600481018890526024016108d2565b867fbc76564aec85e3f50672da2d1ddca0390851fecefe61cd19d89dea91a8267829858585426040516131f1949392919061412a565b60405180910390a250505050505050565b805115610b0957610b095f5f5160206141bc5f395f51905f5255565b6132278261345f565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a280511561326b57610c488282613479565b610b09613505565b5f81511180156132885750613286610b34565b155b15610b095760405163b3a31bfd60e01b815260040160405180910390fd5b5f51602061421c5f395f51905f5254156132d35760405163e741fd4560e01b815260040160405180910390fd5b7f2c9356b94ada349e65b0a691cd15e24beddfc13e05a26de25d9c64509c824401545f51602061421c5f395f51905f52905f906133109042614062565b90505f61335a30868660405160240161332a929190614162565b60408051601f198184030181529190526020810180516001600160e01b03166319cccfd360e11b17905284613524565b90925550505050565b606061337082855161363e565b915061337c838361363e565b9250613388838361404f565b67ffffffffffffffff8111156133a0576133a061388c565b6040519080825280601f01601f1916602001820160405280156133ca576020820181803683370190505b509050828203836020860101602083015e9392505050565b5f8181527f1626844f871e5080d673ecb96ea8a32c7bdf671ea137282b2886cd9d0fd9a70160205260408120545f51602061419c5f395f51905f529181900361343e57604051634b9aaa0960e11b815260040160405180910390fd5b80421015610c4857604051630f0b32ff60e11b815260040160405180910390fd5b61346881613653565b5f5160206141dc5f395f51905f5255565b60605f5f846001600160a01b0316846040516134959190614025565b5f60405180830381855af49150503d805f81146134cd576040519150601f19603f3d011682016040523d82523d5f602084013e6134d2565b606091505b5091509150816117c4578051156134ec5780518082602001fd5b60405163d6bda27560e01b815260040160405180910390fd5b3415610b675760405163b398979f60e01b815260040160405180910390fd5b5f8142106135455760405163b7d0949760e01b815260040160405180910390fd5b5f51602061419c5f395f51905f5280543490825f61356283614183565b909155505081545f81815260018085016020908152604080842089905580516080810182526001600160a01b038c811682528184018881528284018d8152606084018d90528888526002808c0190965293909620825181546001600160a01b0319169216919091178155945193850193909355519396509092908201906135e99082613cb7565b5060608201518160030155905050827f8d6fedd41517ab865c3658696c50923b3493c8a93ffd016d919a599f03c7531b8783888860405161362d949392919061412a565b60405180910390a250509392505050565b5f81831061364c57816107fe565b5090919050565b806001600160a01b03163b5f0361368857604051634c9c8ce360e01b81526001600160a01b03821660048201526024016108d2565b806001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa9250505080156136e2575060408051601f3d908101601f191682019092526136df91810190613f43565b60015b61370a57604051634c9c8ce360e01b81526001600160a01b03821660048201526024016108d2565b5f5160206141dc5f395f51905f528114610b0957604051634c9c8ce360e01b81526001600160a01b03831660048201526024016108d2565b50805461374e90613c34565b5f825580601f1061375d575050565b601f0160209004905f5260205f2090810190611c0091905b80821115613788575f8155600101613775565b5090565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f6107fe602083018461378c565b6001600160a01b0381168114611c00575f5ffd5b8015158114611c00575f5ffd5b5f5f604083850312156137fe575f5ffd5b8235613809816137cc565b91506020830135613819816137e0565b809150509250929050565b5f5f60408385031215613835575f5ffd5b8235613840816137cc565b946020939093013593505050565b5f5f5f60608486031215613860575f5ffd5b833561386b816137cc565b9250602084013561387b816137cc565b929592945050506040919091013590565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f1916810167ffffffffffffffff811182821017156138c9576138c961388c565b604052919050565b5f67ffffffffffffffff8211156138ea576138ea61388c565b50601f01601f191660200190565b5f61390a613905846138d1565b6138a0565b905082815283838301111561391d575f5ffd5b828260208301375f602084830101529392505050565b5f82601f830112613942575f5ffd5b6107fe838335602085016138f8565b60ff81168114611c00575f5ffd5b5f5f5f5f5f5f60c08789031215613974575f5ffd5b863567ffffffffffffffff81111561398a575f5ffd5b61399689828a01613933565b965050602087013567ffffffffffffffff8111156139b2575f5ffd5b6139be89828a01613933565b95505060408701356139cf81613951565b9350606087013567ffffffffffffffff8111156139ea575f5ffd5b6139f689828a01613933565b9350506080870135613a07816137cc565b9598949750929591949360a090920135925050565b5f60208284031215613a2c575f5ffd5b8135613a37816137cc565b9392505050565b5f5f60408385031215613a4f575f5ffd5b8235613a5a816137cc565b9150602083013567ffffffffffffffff811115613a75575f5ffd5b8301601f81018513613a85575f5ffd5b613a94858235602084016138f8565b9150509250929050565b602080825282518282018190525f918401906040840190835b81811015613ad857835160ff16835260209384019390920191600101613ab7565b509095945050505050565b5f60208284031215613af3575f5ffd5b813567ffffffffffffffff811115613b09575f5ffd5b6117c484828501613933565b5f60208284031215613b25575f5ffd5b5035919050565b6001600160a01b0385168152608060208201525f613b4d608083018661378c565b6040830194909452506060015292915050565b604081525f613b72604083018561378c565b90508260208301529392505050565b5f5f5f5f5f5f5f60e0888a031215613b97575f5ffd5b8735613ba2816137cc565b96506020880135613bb2816137cc565b955060408801359450606088013593506080880135613bd081613951565b9699959850939692959460a0840135945060c09093013592915050565b5f5f60408385031215613bfe575f5ffd5b8235613c09816137cc565b91506020830135613819816137cc565b5f60208284031215613c29575f5ffd5b8151613a37816137e0565b600181811c90821680613c4857607f821691505b602082108103613c6657634e487b7160e01b5f52602260045260245ffd5b50919050565b601f821115610c4857805f5260205f20601f840160051c81016020851015613c915750805b601f840160051c820191505b81811015613cb0575f8155600101613c9d565b5050505050565b815167ffffffffffffffff811115613cd157613cd161388c565b613ce581613cdf8454613c34565b84613c6c565b6020601f821160018114613d17575f8315613d005750848201515b5f19600385901b1c1916600184901b178455613cb0565b5f84815260208120601f198516915b82811015613d465787850151825560209485019460019092019101613d26565b5084821015613d6357868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b5f604082016001600160a01b0385168352604060208401528084518083526060850191506020860192505f5b81811015613dc057835161ffff16835260209384019390920191600101613d9e565b50909695505050505050565b5f60208284031215613ddc575f5ffd5b815167ffffffffffffffff811115613df2575f5ffd5b8201601f81018413613e02575f5ffd5b805167ffffffffffffffff811115613e1c57613e1c61388c565b8060051b613e2c602082016138a0565b91825260208184018101929081019087841115613e47575f5ffd5b6020850194505b83851015613e755784519250613e6383613951565b82825260209485019490910190613e4e565b979650505050505050565b5f60208284031215613e90575f5ffd5b8151613a3781613951565b634e487b7160e01b5f52603260045260245ffd5b604081525f613ec1604083018561378c565b8281036020840152613ed3818561378c565b95945050505050565b805169ffffffffffffffffffff811681146123ab575f5ffd5b5f5f5f5f5f60a08688031215613f09575f5ffd5b613f1286613edc565b60208701516040880151606089015192975090955093509150613f3760808701613edc565b90509295509295909350565b5f60208284031215613f53575f5ffd5b5051919050565b5f613f67613905846138d1565b9050828152838383011115613f7a575f5ffd5b8282602083015e5f602084830101529392505050565b5f82601f830112613f9f575f5ffd5b6107fe83835160208501613f5a565b5f60208284031215613fbe575f5ffd5b815167ffffffffffffffff811115613fd4575f5ffd5b6117c484828501613f90565b5f60208284031215613ff0575f5ffd5b815167ffffffffffffffff811115614006575f5ffd5b8201601f81018413614016575f5ffd5b6117c484825160208401613f5a565b5f82518060208501845e5f920191825250919050565b634e487b7160e01b5f52601160045260245ffd5b818103818111156108015761080161403b565b808201808211156108015761080161403b565b5f5f835461408281613c34565b60018216801561409957600181146140ae576140db565b60ff19831686528115158202860193506140db565b865f5260205f205f5b838110156140d3578154888201526001909101906020016140b7565b505081860193505b509195945050505050565b5f5f604083850312156140f7575f5ffd5b8251614102816137cc565b602084015190925067ffffffffffffffff81111561411e575f5ffd5b613a9485828601613f90565b6001600160a01b0385168152836020820152608060408201525f614151608083018561378c565b905082606083015295945050505050565b6001600160a01b0383168152604060208201525f6117c4604083018461378c565b5f600182016141945761419461403b565b506001019056fe1626844f871e5080d673ecb96ea8a32c7bdf671ea137282b2886cd9d0fd9a700112dd7b7d700a9bfd03edf4d4ce6f92b1f5f1a2fd81fde871f4db11384aa0b00360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbcfedd7b171e5aaf71411eb61c81513b977191128c387240284b4edb396fcbdb002c9356b94ada349e65b0a691cd15e24beddfc13e05a26de25d9c64509c8244001fa5656f3245be71aa51744436d19e5d46b909e499930c5c32c93901cab5290067df8e602072ae967fe4567cec1273e29da0bd7a5a1af20d9b5c8d3f0d838500a264697066735822122035e0410d4d866dbce71da568bdb6a948e20748cc7ea05eb3930bbfd8a939035964736f6c634300081e0033","sourceMap":"1127:5125:5:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;879:83:10;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6987:249:4;;;;;;:::i;:::-;;:::i;:::-;;2580:203:2;;;;;;:::i;:::-;;:::i;:::-;;;1739:14:38;;1732:22;1714:41;;1702:2;1687:18;2580:203:2;1574:187:38;1503:91:10;;;:::i;:::-;;;1912:25:38;;;1900:2;1885:18;1503:91:10;1766:177:38;1996:253:2;;;;;;:::i;:::-;;:::i;2147:509:5:-;;;;;;:::i;:::-;;:::i;1604:177:4:-;;;;;;:::i;:::-;;:::i;1299:83:10:-;;;:::i;:::-;;;5332:4:38;5320:17;;;5302:36;;5290:2;5275:18;1299:83:10;5160:184:38;3173:180:24;;;;;;:::i;:::-;;:::i;2820:167:4:-;;;;;;:::i;:::-;;:::i;2769:101:10:-;;;:::i;994:92:15:-;;;:::i;1389:68:3:-;;;:::i;3947:135:2:-;;;;;;:::i;:::-;;:::i;4601:511:1:-;;;:::i;:::-;;;;;;;:::i;4014:179:4:-;;;;;;:::i;:::-;;:::i;1608:447:1:-;;;;;;:::i;:::-;;:::i;3410:167:4:-;;;;;;:::i;:::-;;:::i;1049:174:24:-;;;;;;:::i;:::-;;:::i;1490:110:26:-;;;:::i;2441:77:24:-;;;:::i;440:40:7:-;;;;;-1:-1:-1;;;;;440:40:7;;;;;;-1:-1:-1;;;;;6908:55:38;;;6890:74;;6878:2;6863:18;440:40:7;6744:226:38;5784:267:4;;;;;;:::i;:::-;;:::i;6353:291::-;;;;;;:::i;:::-;;:::i;4224:164:5:-;;;;;;:::i;:::-;;:::i;5258:173:4:-;;;;;;:::i;:::-;;:::i;2210:171::-;;;;;;:::i;:::-;;:::i;1788:111:10:-;;;;;;:::i;:::-;;:::i;4640:187:4:-;;;;;;:::i;:::-;;:::i;1892:79:24:-;;;:::i;2496:105:10:-;;;;;;:::i;:::-;;:::i;1213:64:3:-;;;:::i;1070:87:10:-;;;:::i;3304:391:5:-;;;;;;:::i;:::-;;:::i;1225:225:23:-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;:::i;2544:518:1:-;;;:::i;:::-;;;;8713:25:38;;;8769:2;8754:18;;8747:34;;;;8686:18;2544:518:1;8541:246:38;4260:141:2;;;;;;:::i;:::-;;:::i;2979:221:5:-;;;;;;:::i;:::-;;:::i;1421:214:2:-;;;;;;:::i;:::-;;:::i;1821:114:26:-;;;:::i;951:82:3:-;;;:::i;4898:93:5:-;4980:4;4898:93;;3691:483:1;;;:::i;:::-;;;;;;;;:::i;7622:259:4:-;;;;;;:::i;:::-;;:::i;371:25:7:-;;;:::i;3431:319:2:-;;;;;;:::i;:::-;;:::i;2170:135:10:-;;;;;;:::i;:::-;;:::i;742:164:18:-;;;;;;:::i;:::-;;:::i;1000:123:20:-;;;:::i;5375:326:1:-;;;:::i;879:83:10:-;916:13;948:7;:5;:7::i;:::-;941:14;;879:83;:::o;6987:249:4:-;1731:34:19;1745:10;1757:7;;-1:-1:-1;;;;;;1757:7:19;1731:13;:34::i;:::-;-1:-1:-1;;;;;;;;;;;1790:8:16;;;2060:65:::1;;;2098:16;;-1:-1:-1::0;;;2098:16:16::1;;;;;;;;;;;2060:65;7105:29:4::2;:27;:29::i;:::-;7093:83;::::0;-1:-1:-1;;;7093:83:4;;7152:1:::2;7093:83;::::0;::::2;10696:38:38::0;-1:-1:-1;;;;;10770:55:38;;;10750:18;;;10743:83;10869:14;;10862:22;10842:18;;;10835:50;7093:58:4;;;::::2;::::0;::::2;::::0;10669:18:38;;7093:83:4::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7208:8;-1:-1:-1::0;;;;;7191:38:4::2;;7218:10;7191:38;;;;1739:14:38::0;1732:22;1714:41;;1702:2;1687:18;;1574:187;7191:38:4::2;;;;;;;;6987:249:::0;;:::o;2580:203:2:-;2714:4;1731:34:19;1745:10;1757:7;;-1:-1:-1;;;;;;1757:7:19;1731:13;:34::i;:::-;-1:-1:-1;;;;;;;;;;;1790:8:16;;;2060:65:::1;;;2098:16;;-1:-1:-1::0;;;2098:16:16::1;;;;;;;;;;;2060:65;2737:39:2::2;2746:10;2758:8;2768:7;2737:8;:39::i;:::-;2730:46;;2134:1:16;2580:203:2::0;;;;:::o;1503:91:10:-;1547:7;1573:14;3872:13:9;;;3746:146;1996:253:2;2185:4;1731:34:19;1745:10;1757:7;;-1:-1:-1;;;;;;1757:7:19;1731:13;:34::i;:::-;958:26:2::1;::::0;-1:-1:-1;;;958:26:2;;-1:-1:-1;;;;;6908:55:38;;958:26:2::1;::::0;::::1;6890:74:38::0;2136:5:2;;958:4:::1;::::0;:16:::1;::::0;6863:18:38;;958:26:2::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;953:87;;1007:22;::::0;-1:-1:-1;;;1007:22:2;;-1:-1:-1;;;;;6908:55:38;;1007:22:2::1;::::0;::::1;6890:74:38::0;6863:18;;1007:22:2::1;;;;;;;;953:87;958:26:::2;::::0;-1:-1:-1;;;958:26:2;;-1:-1:-1;;;;;6908:55:38;;958:26:2::2;::::0;::::2;6890:74:38::0;2157:3:2;;958:4:::2;::::0;:16:::2;::::0;6863:18:38;;958:26:2::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;953:87;;1007:22;::::0;-1:-1:-1;;;1007:22:2;;-1:-1:-1;;;;;6908:55:38;;1007:22:2::2;::::0;::::2;6890:74:38::0;6863:18;;1007:22:2::2;6744:226:38::0;953:87:2::2;-1:-1:-1::0;;;;;;;;;;;1790:8:16;;;2060:65:::3;;;2098:16;;-1:-1:-1::0;;;2098:16:16::3;;;;;;;;;;;2060:65;2208:34:2::4;2222:5;2229:3;2234:7;2208:13;:34::i;:::-;2201:41:::0;1996:253;-1:-1:-1;;;;;;1996:253:2:o;2147:509:5:-;2018:13:27;:11;:13::i;:::-;-1:-1:-1;;;;;;;;;;;2082:36:14;1580:77:::1;;;1623:23;;-1:-1:-1::0;;;1623:23:14::1;;;;;;;;;;;1580:77;1666:17;:15;:17::i;:::-;2412:38:5::2;2424:5;2431:7;2440:9;2412:11;:38::i;:::-;2460:45;2479:25;2460:18;:45::i;:::-;2515:41;2534:21;2515:18;:41::i;:::-;2576:11;2570:25;;;;;:::i;:::-;;;2599:1;2570:30:::0;2566:84:::2;;2616:11;:23;2630:9:::0;2616:11;:23:::2;:::i;:::-;;2566:84;2147:509:::0;;;;;;:::o;1604:177:4:-;1668:4;1703:29;:27;:29::i;:::-;-1:-1:-1;;;;;1691:56:4;;1748:8;1771:1;1758:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1758:15:4;;1691:83;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;1299::10:-;1340:5;1364:11;3609:10:9;;;;;3488:138;3173:180:24;3294:52;3320:18;3340:5;3294:25;:52::i;:::-;3173:180;;:::o;2820:167:4:-;2879:4;2914:29;:27;:29::i;:::-;-1:-1:-1;;;;;2902:51:4;;2954:8;2977:1;2964:15;;2769:101:10;2818:7;2844:19;:17;:19::i;994:92:15:-;1040:4;1063:16;-1:-1:-1;;;;;;;;;;;2082:36:14;;1907:227;1389:68:3;1731:34:19;1745:10;1757:7;;-1:-1:-1;;;;;;1757:7:19;1731:13;:34::i;:::-;1440:10:3::1;:8;:10::i;:::-;1389:68::o:0;3947:135:2:-;1731:34:19;1745:10;1757:7;;-1:-1:-1;;;;;;1757:7:19;1731:13;:34::i;:::-;958:26:2::1;::::0;-1:-1:-1;;;958:26:2;;-1:-1:-1;;;;;6908:55:38;;958:26:2::1;::::0;::::1;6890:74:38::0;4027:3:2;;958:4:::1;::::0;:16:::1;::::0;6863:18:38;;958:26:2::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;953:87;;1007:22;::::0;-1:-1:-1;;;1007:22:2;;-1:-1:-1;;;;;6908:55:38;;1007:22:2::1;::::0;::::1;6890:74:38::0;6863:18;;1007:22:2::1;6744:226:38::0;953:87:2::1;-1:-1:-1::0;;;;;;;;;;;1790:8:16;;;2060:65:::2;;;2098:16;;-1:-1:-1::0;;;2098:16:16::2;;;;;;;;;;;2060:65;4056:19:2::3;4062:3;4067:7;4056:5;:19::i;:::-;1775:1:19::1;3947:135:2::0;;:::o;4601:511:1:-;4686:25;;4656:14;;-1:-1:-1;;;;;4686:25:1;4682:102;;4748:25;;-1:-1:-1;;;4748:25:1;;4770:1;4748:25;;;6890:74:38;6863:18;;4748:25:1;6744:226:38;4682:102:1;4818:25;;4798:46;;-1:-1:-1;;;;;4818:25:1;4798:19;:46::i;:::-;4794:150;;;4890:25;;;;;;;;;-1:-1:-1;;;;;4890:25:1;-1:-1:-1;;;;;4867:64:1;;:66;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;4867:66:1;;;;;;;;;;;;:::i;4794:150::-;4981:14;;;4993:1;4981:14;;;;;;;;;4954:24;;4981:14;;;;;;;;;-1:-1:-1;;5042:25:1;;5020:59;;;-1:-1:-1;;;5020:59:1;;;;4954:41;;-1:-1:-1;;;;;;5042:25:1;;;;5020:57;;-1:-1:-1;5020:59:1;;;;;;;;;;;;;;5042:25;5020:59;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;5005:9;5015:1;5005:12;;;;;;;;:::i;:::-;:74;;;;:12;;;;;;;;;;;:74;5096:9;4601:511;-1:-1:-1;4601:511:1:o;4014:179:4:-;4079:4;4114:29;:27;:29::i;:::-;-1:-1:-1;;;;;4102:57:4;;4160:8;4183:1;4170:15;;1608:447:1;1731:34:19;1745:10;1757:7;;-1:-1:-1;;;;;;1757:7:19;1731:13;:34::i;:::-;1740:25:1::1;::::0;-1:-1:-1;;;;;1740:25:1;;::::1;::::0;1779:45;::::1;::::0;;1775:128:::1;;1847:45;::::0;-1:-1:-1;;;1847:45:1;;-1:-1:-1;;;;;6908:55:38;;1847:45:1::1;::::0;::::1;6890:74:38::0;6863:18;;1847:45:1::1;6744:226:38::0;1775:128:1::1;1912:25;:54:::0;;-1:-1:-1;;;;;;1912:54:1::1;-1:-1:-1::0;;;;;1912:54:1;;::::1;::::0;;::::1;::::0;;;1981:67:::1;::::0;1912:54;;1981:67;::::1;::::0;::::1;::::0;-1:-1:-1;;1981:67:1::1;1704:351;1608:447:::0;:::o;3410:167:4:-;3469:4;3504:29;:27;:29::i;:::-;-1:-1:-1;;;;;3492:51:4;;3544:8;3567:1;3554:15;;1049:174:24;2018:13:27;:11;:13::i;:::-;1172:44:24::1;1190:18;1210:5;1172:17;:44::i;1490:110:26:-:0;1551:7;2419:20:27;:18;:20::i;:::-;1577:16:26::1;:14;:16::i;2441:77:24:-:0;-1:-1:-1;;;;;;;;;;;11293:13:25;2374:73;;2416:20;;-1:-1:-1;;;2416:20:25;;;;;;;;;;;2374:73;2495:16:24::1;:14;:16::i;5784:267:4:-:0;1731:34:19;1745:10;1757:7;;-1:-1:-1;;;;;;1757:7:19;1731:13;:34::i;:::-;-1:-1:-1;;;;;;;;;;;1790:8:16;;;2060:65:::1;;;2098:16;;-1:-1:-1::0;;;2098:16:16::1;;;;;;;;;;;2060:65;5908:29:4::2;:27;:29::i;:::-;5896:89;::::0;-1:-1:-1;;;5896:89:4;;5958:1:::2;5896:89;::::0;::::2;10696:38:38::0;-1:-1:-1;;;;;10770:55:38;;;10750:18;;;10743:83;10869:14;;10862:22;10842:18;;;10835:50;5896:61:4;;;::::2;::::0;::::2;::::0;10669:18:38;;5896:89:4::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6020:8;-1:-1:-1::0;;;;;6000:44:4::2;;6030:13;6000:44;;;;1739:14:38::0;1732:22;1714:41;;1702:2;1687:18;;1574:187;6353:291:4;1731:34:19;1745:10;1757:7;;-1:-1:-1;;;;;;1757:7:19;1731:13;:34::i;:::-;-1:-1:-1;;;;;;;;;;;1790:8:16;;;2060:65:::1;;;2098:16;;-1:-1:-1::0;;;2098:16:16::1;;;;;;;;;;;2060:65;6485:29:4::2;:27;:29::i;:::-;6473:97;::::0;-1:-1:-1;;;6473:97:4;;6539:1:::2;6473:97;::::0;::::2;10696:38:38::0;-1:-1:-1;;;;;10770:55:38;;;10750:18;;;10743:83;10869:14;;10862:22;10842:18;;;10835:50;6473:65:4;;;::::2;::::0;::::2;::::0;10669:18:38;;6473:97:4::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6609:8;-1:-1:-1::0;;;;;6585:52:4::2;;6619:17;6585:52;;;;1739:14:38::0;1732:22;1714:41;;1702:2;1687:18;;1574:187;4224:164:5;1731:34:19;1745:10;1757:7;;-1:-1:-1;;;;;;1757:7:19;1731:13;:34::i;:::-;-1:-1:-1;;;;;;;;;;;1790:8:16;;;2060:65:::1;;;2098:16;;-1:-1:-1::0;;;2098:16:16::1;;;;;;;;;;;2060:65;4346:35:5::2;4360:6;4368:3;4373:7;4346:13;:35::i;5258:173:4:-:0;5320:4;5355:29;:27;:29::i;:::-;-1:-1:-1;;;;;5343:54:4;;5398:8;5421:1;5408:15;;2210:171;2271:4;2306:29;:27;:29::i;:::-;-1:-1:-1;;;;;2294:53:4;;2348:8;2371:1;2358:15;;1788:111:10;-1:-1:-1;;;;;4225:21:9;;1846:7:10;4225:21:9;;;:11;:21;;;;;;1872:20:10;4085:168:9;4640:187:4;4709:4;4744:29;:27;:29::i;:::-;-1:-1:-1;;;;;4732:61:4;;4794:8;4817:1;4804:15;;1892:79:24;-1:-1:-1;;;;;;;;;;;11293:13:25;2374:73;;2416:20;;-1:-1:-1;;;2416:20:25;;;;;;;;;;;2374:73;1947:17:24::1;:15;:17::i;2496:105:10:-:0;-1:-1:-1;;;;;5007:18:9;;2551:7:10;5007:18:9;;;:8;:18;;;;;;2577:17:10;4870:162:9;1213:64:3;1731:34:19;1745:10;1757:7;;-1:-1:-1;;;;;;1757:7:19;1731:13;:34::i;:::-;1262:8:3::1;:6;:8::i;1070:87:10:-:0;1109:13;1141:9;:7;:9::i;3304:391:5:-;1731:34:19;1745:10;1757:7;;-1:-1:-1;;;;;;1757:7:19;1731:13;:34::i;:::-;-1:-1:-1;;;;;;;;;;;1790:8:16;;;2060:65:::1;;;2098:16;;-1:-1:-1::0;;;2098:16:16::1;;;;;;;;;;;2060:65;3402:31:5::2;3436:11;3402:45;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3516:12;3500:30;;;;;;3477:17;3461:35;;;;;;:69:::0;3457:133:::2;;3566:12;3553:26;;-1:-1:-1::0;;;3553:26:5::2;;;;;;;;:::i;3457:133::-;3599:11;:26;3613:12:::0;3599:11;:26:::2;:::i;:::-;;3640:48;3656:17;3675:12;3640:48;;;;;;;:::i;:::-;;;;;;;;3392:303;3304:391:::0;:::o;1225:225:23:-;1320:14;1336:17;1355:13;1370:11;1400:43;1430:12;1400:29;:43::i;:::-;1393:50;;;;;;;;1225:225;;;;;:::o;2544:518:1:-;2636:25;;2587:13;;;;-1:-1:-1;;;;;2636:25:1;:39;;:89;;-1:-1:-1;2699:25:1;;2679:46;;-1:-1:-1;;;;;2699:25:1;2679:19;:46::i;:::-;2632:167;;;2762:25;;2748:40;;-1:-1:-1;;;2748:40:1;;-1:-1:-1;;;;;2762:25:1;;;2748:40;;;6890:74:38;6863:18;;2748:40:1;6744:226:38;2632:167:1;2858:25;;;;;;;;;-1:-1:-1;;;;;2858:25:1;-1:-1:-1;;;;;2836:64:1;;:66;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;2809:93:1;;-1:-1:-1;2809:93:1;;-1:-1:-1;;;2931:1:1;2917:15;;;2913:70;;2955:17;;-1:-1:-1;;;2955:17:1;;;;;;;;;;;2913:70;3007:1;2997:6;:11;2993:63;;3031:14;;-1:-1:-1;;;3031:14:1;;;;;;;;;;;2993:63;2544:518;;:::o;4260:141:2:-;1731:34:19;1745:10;1757:7;;-1:-1:-1;;;;;;1757:7:19;1731:13;:34::i;:::-;958:26:2::1;::::0;-1:-1:-1;;;958:26:2;;-1:-1:-1;;;;;6908:55:38;;958:26:2::1;::::0;::::1;6890:74:38::0;4342:5:2;;958:4:::1;::::0;:16:::1;::::0;6863:18:38;;958:26:2::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;953:87;;1007:22;::::0;-1:-1:-1;;;1007:22:2;;-1:-1:-1;;;;;6908:55:38;;1007:22:2::1;::::0;::::1;6890:74:38::0;6863:18;;1007:22:2::1;6744:226:38::0;953:87:2::1;-1:-1:-1::0;;;;;;;;;;;1790:8:16;;;2060:65:::2;;;2098:16;;-1:-1:-1::0;;;2098:16:16::2;;;;;;;;;;;2060:65;4373:21:2::3;4379:5;4386:7;4373:5;:21::i;2979:221:5:-:0;958:26:2;;-1:-1:-1;;;958:26:2;;-1:-1:-1;;;;;6908:55:38;;958:26:2;;;6890:74:38;3071:3:5;;958:4:2;;:16;;6863:18:38;;958:26:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;953:87;;1007:22;;-1:-1:-1;;;1007:22:2;;-1:-1:-1;;;;;6908:55:38;;1007:22:2;;;6890:74:38;6863:18;;1007:22:2;6744:226:38;953:87:2;1731:34:19::1;1745:10;1757:7;;-1:-1:-1::0;;;;;;1757:7:19::1;1731:13;:34::i;:::-;-1:-1:-1::0;;;;;;;;;;;1790:8:16;;;2060:65:::2;;;2098:16;;-1:-1:-1::0;;;2098:16:16::2;;;;;;;;;;;2060:65;3113:30:5::3;3123:5;3130:3;3135:7;3113:9;:30::i;:::-;;3180:3;-1:-1:-1::0;;;;;3158:35:5::3;3173:5;-1:-1:-1::0;;;;;3158:35:5::3;;3185:7;3158:35;;;;1912:25:38::0;;1900:2;1885:18;;1766:177;3158:35:5::3;;;;;;;;2979:221:::0;;;;:::o;1421:214:2:-;1570:4;1731:34:19;1745:10;1757:7;;-1:-1:-1;;;;;;1757:7:19;1731:13;:34::i;:::-;958:26:2::1;::::0;-1:-1:-1;;;958:26:2;;-1:-1:-1;;;;;6908:55:38;;958:26:2::1;::::0;::::1;6890:74:38::0;1542:3:2;;958:4:::1;::::0;:16:::1;::::0;6863:18:38;;958:26:2::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;953:87;;1007:22;::::0;-1:-1:-1;;;1007:22:2;;-1:-1:-1;;;;;6908:55:38;;1007:22:2::1;::::0;::::1;6890:74:38::0;6863:18;;1007:22:2::1;6744:226:38::0;953:87:2::1;-1:-1:-1::0;;;;;;;;;;;1790:8:16;;;2060:65:::2;;;2098:16;;-1:-1:-1::0;;;2098:16:16::2;;;;;;;;;;;2060:65;1593:35:2::3;1603:10;1615:3;1620:7;1593:9;:35::i;:::-;1586:42:::0;1421:214;-1:-1:-1;;;;1421:214:2:o;1821:114:26:-;1873:7;1899:29;-1:-1:-1;;;;;;;;;;;1401:26:28;;1107:336;951:82:3;992:4;1015:11;-1:-1:-1;;;;;;;;;;;1790:8:16;;;;1664:141;3691:483:1;3799:25;;3739:24;;3765:18;;-1:-1:-1;;;;;3799:25:1;:39;;:90;;-1:-1:-1;3863:25:1;;3843:46;;-1:-1:-1;;;;;3863:25:1;3843:19;:46::i;:::-;3842:47;3799:90;3795:168;;;3926:25;;3912:40;;-1:-1:-1;;;3912:40:1;;-1:-1:-1;;;;;3926:25:1;;;3912:40;;;6890:74:38;6863:18;;3912:40:1;6744:226:38;3795:168:1;4033:25;;4082:35;;;-1:-1:-1;;;4082:35:1;;;;-1:-1:-1;;;;;4033:25:1;;;;;;4082:33;;:35;;;;;;;;;;;;;;4033:25;4082:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;4069:48;;4141:11;-1:-1:-1;;;;;4141:24:1;;:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;4141:26:1;;;;;;;;;;;;:::i;:::-;4127:40;;3785:389;3691:483;;:::o;7622:259:4:-;1731:34:19;1745:10;1757:7;;-1:-1:-1;;;;;;1757:7:19;1731:13;:34::i;:::-;-1:-1:-1;;;;;;;;;;;1790:8:16;;;2060:65:::1;;;2098:16;;-1:-1:-1::0;;;2098:16:16::1;;;;;;;;;;;2060:65;7743:29:4::2;:27;:29::i;:::-;7731:86;::::0;-1:-1:-1;;;7731:86:4;;7793:1:::2;7731:86;::::0;::::2;10696:38:38::0;-1:-1:-1;;;;;10770:55:38;;;10750:18;;;10743:83;10869:14;;10862:22;10842:18;;;10835:50;7731:61:4;;;::::2;::::0;::::2;::::0;10669:18:38;;7731:86:4::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7853:8;-1:-1:-1::0;;;;;7832:42:4::2;;7863:10;7832:42;;;;1739:14:38::0;1732:22;1714:41;;1702:2;1687:18;;1574:187;371:25:7;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;3431:319:2:-;1731:34:19;1745:10;1757:7;;-1:-1:-1;;;;;;1757:7:19;1731:13;:34::i;:::-;958:26:2::1;::::0;-1:-1:-1;;;958:26:2;;-1:-1:-1;;;;;6908:55:38;;958:26:2::1;::::0;::::1;6890:74:38::0;3655:6:2;;958:4:::1;::::0;:16:::1;::::0;6863:18:38;;958:26:2::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;953:87;;1007:22;::::0;-1:-1:-1;;;1007:22:2;;-1:-1:-1;;;;;6908:55:38;;1007:22:2::1;::::0;::::1;6890:74:38::0;6863:18;;1007:22:2::1;6744:226:38::0;953:87:2::1;-1:-1:-1::0;;;;;;;;;;;1790:8:16;;;2060:65:::2;;;2098:16;;-1:-1:-1::0;;;2098:16:16::2;;;;;;;;;;;2060:65;3687:56:2::3;3695:6;3703:8;3713:6;3721:9;3732:2;3736;3740;3687:7;:56::i;:::-;1775:1:19::1;3431:319:2::0;;;;;;;:::o;2170:135:10:-;-1:-1:-1;;;;;4635:19:9;;;2244:7:10;4635:19:9;;;:11;:19;;;;;;;;:29;;;;;;;;;;;;2270:28:10;4479:192:9;742:164:18;1731:34:19;1745:10;1757:7;;-1:-1:-1;;;;;;1757:7:19;1731:13;:34::i;:::-;844:55:18::1;873:25;844:28;:55::i;:::-;742:164:::0;:::o;1000:123:20:-;1060:7;1086:30;-1:-1:-1;;;;;;;;;;;2132:26:19;-1:-1:-1;;;;;2132:26:19;;1976:189;5375:326:1;5462:25;;5433:13;;-1:-1:-1;;;;;5462:25:1;5458:102;;5524:25;;-1:-1:-1;;;5524:25:1;;5546:1;5524:25;;;6890:74:38;6863:18;;5524:25:1;6744:226:38;5458:102:1;5627:25;;5670:24;;;-1:-1:-1;;;5670:24:1;;;;-1:-1:-1;;;;;5627:25:1;;;;;;5670:22;;:24;;;;;5570:32;;5670:24;;;;;;;5627:25;5670:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;5670:24:1;;;;;;;;;;;;:::i;:::-;5663:31;;;5375:326;:::o;2988:138:9:-;-1:-1:-1;;;;;;;;;;;3106:13:9;;3028;;13752:23;;;3106:13;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2988:138;:::o;3638:451:19:-;3802:13;3817:20;3841:30;-1:-1:-1;;;;;;;;;;;2132:26:19;-1:-1:-1;;;;;2132:26:19;;1976:189;3841:30;3896:73;;-1:-1:-1;;;;;18750:55:38;;;3896:73:19;;;18732:74:38;-1:-1:-1;;;;;;18842:33:38;;18822:18;;;18815:61;3841:41:19;;;;;18705:18:38;;3896:73:19;;;-1:-1:-1;;3896:73:19;;;;;;;;;;;;;;-1:-1:-1;;;;;3896:73:19;-1:-1:-1;;;3896:73:19;;;3841:138;;;3896:73;3841:138;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3801:178;;;;3995:8;3994:9;:41;;;;4019:7;4008:27;;;;;;;;;;;;:::i;:::-;4007:28;3994:41;3990:93;;;4058:14;;-1:-1:-1;;;4058:14:19;;;;;;;;;;;3990:93;3713:376;;3638:451;;:::o;6627:358:9:-;6714:4;-1:-1:-1;;;;;6734:20:9;;;;:46;;-1:-1:-1;;;;;;6758:22:9;;;6734:46;6730:72;;;6789:13;;-1:-1:-1;;;6789:13:9;;;;;;;;;;;6730:72;-1:-1:-1;;;;;6866:19:9;;;6813:22;6866:19;;;:11;:19;;;;;;;;:29;;;;;;;;;;;;;:39;;;6921:35;;1912:25:38;;;-1:-1:-1;;;;;;;;;;;13752:23:9;6866:29;:19;6921:35;;1885:18:38;6921:35:9;;;;;;;;-1:-1:-1;6974:4:9;;6627:358;-1:-1:-1;;;;6627:358:9:o;8081:422::-;-1:-1:-1;;;;;8285:18:9;;8197:4;8285:18;;;:11;:18;;;;;;;;8304:10;8285:30;;;;;;;;-1:-1:-1;;;;;;;;;;;13752:23:9;-1:-1:-1;;8366:29:9;;8362:86;;8430:18;8441:7;8430:8;:18;:::i;:::-;-1:-1:-1;;;;;8397:18:9;;;;;;:11;;;:18;;;;;;;;8416:10;8397:30;;;;;;;:51;8362:86;8466:30;8476:5;8483:3;8488:7;8466:9;:30::i;3345:466:27:-;3675:4;-1:-1:-1;;;;;3684:6:27;3667:23;;;:66;;;3727:6;-1:-1:-1;;;;;3694:39:27;:29;-1:-1:-1;;;;;;;;;;;1401:26:28;;1107:336;3694:29:27;-1:-1:-1;;;;;3694:39:27;;;3667:66;3650:155;;;3765:29;;-1:-1:-1;;;3765:29:27;;;;;;;;;;;2356:225:14;2535:1;-1:-1:-1;;;;;;;;;;;2497:40:14;2561:13;;;;;;;2356:225::o;5685:473:9:-;5888:18;;-1:-1:-1;;;;;;;;;;;13752:23:9;5831:22;5888:23;5884:268;;5927:1;:19;5936:10;5927:1;:19;:::i;:::-;-1:-1:-1;5960:8:9;;;:23;5971:12;5960:8;:23;:::i;:::-;-1:-1:-1;5997:10:9;;;:27;;-1:-1:-1;;5997:27:9;;;;;;;6060:13;6039:18;;;:34;6116:25;:23;:25::i;:::-;6087:26;;;:54;5821:337;5685:473;;;:::o;2643:281:19:-;-1:-1:-1;;;;;;;;;;;2796:26:19;;-1:-1:-1;;;;;2796:26:19;2792:126;;2852:55;2881:25;2852:28;:55::i;3114:210:25:-;3262:7;;-1:-1:-1;;;;;;;;;;;11713:43:25;3177:36;3262:12;3258:60;;3290:17;3300:6;3290:9;:17::i;6952:194::-;2570:34;;2598:4;;2578:10;;2570:34;;;;;2618:10;2640:4;2618:27;2614:58;;2654:18;;-1:-1:-1;;;2654:18:25;;;;;;;;;;;2614:58;7091:48:::1;7113:18;7133:5;7091:21;:48::i;10995:274:9:-:0;11155:18;;11047:7;;-1:-1:-1;;;;;;;;;;;13752:23:9;11138:13;:35;:124;;11237:25;:23;:25::i;:::-;11138:124;;;11192:26;;;;10995:274;-1:-1:-1;10995:274:9:o;2916:157:16:-;-1:-1:-1;;;;;;;;;;;1790:8:16;;;2354:69;;2393:19;;-1:-1:-1;;;2393:19:16;;;;;;;;;;;2354:69;-1:-1:-1;;;;;;;;;;;3025:16:16;;-1:-1:-1;;3025:16:16::1;::::0;;3056:10:::1;::::0;::::1;::::0;2966:25:::1;::::0;3056:10:::1;2956:117;2916:157::o:0;12320:381:9:-;12437:13;:24;;-1:-1:-1;;;;;;;;;;;13752:23:9;12454:7;;12384:22;;12437:24;;12454:7;;12437:24;:::i;:::-;;;;-1:-1:-1;;;;;;;12607:16:9;;;;;;:11;;;:16;;;;;;;;:27;;;;;;12660:34;1912:25:38;;;12660:34:9;;1885:18:38;12660:34:9;;;;;;;;12374:327;12320:381;;:::o;6057:262:1:-;6132:4;6175:14;-1:-1:-1;;;;;6152:53:1;;:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;6152:55:1;;;;;;;;;;;;:::i;:::-;;;6148:165;;-1:-1:-1;6297:5:1;;6057:262;-1:-1:-1;6057:262:1:o;6148:165::-;-1:-1:-1;6254:4:1;;6057:262;-1:-1:-1;;6057:262:1:o;6148:165::-;6057:262;;;:::o;4715:242:27:-;4831:13;:11;:13::i;:::-;4854:44;4872:18;4892:5;4854:17;:44::i;:::-;4908:42;4924:18;4944:5;4908:15;:42::i;4124:275::-;4315:4;-1:-1:-1;;;;;4324:6:27;4307:23;;4303:90;;4353:29;;-1:-1:-1;;;4353:29:27;;;;;;;;;;;2810:141;2859:7;2878:20;:18;:20::i;:::-;-1:-1:-1;;;;;;;;;;;;975:66:28;2810:141:27:o;5694:641:25:-;-1:-1:-1;;;;;;;;;;;5843:13:25;;5739:36;5895:42;5843:13;5895:28;:42::i;:::-;5866:71;;;;;6032:26;6060:22;6086:29;6109:5;6086:22;:29::i;:::-;6031:84;;;;6200:48;6218:18;6238:9;6200:17;:48::i;:::-;6259:39;6285:12;6259:25;:39::i;:::-;-1:-1:-1;;6315:13:25;6308:20;;;-1:-1:-1;;5694:641:25:o;1452:1656:12:-;1548:13;;-1:-1:-1;;;;;1615:20:12;;1611:1416;;1707:28;;-1:-1:-1;;;;;1707:8:12;;;1723:7;;1707:28;;;;1723:7;1707:8;:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1693:42;;;;;1754:8;1749:71;;1789:16;;-1:-1:-1;;;1789:16:12;;;;;;;;;;;1749:71;-1:-1:-1;1857:7:12;1611:1416;;;2080:29;;-1:-1:-1;;;2080:29:12;;-1:-1:-1;;;;;6908:55:38;;;2080:29:12;;;6890:74:38;2034:6:12;;2003:21;;2080:24;;;;;6863:18:38;;2080:29:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;2494:62;;;-1:-1:-1;;;;;20245:55:38;;;2494:62:12;;;20227:74:38;20317:18;;;;20310:34;;;2494:62:12;;;;;;;;;;20200:18:38;;;;2494:62:12;;;;;;;-1:-1:-1;;;;;2494:62:12;-1:-1:-1;;;2494:62:12;;;2465:105;;2055:54;;-1:-1:-1;2338:24:12;;2465:11;;;;:105;;2494:62;2465:105;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;2439:131:12;;-1:-1:-1;2439:131:12;-1:-1:-1;2749:9:12;;;:73;;;2784:1;2763:11;:18;:22;:58;;;;;2801:11;2790:31;;;;;;;;;;;;:::i;:::-;2789:32;2763:58;2745:135;;;2849:16;;-1:-1:-1;;;2849:16:12;;;;;;;;;;;2745:135;2918:29;;-1:-1:-1;;;2918:29:12;;-1:-1:-1;;;;;6908:55:38;;;2918:29:12;;;6890:74:38;2894:21:12;;2918:24;;;;;;6863:18:38;;2918:29:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;2894:53;-1:-1:-1;2986:30:12;3002:14;2894:53;2986:30;:::i;:::-;2962:54;;1881:1146;;;;1611:1416;3065:3;-1:-1:-1;;;;;3042:59:12;3057:6;-1:-1:-1;;;;;3042:59:12;;3070:7;3079:21;3042:59;;;;;;8713:25:38;;;8769:2;8754:18;;8747:34;8701:2;8686:18;;8541:246;3042:59:12;;;;;;;;1538:1570;;1452:1656;;;:::o;4325:630:25:-;-1:-1:-1;;;;;;;;;;;4475:13:25;;4371:36;4527:42;4475:13;4527:28;:42::i;:::-;4498:71;;;;;4664:26;4692:22;4718:29;4741:5;4718:22;:29::i;:::-;4663:84;;;;4819:48;4837:18;4857:9;4819:17;:48::i;:::-;4878:40;4905:12;4878:26;:40::i;2631:155:16:-;-1:-1:-1;;;;;;;;;;;1790:8:16;;;2060:65;;;2098:16;;-1:-1:-1;;;2098:16:16;;;;;;;;;;;2060:65;-1:-1:-1;;;;;;;;;;;2741:15:16;;-1:-1:-1;;2741:15:16::1;2752:4;2741:15;::::0;;2771:8:::1;::::0;::::1;::::0;-1:-1:-1;;2771:8:16::1;2672:114;2631:155::o:0;3234:142:9:-;3361:8;3354:15;;3276:13;;-1:-1:-1;;;;;;;;;;;13752:23:9;3354:15;;;:::i;4048:382:22:-;4170:14;4329:35;;;:21;:35;;;;;;;;4306:58;;;;;;;;;-1:-1:-1;;;;;4306:58:22;;;;;;;;;;;;;;4329:21;4306:58;;;;4186:17;;4170:14;;;;-1:-1:-1;;;;;;;;;;;9223:26:22;4170:14;;4329:35;;4306:58;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4382:3;:10;;;4394:3;:8;;;4404:3;:9;;;4415:3;:7;;;4374:49;;;;;;;;;;4048:382;;;;;:::o;12890:384:9:-;-1:-1:-1;;;;;13009:18:9;;12956:22;13009:18;;;:11;:18;;;;;:29;;-1:-1:-1;;;;;;;;;;;13752:23:9;13031:7;;13009:18;:29;;13031:7;;13009:29;:::i;:::-;;;;-1:-1:-1;;13181:13:9;;;:24;;;;;;;13231:36;;1912:25:38;;;-1:-1:-1;;;;;;;13231:36:9;;;;;1900:2:38;1885:18;13231:36:9;1766:177:38;7263:514:9;7345:4;-1:-1:-1;;;;;7365:19:9;;;;:40;;-1:-1:-1;;;;;;7388:17:9;;;7365:40;7361:66;;;7414:13;;-1:-1:-1;;;7414:13:9;;;;;;;;;;;7361:66;-1:-1:-1;;;;;7491:18:9;;7438:22;7491:18;;;:11;:18;;;;;:29;;-1:-1:-1;;;;;;;;;;;13752:23:9;7513:7;;7491:18;:29;;7513:7;;7491:29;:::i;:::-;;;;-1:-1:-1;;;;;;;7666:16:9;;;;;;;:11;;;:16;;;;;;;:27;;;;;;7719:29;7666:16;;7719:29;;;;;;;7686:7;1912:25:38;;1900:2;1885:18;;1766:177;9147:1718:9;9418:15;9406:9;:27;9402:63;;;9442:23;;-1:-1:-1;;;9442:23:9;;;;;;;;;;;9402:63;-1:-1:-1;;;;;9708:16:9;;9476:22;9708:16;;;:8;:16;;;;;;;9773:1;9757:17;;;9738:36;;;-1:-1:-1;;;;;;;;;;;13752:23:9;9708:16;;9965:19;:17;:19::i;:::-;10049:451;;;10093:165;10049:451;;;20895:25:38;-1:-1:-1;;;;;20956:55:38;;;20936:18;;;20929:83;;;;21048:55;;;21028:18;;;21021:83;21120:18;;;21113:34;;;21163:19;;;21156:35;;;21207:19;;;21200:35;;;20867:19;;10049:451:9;;;;;;;;;;;;10010:516;;;;;;9887:661;;;;;;;;-1:-1:-1;;;21504:27:38;;21556:1;21547:11;;21540:27;;;;21592:2;21583:12;;21576:28;21629:2;21620:12;;21246:392;9887:661:9;;;;-1:-1:-1;;9887:661:9;;;;;;;;;9856:710;;9887:661;9856:710;;;;9829:811;;;;;;;;;21870:25:38;21943:4;21931:17;;21911:18;;;21904:45;21965:18;;;21958:34;;;22008:18;;;22001:34;;;21842:19;;9829:811:9;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;9829:811:9;;-1:-1:-1;;9829:811:9;;;-1:-1:-1;;;;;;;10659:31:9;;;;:62;;;10715:6;-1:-1:-1;;;;;10694:27:9;:17;-1:-1:-1;;;;;10694:27:9;;;10659:62;10655:90;;;10730:15;;-1:-1:-1;;;10730:15:9;;;;;;;;;;;10655:90;-1:-1:-1;;;;;;;10760:19:9;;;;;;;:11;;;:19;;;;;;;;:29;;;;;;;;;;;;;:38;;;10824:34;;1912:25:38;;;10824:34:9;;1885:18:38;10824:34:9;;;;;;;9338:1527;9147:1718;;;;;;;:::o;3128:220:19:-;-1:-1:-1;;;;;;;;;;;3287:54:19;;-1:-1:-1;;;;;;3287:54:19;-1:-1:-1;;;;;3287:54:19;;;;;;;;;;3128:220::o;11409:540:9:-;11780:24;;11467:7;;-1:-1:-1;;;;;;;;;;;13752:23:9;11617:141;;11780:24;;13752:23;;11780:24;:::i;:::-;;;;;;;;;;11585:343;;;23109:25:38;;;;23150:18;;23143:34;;;;11826:14:9;23193:18:38;;;23186:34;11862:13:9;23236:18:38;;;23229:34;11905:4:9;23279:19:38;;;23272:84;23081:19;;11585:343:9;;;;;;;;;;;;11558:384;;;;;;11539:403;;;11409:540;:::o;9155:205:25:-;9212:6;9222:1;9212:11;9208:38;;9232:14;;-1:-1:-1;;;9232:14:25;;;;;;;;;;;9208:38;9337:7;:16;9155:205::o;6278:303:27:-;6398:51;6423:18;6443:5;6398:24;:51::i;:::-;6459:53;6486:18;6506:5;6459:26;:53::i;:::-;6522:52;6548:18;6568:5;6522:25;:52::i;5197:262:5:-;5328:29;:27;:29::i;:::-;-1:-1:-1;;;;;5314:43:5;:10;-1:-1:-1;;;;;5314:43:5;;5310:143;;5400:10;5412:29;:27;:29::i;:::-;5380:62;;-1:-1:-1;;;5380:62:5;;-1:-1:-1;;;;;23559:55:38;;;5380:62:5;;;23541:74:38;23651:55;;23631:18;;;23624:83;23514:18;;5380:62:5;23367:346:38;7596:181:25;7727:43;7744:18;7764:5;7727:16;:43::i;10072:897::-;10160:26;10188:22;10659:3;10644:5;:12;:18;10640:80;;;10685:24;;-1:-1:-1;;;10685:24:25;;;;;;;;;;;10640:80;10909:12;;10894:28;;10909:5;;10906:1;;10894:11;:28::i;:::-;10870:92;;;;;;;;;;;;:::i;:::-;10836:126;;;;-1:-1:-1;10072:897:25;-1:-1:-1;;10072:897:25:o;8324:415:22:-;8400:25;8463:24;;;:10;:24;;;;;;-1:-1:-1;;;;;;;;;;;9223:26:22;8463:29;8459:274;;8556:24;;;;:10;;;;:24;;;;;;;;8549:31;;;8645:21;;;;:35;;;;;8638:42;;-1:-1:-1;;;;;;8638:42:22;;;;;;;;;8645:35;;8556:24;8638:42;;;;8556:24;8638:42;:::i;:::-;-1:-1:-1;8638:42:22;;;;;;;;;8700:22;;8709:12;;8700:22;;;8390:349;8324:415;:::o;5380:1479::-;5457:36;5480:12;5457:22;:36::i;:::-;5503:25;5586:35;;;:21;:35;;;;;;;;5563:58;;;;;;;;;-1:-1:-1;;;;;5563:58:22;;;;;;;;;;;;;;5586:21;5563:58;;;;-1:-1:-1;;;;;;;;;;;9223:26:22;5503:25;5563:58;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;5563:58:22;;;-1:-1:-1;;5563:58:22;;;;;;;;;;;5649:10;;5686:9;;;;5726:8;;;;5563:58;;-1:-1:-1;5649:10:22;;5749:21;:30;-1:-1:-1;5745:116:22;;;5802:48;;-1:-1:-1;;;5802:48:22;;;;;8713:25:38;;;5828:21:22;8754:18:38;;;8747:34;8686:18;;5802:48:22;8541:246:38;5745:116:22;6056:24;;;;:10;;;;:24;;;;;;;;6049:31;;;6097:21;;;;:35;;;;;6090:42;;-1:-1:-1;;;;;;6090:42:22;;;;;;;;;6097:35;;6056:24;6090:42;;;;6056:24;6090:42;:::i;:::-;;;;;;;;;6550:13;6569:7;-1:-1:-1;;;;;6569:12:22;6589:6;6597:5;6569:34;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6549:54;;;6619:8;6614:85;;6650:38;;-1:-1:-1;;;6650:38:22;;;;;1912:25:38;;;1885:18;;6650:38:22;1766:177:38;6614:85:22;6736:12;6714:138;6762:7;6783:6;6803:5;9567:15;6714:138;;;;;;;;;:::i;:::-;;;;;;;;5447:1412;;;;;;5380:1479;:::o;5661:171:5:-;5764:12;;:16;5760:66;;5796:19;2830:1:14;-1:-1:-1;;;;;;;;;;;2792:40:14;2649:199;1723:370:28;1838:38;1857:18;1838;:38::i;:::-;1891:37;;-1:-1:-1;;;;;1891:37:28;;;;;;;;1943:12;;:16;1939:148;;1975:52;2001:18;2021:5;1975:25;:52::i;1939:148::-;2058:18;:16;:18::i;6007:243:5:-;6153:1;6138:5;:12;:16;:36;;;;;6159:15;:13;:15::i;:::-;6158:16;6138:36;6134:110;;;6197:36;;-1:-1:-1;;;6197:36:5;;;;;;;;;;;8122:777:25;-1:-1:-1;;;;;;;;;;;11293:13:25;:27;2187:70;;2228:18;;-1:-1:-1;;;2228:18:25;;;;;;;;;;;2187:70;8555:7;;-1:-1:-1;;;;;;;;;;;11713:43:25;8252:36:::1;::::0;8537:25:::1;::::0;:15:::1;:25;:::i;:::-;8507:55;;8573:20;8596:257;8636:4;8755:18;8791:5;8655:155;;;;;;;;;:::i;:::-;;::::0;;-1:-1:-1;;8655:155:25;;::::1;::::0;;;;;;::::1;::::0;::::1;::::0;;-1:-1:-1;;;;;8655:155:25::1;-1:-1:-1::0;;;8655:155:25::1;::::0;;8824:19;8596:18:::1;:257::i;:::-;8864:28:::0;;;-1:-1:-1;;;;8122:777:25:o;726:515:37:-;844:20;910:24;915:4;921:5;:12;910:4;:24::i;:::-;903:31;;953:18;958:6;966:4;953;:18::i;:::-;944:27;-1:-1:-1;1031:13:37;944:27;1031:4;:13;:::i;:::-;1021:24;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1021:24:37;;1011:34;;1217:6;1211:4;1207:17;1198:6;1191:4;1184:5;1180:16;1176:29;1169:4;1160:7;1156:18;1150:75;726:515;;;;;:::o;4873:307:22:-;4951:25;5025:24;;;:10;:24;;;;;;-1:-1:-1;;;;;;;;;;;9223:26:22;5063:9;;;5059:44;;5081:22;;-1:-1:-1;;;5081:22:22;;;;;;;;;;;5059:44;5140:4;9567:15;5117:27;5113:60;;;5153:20;;-1:-1:-1;;;5153:20:22;;;;;;;;;;;2450:288:28;2524:45;2550:18;2524:25;:45::i;:::-;-1:-1:-1;;;;;;;;;;;2675:47:28;2450:288::o;4304:785::-;4415:12;4605:13;4620:24;4648:7;-1:-1:-1;;;;;4648:20:28;4669:5;4648:27;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4604:71;;;;4691:8;4686:368;;4719:18;;:22;4715:296;;4901:11;4895:18;4963:15;4949:11;4945:2;4941:20;4934:45;4715:296;5031:12;;-1:-1:-1;;;5031:12:28;;;;;;;;;;;2152:122;2202:9;:13;2198:70;;2238:19;;-1:-1:-1;;;2238:19:28;;;;;;;;;;;7268:920:22;7395:19;7454:4;9567:15;7430:28;7426:84;;7481:18;;-1:-1:-1;;;7481:18:22;;;;;;;;;;;7426:84;-1:-1:-1;;;;;;;;;;;7702:20:22;;7595:9;;9223:26;7519:25;7702:20;;;:::i;:::-;;;;-1:-1:-1;;7754:18:22;;;7784:23;;;:10;;;;:23;;;;;;;;:30;;;7861:125;;;;;;;-1:-1:-1;;;;;7861:125:22;;;;;;;;;;;;;;;;;;;;;;;7824:34;;;:21;;;;:34;;;;;;;:162;;;;-1:-1:-1;;;;;;7824:162:22;;;;;;;;;;;;;;;;;;;7754:18;;-1:-1:-1;7861:125:22;;7824:162;;;;;;;;:::i;:::-;;;;;;;;;;;;;8082:11;8062:119;8107:7;8128:6;8148:5;8167:4;8062:119;;;;;;;;;:::i;:::-;;;;;;;;7416:772;;7268:920;;;;;:::o;1490:110:37:-;1550:7;1581:2;1576;:7;:17;;1591:2;1576:17;;;-1:-1:-1;1586:2:37;;1490:110;-1:-1:-1;1490:110:37:o;3163:759:28:-;3335:18;-1:-1:-1;;;;;3335:30:28;;3369:1;3335:35;3331:121;;3393:48;;-1:-1:-1;;;3393:48:28;;-1:-1:-1;;;;;6908:55:38;;3393:48:28;;;6890:74:38;6863:18;;3393:48:28;6744:226:38;3331:121:28;3603:18;-1:-1:-1;;;;;3585:51:28;;:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;3585:53:28;;;;;;;;-1:-1:-1;;3585:53:28;;;;;;;;;;;;:::i;:::-;;;3581:335;;3857:48;;-1:-1:-1;;;3857:48:28;;-1:-1:-1;;;;;6908:55:38;;3857:48:28;;;6890:74:38;6863:18;;3857:48:28;6744:226:38;3581:335:28;-1:-1:-1;;;;;;;;;;;3702:27:28;;3698:121;;3756:48;;-1:-1:-1;;;3756:48:28;;-1:-1:-1;;;;;6908:55:38;;3756:48:28;;;6890:74:38;6863:18;;3756:48:28;6744:226:38;-1:-1:-1;;;;;;;:::i;:::-;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;14:289:38:-;56:3;94:5;88:12;121:6;116:3;109:19;177:6;170:4;163:5;159:16;152:4;147:3;143:14;137:47;229:1;222:4;213:6;208:3;204:16;200:27;193:38;292:4;285:2;281:7;276:2;268:6;264:15;260:29;255:3;251:39;247:50;240:57;;;14:289;;;;:::o;308:220::-;457:2;446:9;439:21;420:4;477:45;518:2;507:9;503:18;495:6;477:45;:::i;533:154::-;-1:-1:-1;;;;;612:5:38;608:54;601:5;598:65;588:93;;677:1;674;667:12;692:118;778:5;771:13;764:21;757:5;754:32;744:60;;800:1;797;790:12;815:382;880:6;888;941:2;929:9;920:7;916:23;912:32;909:52;;;957:1;954;947:12;909:52;996:9;983:23;1015:31;1040:5;1015:31;:::i;:::-;1065:5;-1:-1:-1;1122:2:38;1107:18;;1094:32;1135:30;1094:32;1135:30;:::i;:::-;1184:7;1174:17;;;815:382;;;;;:::o;1202:367::-;1270:6;1278;1331:2;1319:9;1310:7;1306:23;1302:32;1299:52;;;1347:1;1344;1337:12;1299:52;1386:9;1373:23;1405:31;1430:5;1405:31;:::i;:::-;1455:5;1533:2;1518:18;;;;1505:32;;-1:-1:-1;;;1202:367:38:o;1948:508::-;2025:6;2033;2041;2094:2;2082:9;2073:7;2069:23;2065:32;2062:52;;;2110:1;2107;2100:12;2062:52;2149:9;2136:23;2168:31;2193:5;2168:31;:::i;:::-;2218:5;-1:-1:-1;2275:2:38;2260:18;;2247:32;2288:33;2247:32;2288:33;:::i;:::-;1948:508;;2340:7;;-1:-1:-1;;;2420:2:38;2405:18;;;;2392:32;;1948:508::o;2461:127::-;2522:10;2517:3;2513:20;2510:1;2503:31;2553:4;2550:1;2543:15;2577:4;2574:1;2567:15;2593:275;2664:2;2658:9;2729:2;2710:13;;-1:-1:-1;;2706:27:38;2694:40;;2764:18;2749:34;;2785:22;;;2746:62;2743:88;;;2811:18;;:::i;:::-;2847:2;2840:22;2593:275;;-1:-1:-1;2593:275:38:o;2873:187::-;2922:4;2955:18;2947:6;2944:30;2941:56;;;2977:18;;:::i;:::-;-1:-1:-1;3043:2:38;3022:15;-1:-1:-1;;3018:29:38;3049:4;3014:40;;2873:187::o;3065:338::-;3130:5;3159:53;3175:36;3204:6;3175:36;:::i;:::-;3159:53;:::i;:::-;3150:62;;3235:6;3228:5;3221:21;3275:3;3266:6;3261:3;3257:16;3254:25;3251:45;;;3292:1;3289;3282:12;3251:45;3341:6;3336:3;3329:4;3322:5;3318:16;3305:43;3395:1;3388:4;3379:6;3372:5;3368:18;3364:29;3357:40;3065:338;;;;;:::o;3408:222::-;3451:5;3504:3;3497:4;3489:6;3485:17;3481:27;3471:55;;3522:1;3519;3512:12;3471:55;3544:80;3620:3;3611:6;3598:20;3591:4;3583:6;3579:17;3544:80;:::i;3635:114::-;3719:4;3712:5;3708:16;3701:5;3698:27;3688:55;;3739:1;3736;3729:12;3754:1149;3886:6;3894;3902;3910;3918;3926;3979:3;3967:9;3958:7;3954:23;3950:33;3947:53;;;3996:1;3993;3986:12;3947:53;4036:9;4023:23;4069:18;4061:6;4058:30;4055:50;;;4101:1;4098;4091:12;4055:50;4124;4166:7;4157:6;4146:9;4142:22;4124:50;:::i;:::-;4114:60;;;4227:2;4216:9;4212:18;4199:32;4256:18;4246:8;4243:32;4240:52;;;4288:1;4285;4278:12;4240:52;4311;4355:7;4344:8;4333:9;4329:24;4311:52;:::i;:::-;4301:62;;;4413:2;4402:9;4398:18;4385:32;4426:29;4449:5;4426:29;:::i;:::-;4474:5;-1:-1:-1;4532:2:38;4517:18;;4504:32;4561:18;4548:32;;4545:52;;;4593:1;4590;4583:12;4545:52;4616;4660:7;4649:8;4638:9;4634:24;4616:52;:::i;:::-;4606:62;;;4720:3;4709:9;4705:19;4692:33;4734;4759:7;4734:33;:::i;:::-;3754:1149;;;;-1:-1:-1;3754:1149:38;;;;;4866:3;4851:19;;;4838:33;;-1:-1:-1;;3754:1149:38:o;4908:247::-;4967:6;5020:2;5008:9;4999:7;4995:23;4991:32;4988:52;;;5036:1;5033;5026:12;4988:52;5075:9;5062:23;5094:31;5119:5;5094:31;:::i;:::-;5144:5;4908:247;-1:-1:-1;;;4908:247:38:o;5349:585::-;5426:6;5434;5487:2;5475:9;5466:7;5462:23;5458:32;5455:52;;;5503:1;5500;5493:12;5455:52;5542:9;5529:23;5561:31;5586:5;5561:31;:::i;:::-;5611:5;-1:-1:-1;5667:2:38;5652:18;;5639:32;5694:18;5683:30;;5680:50;;;5726:1;5723;5716:12;5680:50;5749:22;;5802:4;5794:13;;5790:27;-1:-1:-1;5780:55:38;;5831:1;5828;5821:12;5780:55;5854:74;5920:7;5915:2;5902:16;5897:2;5893;5889:11;5854:74;:::i;:::-;5844:84;;;5349:585;;;;;:::o;6121:618::-;6307:2;6319:21;;;6389:13;;6292:18;;;6411:22;;;6259:4;;6490:15;;;6464:2;6449:18;;;6259:4;6533:180;6547:6;6544:1;6541:13;6533:180;;;6612:13;;6627:4;6608:24;6596:37;;6662:2;6688:15;;;;6653:12;;;;6569:1;6562:9;6533:180;;;-1:-1:-1;6730:3:38;;6121:618;-1:-1:-1;;;;;6121:618:38:o;7496:322::-;7565:6;7618:2;7606:9;7597:7;7593:23;7589:32;7586:52;;;7634:1;7631;7624:12;7586:52;7674:9;7661:23;7707:18;7699:6;7696:30;7693:50;;;7739:1;7736;7729:12;7693:50;7762;7804:7;7795:6;7784:9;7780:22;7762:50;:::i;7823:226::-;7882:6;7935:2;7923:9;7914:7;7910:23;7906:32;7903:52;;;7951:1;7948;7941:12;7903:52;-1:-1:-1;7996:23:38;;7823:226;-1:-1:-1;7823:226:38:o;8054:482::-;-1:-1:-1;;;;;8289:6:38;8285:55;8274:9;8267:74;8377:3;8372:2;8361:9;8357:18;8350:31;8248:4;8398:46;8439:3;8428:9;8424:19;8416:6;8398:46;:::i;:::-;8475:2;8460:18;;8453:34;;;;-1:-1:-1;8518:2:38;8503:18;8496:34;8390:54;8054:482;-1:-1:-1;;8054:482:38:o;8792:289::-;8967:2;8956:9;8949:21;8930:4;8987:45;9028:2;9017:9;9013:18;9005:6;8987:45;:::i;:::-;8979:53;;9068:6;9063:2;9052:9;9048:18;9041:34;8792:289;;;;;:::o;9086:1009::-;9197:6;9205;9213;9221;9229;9237;9245;9298:3;9286:9;9277:7;9273:23;9269:33;9266:53;;;9315:1;9312;9305:12;9266:53;9354:9;9341:23;9373:31;9398:5;9373:31;:::i;:::-;9423:5;-1:-1:-1;9480:2:38;9465:18;;9452:32;9493:33;9452:32;9493:33;:::i;:::-;9545:7;-1:-1:-1;9625:2:38;9610:18;;9597:32;;-1:-1:-1;9728:2:38;9713:18;;9700:32;;-1:-1:-1;9810:3:38;9795:19;;9782:33;9824:31;9782:33;9824:31;:::i;:::-;9086:1009;;;;-1:-1:-1;9086:1009:38;;;;9874:7;9954:3;9939:19;;9926:33;;-1:-1:-1;10058:3:38;10043:19;;;10030:33;;9086:1009;-1:-1:-1;;9086:1009:38:o;10100:388::-;10168:6;10176;10229:2;10217:9;10208:7;10204:23;10200:32;10197:52;;;10245:1;10242;10235:12;10197:52;10284:9;10271:23;10303:31;10328:5;10303:31;:::i;:::-;10353:5;-1:-1:-1;10410:2:38;10395:18;;10382:32;10423:33;10382:32;10423:33;:::i;10896:245::-;10963:6;11016:2;11004:9;10995:7;10991:23;10987:32;10984:52;;;11032:1;11029;11022:12;10984:52;11064:9;11058:16;11083:28;11105:5;11083:28;:::i;11146:380::-;11225:1;11221:12;;;;11268;;;11289:61;;11343:4;11335:6;11331:17;11321:27;;11289:61;11396:2;11388:6;11385:14;11365:18;11362:38;11359:161;;11442:10;11437:3;11433:20;11430:1;11423:31;11477:4;11474:1;11467:15;11505:4;11502:1;11495:15;11359:161;;11146:380;;;:::o;11657:518::-;11759:2;11754:3;11751:11;11748:421;;;11795:5;11792:1;11785:16;11839:4;11836:1;11826:18;11909:2;11897:10;11893:19;11890:1;11886:27;11880:4;11876:38;11945:4;11933:10;11930:20;11927:47;;;-1:-1:-1;11968:4:38;11927:47;12023:2;12018:3;12014:12;12011:1;12007:20;12001:4;11997:31;11987:41;;12078:81;12096:2;12089:5;12086:13;12078:81;;;12155:1;12141:16;;12122:1;12111:13;12078:81;;;12082:3;;11657:518;;;:::o;12351:1299::-;12477:3;12471:10;12504:18;12496:6;12493:30;12490:56;;;12526:18;;:::i;:::-;12555:97;12645:6;12605:38;12637:4;12631:11;12605:38;:::i;:::-;12599:4;12555:97;:::i;:::-;12701:4;12732:2;12721:14;;12749:1;12744:649;;;;13437:1;13454:6;13451:89;;;-1:-1:-1;13506:19:38;;;13500:26;13451:89;-1:-1:-1;;12308:1:38;12304:11;;;12300:24;12296:29;12286:40;12332:1;12328:11;;;12283:57;13553:81;;12714:930;;12744:649;11604:1;11597:14;;;11641:4;11628:18;;-1:-1:-1;;12780:20:38;;;12898:222;12912:7;12909:1;12906:14;12898:222;;;12994:19;;;12988:26;12973:42;;13101:4;13086:20;;;;13054:1;13042:14;;;;12928:12;12898:222;;;12902:3;13148:6;13139:7;13136:19;13133:201;;;13209:19;;;13203:26;-1:-1:-1;;13292:1:38;13288:14;;;13304:3;13284:24;13280:37;13276:42;13261:58;13246:74;;13133:201;-1:-1:-1;;;;13380:1:38;13364:14;;;13360:22;13347:36;;-1:-1:-1;12351:1299:38:o;13655:742::-;13823:4;13871:2;13860:9;13856:18;-1:-1:-1;;;;;13905:6:38;13901:55;13890:9;13883:74;13993:2;13988;13977:9;13973:18;13966:30;14016:6;14051;14045:13;14082:6;14074;14067:22;14120:2;14109:9;14105:18;14098:25;;14158:2;14150:6;14146:15;14132:29;;14179:1;14189:182;14203:6;14200:1;14197:13;14189:182;;;14268:13;;14283:6;14264:26;14252:39;;14320:2;14346:15;;;;14311:12;;;;14225:1;14218:9;14189:182;;;-1:-1:-1;14388:3:38;;13655:742;-1:-1:-1;;;;;;13655:742:38:o;14402:997::-;14495:6;14548:2;14536:9;14527:7;14523:23;14519:32;14516:52;;;14564:1;14561;14554:12;14516:52;14597:9;14591:16;14630:18;14622:6;14619:30;14616:50;;;14662:1;14659;14652:12;14616:50;14685:22;;14738:4;14730:13;;14726:27;-1:-1:-1;14716:55:38;;14767:1;14764;14757:12;14716:55;14800:2;14794:9;14826:18;14818:6;14815:30;14812:56;;;14848:18;;:::i;:::-;14894:6;14891:1;14887:14;14921:28;14945:2;14941;14937:11;14921:28;:::i;:::-;14983:19;;;15027:2;15057:11;;;15053:20;;;15018:12;;;;15085:19;;;15082:39;;;15117:1;15114;15107:12;15082:39;15149:2;15145;15141:11;15130:22;;15161:208;15177:6;15172:3;15169:15;15161:208;;;15250:3;15244:10;15231:23;;15267:29;15290:5;15267:29;:::i;:::-;15309:18;;;15356:2;15194:12;;;;15347;;;;15161:208;;;15388:5;14402:997;-1:-1:-1;;;;;;;14402:997:38:o;15404:247::-;15472:6;15525:2;15513:9;15504:7;15500:23;15496:32;15493:52;;;15541:1;15538;15531:12;15493:52;15573:9;15567:16;15592:29;15615:5;15592:29;:::i;15656:127::-;15717:10;15712:3;15708:20;15705:1;15698:31;15748:4;15745:1;15738:15;15772:4;15769:1;15762:15;15788:383;15985:2;15974:9;15967:21;15948:4;16011:45;16052:2;16041:9;16037:18;16029:6;16011:45;:::i;:::-;16104:9;16096:6;16092:22;16087:2;16076:9;16072:18;16065:50;16132:33;16158:6;16150;16132:33;:::i;:::-;16124:41;15788:383;-1:-1:-1;;;;;15788:383:38:o;16176:179::-;16254:13;;16307:22;16296:34;;16286:45;;16276:73;;16345:1;16342;16335:12;16360:571;16463:6;16471;16479;16487;16495;16548:3;16536:9;16527:7;16523:23;16519:33;16516:53;;;16565:1;16562;16555:12;16516:53;16588:39;16617:9;16588:39;:::i;:::-;16667:2;16652:18;;16646:25;16733:2;16718:18;;16712:25;16827:2;16812:18;;16806:25;16578:49;;-1:-1:-1;16646:25:38;;-1:-1:-1;16712:25:38;-1:-1:-1;16806:25:38;-1:-1:-1;16876:49:38;16920:3;16905:19;;16876:49;:::i;:::-;16866:59;;16360:571;;;;;;;;:::o;16936:230::-;17006:6;17059:2;17047:9;17038:7;17034:23;17030:32;17027:52;;;17075:1;17072;17065:12;17027:52;-1:-1:-1;17120:16:38;;16936:230;-1:-1:-1;16936:230:38:o;17171:341::-;17246:5;17275:53;17291:36;17320:6;17291:36;:::i;17275:53::-;17266:62;;17351:6;17344:5;17337:21;17391:3;17382:6;17377:3;17373:16;17370:25;17367:45;;;17408:1;17405;17398:12;17367:45;17450:6;17445:3;17438:4;17431:5;17427:16;17421:36;17504:1;17497:4;17488:6;17481:5;17477:18;17473:29;17466:40;17171:341;;;;;:::o;17517:235::-;17570:5;17623:3;17616:4;17608:6;17604:17;17600:27;17590:55;;17641:1;17638;17631:12;17590:55;17663:83;17742:3;17733:6;17727:13;17720:4;17712:6;17708:17;17663:83;:::i;17757:335::-;17836:6;17889:2;17877:9;17868:7;17864:23;17860:32;17857:52;;;17905:1;17902;17895:12;17857:52;17938:9;17932:16;17971:18;17963:6;17960:30;17957:50;;;18003:1;18000;17993:12;17957:50;18026:60;18078:7;18069:6;18058:9;18054:22;18026:60;:::i;18097:458::-;18177:6;18230:2;18218:9;18209:7;18205:23;18201:32;18198:52;;;18246:1;18243;18236:12;18198:52;18279:9;18273:16;18312:18;18304:6;18301:30;18298:50;;;18344:1;18341;18334:12;18298:50;18367:22;;18420:4;18412:13;;18408:27;-1:-1:-1;18398:55:38;;18449:1;18446;18439:12;18398:55;18472:77;18541:7;18536:2;18530:9;18525:2;18521;18517:11;18472:77;:::i;18887:301::-;19016:3;19054:6;19048:13;19100:6;19093:4;19085:6;19081:17;19076:3;19070:37;19162:1;19126:16;;19151:13;;;-1:-1:-1;19126:16:38;18887:301;-1:-1:-1;18887:301:38:o;19193:127::-;19254:10;19249:3;19245:20;19242:1;19235:31;19285:4;19282:1;19275:15;19309:4;19306:1;19299:15;19325:128;19392:9;;;19413:11;;;19410:37;;;19427:18;;:::i;19458:125::-;19523:9;;;19544:10;;;19541:36;;;19557:18;;:::i;22046:799::-;22176:3;22205:1;22238:6;22232:13;22268:36;22294:9;22268:36;:::i;:::-;22335:1;22320:17;;22346:133;;;;22493:1;22488:332;;;;22313:507;;22346:133;-1:-1:-1;;22379:24:38;;22367:37;;22452:14;;22445:22;22433:35;;22424:45;;;-1:-1:-1;22346:133:38;;22488:332;22519:6;22516:1;22509:17;22567:4;22564:1;22554:18;22594:1;22608:166;22622:6;22619:1;22616:13;22608:166;;;22702:14;;22689:11;;;22682:35;22758:1;22745:15;;;;22644:4;22637:12;22608:166;;;22612:3;;22803:6;22798:3;22794:16;22787:23;;22313:507;-1:-1:-1;22836:3:38;;22046:799;-1:-1:-1;;;;;22046:799:38:o;23718:471::-;23814:6;23822;23875:2;23863:9;23854:7;23850:23;23846:32;23843:52;;;23891:1;23888;23881:12;23843:52;23923:9;23917:16;23942:31;23967:5;23942:31;:::i;:::-;24041:2;24026:18;;24020:25;23992:5;;-1:-1:-1;24068:18:38;24057:30;;24054:50;;;24100:1;24097;24090:12;24054:50;24123:60;24175:7;24166:6;24155:9;24151:22;24123:60;:::i;24194:482::-;-1:-1:-1;;;;;24429:6:38;24425:55;24414:9;24407:74;24517:6;24512:2;24501:9;24497:18;24490:34;24560:3;24555:2;24544:9;24540:18;24533:31;24388:4;24581:46;24622:3;24611:9;24607:19;24599:6;24581:46;:::i;:::-;24573:54;;24663:6;24658:2;24647:9;24643:18;24636:34;24194:482;;;;;;;:::o;24681:338::-;-1:-1:-1;;;;;24860:6:38;24856:55;24845:9;24838:74;24948:2;24943;24932:9;24928:18;24921:30;24819:4;24968:45;25009:2;24998:9;24994:18;24986:6;24968:45;:::i;25024:135::-;25063:3;25084:17;;;25081:43;;25104:18;;:::i;:::-;-1:-1:-1;25151:1:38;25140:13;;25024:135::o","linkReferences":{},"immutableReferences":{"3802":[{"start":8155,"length":32},{"start":8196,"length":32},{"start":9175,"length":32}]}}}}}}},"signatures":{"function":[{"signature":"allowance(address,address)","signatureHash4":"0xdd62ed3e","signatureHash32":"0xdd62ed3e90e97b3d417db9c0c7522647811bafca5afc6694f143588d255fdfb4"},{"signature":"approve(address,uint256)","signatureHash4":"0x095ea7b3","signatureHash32":"0x095ea7b334ae44009aa867bfb386f5c3b4b443ac6f0ee573fa91c4608fbadfba"},{"signature":"balanceOf(address)","signatureHash4":"0x70a08231","signatureHash32":"0x70a08231b98ef4ca268c9cc3f6b4590e4bfec28280db06bb5d45e689f2a360be"},{"signature":"blacklistTokenUser(address,bool)","signatureHash4":"0xc9c16fbd","signatureHash32":"0xc9c16fbdde3f8254615b9133a56a81278936763a57db6b6d1dca31a9cba8f72e"},{"signature":"burn(address,uint256)","signatureHash4":"0x9dc29fac","signatureHash32":"0x9dc29fac0ba6d4fc521c69c2b0c636d612e3343bc39ed934429b8876b0d12cba"},{"signature":"callUpgradeToAndCallUUPS(address,bytes)","signatureHash4":"0x33999fa6","signatureHash32":"0x33999fa65507315f0e985a3b08f3cfa7c4a6562981bd19834bf4e69c2b4aecf5"},{"signature":"cancelUpgrade()","signatureHash4":"0x55f29166","signatureHash32":"0x55f29166207ec88bc8c88572c70f03f06f2fe8be1dadbc070330f3f89a24f248"},{"signature":"decimals()","signatureHash4":"0x313ce567","signatureHash32":"0x313ce567add4d438edf58b94ff345d7d38c45b17dfc0f947988d7819dca364f9"},{"signature":"DOMAIN_SEPARATOR()","signatureHash4":"0x3644e515","signatureHash32":"0x3644e5157256d68e3eeedd2ead302507a9c4ffaff665547d2c3623a1e9e7edf4"},{"signature":"executeUpgrade()","signatureHash4":"0x7e896214","signatureHash32":"0x7e8962141983c58f6a3d1057d12263caa61cf4ed16f355caf54fd6422ece5145"},{"signature":"forcedTransfer(address,address,uint256)","signatureHash4":"0x9fc1d0e7","signatureHash32":"0x9fc1d0e71006164b9d71170070fc15db9c40055ed4ec4d1f90a8b8031f360b47"},{"signature":"getBundleData()","signatureHash4":"0xc1491c58","signatureHash32":"0xc1491c5835cd54b47f2fefa06c345f46a6acac5b2d0532cfcbff23aa8c045e49"},{"signature":"getImplementation()","signatureHash4":"0xaaf10f42","signatureHash32":"0xaaf10f42ee0f7eb6ce1c0e164360fddd3fec282c6618fb782ded4d823cfdcbb2"},{"signature":"getPermissionManagerAddress()","signatureHash4":"0xf2e23d22","signatureHash32":"0xf2e23d22c2b6150839cf583151db1c69e78987238ac627725188ebc07fbe094c"},{"signature":"getPrice()","signatureHash4":"0x98d5fdca","signatureHash32":"0x98d5fdcadea1306147ea4341c5601cc83106db3090e2da99fbba25961fd05868"},{"signature":"getPriceFeedDecimals()","signatureHash4":"0x422f8c0a","signatureHash32":"0x422f8c0af79c2904fa09c505089e3e6c6f95998290f5d955c740224c9a789b18"},{"signature":"getPriceFeedDescription()","signatureHash4":"0xf8fa842b","signatureHash32":"0xf8fa842b47b178f9829487a95959e312dd6484b325ecf8eee5c65aa311df6ab8"},{"signature":"getPriceFeedOracleAddress()","signatureHash4":"0x5845394b","signatureHash32":"0x5845394bc16890e73b04bdf98fda4f6c296f277d9887c50b1a01312e1b6d6fe7"},{"signature":"getScheduledOperationDetails(bytes32)","signatureHash4":"0x98d2082f","signatureHash32":"0x98d2082f920d7a2a7d16a3000001faf5be7252fb95c17618aac17a0425dd5e83"},{"signature":"getTokenURI()","signatureHash4":"0xd4a19116","signatureHash32":"0xd4a191164e8b32c02058b8b00006331715e749f5c357f6d6a322b96956d17ada"},{"signature":"initialize(string,string,uint8,string,address,uint256)","signatureHash4":"0x257e224c","signatureHash32":"0x257e224c160494c0f97e41acefbd31e2d0f8313a8a19a80fef6572c068e1ed07"},{"signature":"isInitialized()","signatureHash4":"0x392e53cd","signatureHash32":"0x392e53cd49dc5a01ebedfc7c48db5a28b96e0790f8dcf03f6062f7513e8d02b5"},{"signature":"isMinterBurner(address)","signatureHash4":"0x42679683","signatureHash32":"0x42679683366217a2154afe5127631bd7a45686c64f5064e0b5ca0ca6ee089972"},{"signature":"isOperator(address)","signatureHash4":"0x6d70f7ae","signatureHash32":"0x6d70f7aed2fef4fefe8becca5b6d4426a0b73b6d76820f010cf67171394e7337"},{"signature":"isPaused()","signatureHash4":"0xb187bd26","signatureHash32":"0xb187bd2625dabf471d1f3bd50a44225753699aa87d046d3b53bf00dfebd06f94"},{"signature":"isPauser(address)","signatureHash4":"0x46fbf68e","signatureHash32":"0x46fbf68e9af4b174565acc7a5f5256df89a0019864cab4994b666e1897990183"},{"signature":"isRoleManager(address)","signatureHash4":"0x2d524393","signatureHash32":"0x2d5243937836e746683464019b55701c466bc40923c38de41cc6c6158adc4fe1"},{"signature":"isSygTokenImplementation()","signatureHash4":"0xbf4dc4b6","signatureHash32":"0xbf4dc4b6cbcf9ee5fc74f9d5923429396e15df4010f93f1f9906ff40c44eb9b6"},{"signature":"isSystem(address)","signatureHash4":"0x34cdcf26","signatureHash32":"0x34cdcf262039714e5bac4493449b2eac8603fcda39ed7ef4eefa2270bd4382ce"},{"signature":"isTokenUser(address)","signatureHash4":"0x64dad32f","signatureHash32":"0x64dad32f6d9e307d1546c9e9b2684c54b8b3baee2296f197af820f9fab4ea8a7"},{"signature":"isTokenUserManager(address)","signatureHash4":"0x7ab8bf5a","signatureHash32":"0x7ab8bf5ae280af197780d814ed20b952075ab1dd35fdb8499e3f0dc4cf7b573b"},{"signature":"mint(address,uint256)","signatureHash4":"0x40c10f19","signatureHash32":"0x40c10f19c047ae7dfa66d6312b683d2ea3dfbcb4159e96b967c5f4b0a86f2842"},{"signature":"name()","signatureHash4":"0x06fdde03","signatureHash32":"0x06fdde0383f15d582d1a74511486c9ddf862a882fb7904b3d9fe9b8b8e58a796"},{"signature":"nonces(address)","signatureHash4":"0x7ecebe00","signatureHash32":"0x7ecebe00bc8d5df94a191da8e29b79e67a22b668e14b756a81ef2f5fa215cb0c"},{"signature":"pause()","signatureHash4":"0x8456cb59","signatureHash32":"0x8456cb591a934d53f6ccc6332123a165a1f3562907bf11330d847a29ca49eb89"},{"signature":"permit(address,address,uint256,uint256,uint8,bytes32,bytes32)","signatureHash4":"0xd505accf","signatureHash32":"0xd505accfee7b46ac3ce97322c21f328b64073d188137e16f7ef87f8de076b51c"},{"signature":"proxiableUUID()","signatureHash4":"0x52d1902d","signatureHash32":"0x52d1902ddf94a87b87c42e6ab3aff7da3c30beb57dc65dd86cb2543522a55a4c"},{"signature":"recoverFunds(address,address,uint256)","signatureHash4":"0x5d3590d5","signatureHash32":"0x5d3590d572a3f76b031de806bd2c4eae5448bfb459133bc8b52a6ba8ba91e42e"},{"signature":"setPermissionManagerAddress(address)","signatureHash4":"0xef3e8f22","signatureHash32":"0xef3e8f2297ec175b18607c314b437cbe0c9a810407b2520e92f7df90a73440ff"},{"signature":"symbol()","signatureHash4":"0x95d89b41","signatureHash32":"0x95d89b41e2f5f391a79ec54e9d87c79d6e777c63e32c28da95b4e9e4a79250ec"},{"signature":"totalSupply()","signatureHash4":"0x18160ddd","signatureHash32":"0x18160ddd7f15c72528c2f94fd8dfe3c8d5aa26e2c50c7d81f4bc7bee8d4b7932"},{"signature":"transfer(address,uint256)","signatureHash4":"0xa9059cbb","signatureHash32":"0xa9059cbb2ab09eb219583f4a59a5d0623ade346d962bcd4e46b11da047c9049b"},{"signature":"transferFrom(address,address,uint256)","signatureHash4":"0x23b872dd","signatureHash32":"0x23b872dd7302113369cda2901243429419bec145408fa8b352b3dd92b66c680b"},{"signature":"unpause()","signatureHash4":"0x3f4ba83a","signatureHash32":"0x3f4ba83af89dc9793996d9e56b8abe6dc88cd97c9c2bb23027806e9c1ffd54dc"},{"signature":"updateMinterBurner(address,bool)","signatureHash4":"0x5965959e","signatureHash32":"0x5965959e7f848c8a0e669550b97c6e5f912f723b8241262e1ef1cfb05264d5b5"},{"signature":"updatePricefeedOracleAddress(address)","signatureHash4":"0x440fde4e","signatureHash32":"0x440fde4e44c06d594caa187e5566f0f5d8e5b1879d9713f747935d369b67214c"},{"signature":"updateTokenURI(string)","signatureHash4":"0x98cd6153","signatureHash32":"0x98cd61538a481ea637e43ec2085986faccb1ae2b7bfea66cae7f06485442e002"},{"signature":"updateTokenUser(address,bool)","signatureHash4":"0x07e2a260","signatureHash32":"0x07e2a260b9c359b47e17568e9fff12ac79e230a3c0b37a9c90b90762bdbffaf5"},{"signature":"updateTokenUserManager(address,bool)","signatureHash4":"0x5ca13f04","signatureHash32":"0x5ca13f04ad358e9aeb7d90e3462c4a57bf739fade31072b3e663557241100638"},{"signature":"upgradeToAndCall(address,bytes)","signatureHash4":"0x4f1ef286","signatureHash32":"0x4f1ef2866b98625bdfefae89411f7a82754ac4089eff8e78c8832329a538337f"}],"event":[{"signature":"Approval(address,address,uint256)","signatureHash4":"0x8c5be1e5","signatureHash32":"0x8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925"},{"signature":"Callers(address,address)","signatureHash4":"0x16f23546","signatureHash32":"0x16f2354671bbabcb07367cc01a78931a00a812ee080430be4e8f1a76ab58212b"},{"signature":"Canceled(bytes32)","signatureHash4":"0x134fdd64","signatureHash32":"0x134fdd648feeaf30251f0157f9624ef8608ff9a042aad6d13e73f35d21d3f88d"},{"signature":"Executed(bytes32,address,uint256,bytes,uint256)","signatureHash4":"0xbc76564a","signatureHash32":"0xbc76564aec85e3f50672da2d1ddca0390851fecefe61cd19d89dea91a8267829"},{"signature":"ForcedTransfer(address,address,uint256)","signatureHash4":"0x7b3ce50c","signatureHash32":"0x7b3ce50c216d2ccf9919c6b9f1bfb33f0350a33010f188750b4af38e00448138"},{"signature":"FundsRecovered(address,address,uint256,uint256)","signatureHash4":"0x7a43eea7","signatureHash32":"0x7a43eea7e0e6937c4baa97b10dabb89519feb249fe9ddcb442415b029148520d"},{"signature":"Initialized()","signatureHash4":"0x5daa87a0","signatureHash32":"0x5daa87a0e9463431830481fd4b6e3403442dfb9a12b9c07597e9f61d50b633c8"},{"signature":"MinterBurnerUpdated(address,bool)","signatureHash4":"0xc71e52f7","signatureHash32":"0xc71e52f779c12ade7cbf75a51deb27377b5addd6a3945e0b356bff858ffad7fb"},{"signature":"Paused()","signatureHash4":"0x9e87fac8","signatureHash32":"0x9e87fac88ff661f02d44f95383c817fece4bce600a3dab7a54406878b965e752"},{"signature":"PriceFeedOracleUpdated(address,address)","signatureHash4":"0xd76fb624","signatureHash32":"0xd76fb624f0e2e090c9f82772a08d122c79250c90c7a896b1ed0de8bbe3e9e2e4"},{"signature":"Queued(bytes32,address,uint256,bytes,uint256)","signatureHash4":"0x8d6fedd4","signatureHash32":"0x8d6fedd41517ab865c3658696c50923b3493c8a93ffd016d919a599f03c7531b"},{"signature":"TokenURIUpdated(string,string)","signatureHash4":"0xfd07e2c2","signatureHash32":"0xfd07e2c2d6dc82f4d6b1b46f25e49eb888aba92d238fb40945856412cce2f2dd"},{"signature":"TokenUserBlacklisted(address,bool)","signatureHash4":"0x5e20cf47","signatureHash32":"0x5e20cf47b2259b331d4b7c60c19f771fc77bd7b207cb6438d0d217ea67755b57"},{"signature":"TokenUserManagerUpdated(address,bool)","signatureHash4":"0x6b410344","signatureHash32":"0x6b410344a541a2ad2ffec50ea1cafabe58c50db82f72ae4f46a4bd2419155b15"},{"signature":"TokenUserUpdated(address,bool)","signatureHash4":"0xd4145d5d","signatureHash32":"0xd4145d5d40015b9d77048466bbe3ff2411630f7b70f80f9d79c273b6311aba74"},{"signature":"Transfer(address,address,uint256)","signatureHash4":"0xddf252ad","signatureHash32":"0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef"},{"signature":"Unpaused()","signatureHash4":"0xa45f47fd","signatureHash32":"0xa45f47fdea8a1efdd9029a5691c7f759c32b7c698632b563573e155625d16933"},{"signature":"Upgraded(address)","signatureHash4":"0xbc7cd75a","signatureHash32":"0xbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b"}],"error":[{"signature":"AlreadyUpgrading()","signatureHash4":"0xe741fd45","signatureHash32":"0xe741fd4588fea232526bc55bcd6b99c962bd1b6a921a2bee033af7eef2265952"},{"signature":"ContractNotInitializedAfterUpgrade()","signatureHash4":"0xb3a31bfd","signatureHash32":"0xb3a31bfd1a7b48ab44f5c3907a0073f3f9e16450cb8a6a879fb2a0692a157925"},{"signature":"ContractNotPaused()","signatureHash4":"0xdcdde9dd","signatureHash32":"0xdcdde9dd57f2c462524b1f86add9cca86585a7e19f1560bbffd143cae135b06d"},{"signature":"ContractPaused()","signatureHash4":"0xab35696f","signatureHash32":"0xab35696f06e428ebc5ceba8cd17f8fed287baf43440206d1943af1ee53e6d267"},{"signature":"ERC1967InvalidImplementation(address)","signatureHash4":"0x4c9c8ce3","signatureHash32":"0x4c9c8ce3ceb3130f17f7cdba48d89b5b0129f266a8bac114e6e315a41879b617"},{"signature":"ERC1967NonPayable()","signatureHash4":"0xb398979f","signatureHash32":"0xb398979fa84f543c8e222f17890372c487baf85e062276c127fef521eea7224b"},{"signature":"FailedCall()","signatureHash4":"0xd6bda275","signatureHash32":"0xd6bda27508c0fb6d8a39b4b122878dab26f731a7d4e4abe711dd3731899052a4"},{"signature":"IncompleteRound()","signatureHash4":"0x8ad52bdd","signatureHash32":"0x8ad52bdd084d479432b797fb4ab04fc6341af64b31ea4f8a4719c2ff2112e19a"},{"signature":"InsufficientFunds(uint256,uint256)","signatureHash4":"0x03eb8b54","signatureHash32":"0x03eb8b54a949acec2cd08fdb6d6bd4647a1f2c907d75d6900648effa92eb147f"},{"signature":"InvalidDelay()","signatureHash4":"0x4fbe5dba","signatureHash32":"0x4fbe5dba117cefd268b5935b3ab891c423638d2c547993978b97cac9dfcdc31d"},{"signature":"InvalidInitialization()","signatureHash4":"0xf92ee8a9","signatureHash32":"0xf92ee8a957075833165f68c320933b1a1294aafc84ee6e0dd3fb178008f9aaf5"},{"signature":"InvalidOracle(address)","signatureHash4":"0x1f936017","signatureHash32":"0x1f9360175141e36f0a8a143aea301c86df3556853d1b376e461a645e22fca135"},{"signature":"InvalidPrice()","signatureHash4":"0x00bfc921","signatureHash32":"0x00bfc9219afe7e8e3b9f14a4708e4cd3d8acb04e325ce992b2a60a58a519683a"},{"signature":"InvalidSigner()","signatureHash4":"0x815e1d64","signatureHash32":"0x815e1d64efb74fbe314c20a2b8a2335d18bce12a19165e447fa36bcb35959528"},{"signature":"InvalidTimestamp()","signatureHash4":"0xb7d09497","signatureHash32":"0xb7d094970b04b77ab912162b43fb6fa64218725dea82d6c06bd724dad03215e3"},{"signature":"InvalidUpgradeCalldata()","signatureHash4":"0xfc69850b","signatureHash32":"0xfc69850b691d9259cbfb49b0b1e76f674ee80454053687ed4baef6f14dbfa9cd"},{"signature":"NotTokenUser(address)","signatureHash4":"0x9a197e6c","signatureHash32":"0x9a197e6ca6010a257ba04a9ec8b7777676c665d0c0c0a02069640185e1b5cf6c"},{"signature":"NoUpgradeScheduled()","signatureHash4":"0x0604a9ff","signatureHash32":"0x0604a9ffc4bf45102c9464a781f5186ff5cf7697dfa3e4b4633209e00b06b2be"},{"signature":"OperationExecutionFailed(bytes32)","signatureHash4":"0x165a1d41","signatureHash32":"0x165a1d41bd4bc3caff8a9dc45f0289c32e86b15c62955af6916572d830f607c1"},{"signature":"PermitDeadlineExpired()","signatureHash4":"0x05787bdf","signatureHash32":"0x05787bdf772b5b2286792a39059cbe9e21ff68a11e12300808a4e27c6d93c8c7"},{"signature":"SameOracleAddress(address)","signatureHash4":"0x1eeb14f1","signatureHash32":"0x1eeb14f14f2f0792c480401e9e9559ed3e73dab5e603ecabe944649c50cd8a04"},{"signature":"SameTokenURI(string)","signatureHash4":"0x8651f2a5","signatureHash32":"0x8651f2a50f3ab9e0ac87712e38af913edbb6e3354e72e5ab25f35e7f23d7e3ff"},{"signature":"TimeLockAlreadyExist()","signatureHash4":"0xc3544774","signatureHash32":"0xc3544774445c127aafed908e8145fb2ed39536a4ba5c5736d0cdb1a3dd09b208"},{"signature":"TimelockDoesNotExist()","signatureHash4":"0x97355412","signatureHash32":"0x97355412f49c149ff6478c872d35afc77c421d8522f445495ee6891656a162f8"},{"signature":"TimelockNotReached()","signatureHash4":"0x1e1665fe","signatureHash32":"0x1e1665fee7501dde6586829c1cd3d2f04c8468127cf32361add6195e6a053bef"},{"signature":"TransferFailed()","signatureHash4":"0x90b8ec18","signatureHash32":"0x90b8ec1877afffd816d05d9b13947f3ff18ec5851c38bad15ec2b710f92391b1"},{"signature":"Unauthorized()","signatureHash4":"0x82b42900","signatureHash32":"0x82b4290015f7ec7256ca2a6247d3c2a89c4865c0e791456df195f40ad0a81367"},{"signature":"UnAuthorizedCall()","signatureHash4":"0x0e615590","signatureHash32":"0x0e61559067335715d75fcf77ebdabac62ed068cf79ca7587adccc2940329af13"},{"signature":"UnauthorizedUpgrade(address,address)","signatureHash4":"0xfe6cd275","signatureHash32":"0xfe6cd2757c9a040473a8b946a8f8848c32af5cd59370fc641362a42bc321e448"},{"signature":"UUPSUnauthorizedCallContext()","signatureHash4":"0xe07c8dba","signatureHash32":"0xe07c8dba242a06571ac65fe4bbe20522c9fb111cb33599b799ff8039c1ed18f4"},{"signature":"ZeroAddress()","signatureHash4":"0xd92e233d","signatureHash32":"0xd92e233df2717d4a40030e20904abd27b68fcbeede117eaaccbbdac9618c8c73"}]},"proxyResolution":{"isProxy":false,"proxyType":null,"implementations":[]},"match":"exact_match","chainId":"1","address":"0x7030fe438Be6Ed196B8886616BBF5a245c267339"}