From 8df356a90ffa96145da47a60e299bddbfbfc8f9a Mon Sep 17 00:00:00 2001 From: Alexander Date: Thu, 30 Oct 2025 20:39:47 +0100 Subject: [PATCH 1/2] Upgrade OIF --- lib/OIF | 2 +- script/orderId.s.sol | 2 +- script/polymer.s.sol | 4 +-- snapshots/inputSettler.json | 20 +++++------ src/input/compact/InputSettlerCompactLIFI.sol | 5 ++- src/input/escrow/InputSettlerEscrowLIFI.sol | 6 +++- src/libs/GovernanceFee.sol | 5 ++- src/libs/RegisterIntentLib.sol | 33 +++++++++++-------- .../compact/InputSettlerCompactLIFI.t.sol | 15 +++++---- .../input/escrow/InputSettlerEscrowLIFI.t.sol | 23 ++++++++----- .../InputSettler7683LIFI.samechain.t.sol | 14 ++++---- test/lib/RegisterIntentLib.t.sol | 5 ++- 12 files changed, 79 insertions(+), 55 deletions(-) diff --git a/lib/OIF b/lib/OIF index d81ecf1..225afb5 160000 --- a/lib/OIF +++ b/lib/OIF @@ -1 +1 @@ -Subproject commit d81ecf1832c730fba0b3a1819baced12d6657e1c +Subproject commit 225afb52ba6f553ac054704373797cf7f4d0a8b7 diff --git a/script/orderId.s.sol b/script/orderId.s.sol index 27cacbb..81a3d51 100644 --- a/script/orderId.s.sol +++ b/script/orderId.s.sol @@ -23,7 +23,7 @@ contract GetOrderId is Script { token: 0x000000000000000000000000036cbd53842c5426634e7929541ec2318f3dcf7e, amount: 20000, recipient: 0x000000000000000000000000529cebf485dee1d68073afb75244022f048b0157, - call: hex"", + callbackData: hex"", context: hex"" }); StandardOrder memory order = StandardOrder({ diff --git a/script/polymer.s.sol b/script/polymer.s.sol index f965ff7..bda9859 100644 --- a/script/polymer.s.sol +++ b/script/polymer.s.sol @@ -18,9 +18,9 @@ contract deployPolymer is multichain { constructor() { polymerSalts[0x03Fb5bFA4EB2Cba072A477A372bB87880A60fC96] = - 0x00000000000000000000000000000000000000003f5a1d9c8d66f846fc58000c; + 0x00000000000000000000000000000000000000003f5a1d9c8d66f846fc58000c; polymerSalts[0x95ccEAE71605c5d97A0AC0EA13013b058729d075] = - 0x00000000000000000000000000000000000000004f09241f65a03e2a3e020030; + 0x00000000000000000000000000000000000000004f09241f65a03e2a3e020030; } function run( diff --git a/snapshots/inputSettler.json b/snapshots/inputSettler.json index f0a7568..2b3673f 100644 --- a/snapshots/inputSettler.json +++ b/snapshots/inputSettler.json @@ -2,20 +2,20 @@ "CompactFinaliseFor": "101978", "CompactFinaliseSelf": "94549", "CompactFinaliseTo": "94549", - "EscrowFinalise": "44343", - "IntegrationCoinFill": "64943", + "EscrowFinalise": "44316", + "IntegrationCoinFill": "64965", "IntegrationCompactFinaliseSelf": "85359", "IntegrationWormholeReceiveMessage": "45665", "IntegrationWormholeSubmit": "13837", "broadcast": "14904", "compactFinaliseSelfWithFee": "164087", "depositAndRegisterFor": "129887", - "escrowFinaliseSelfWithFee": "106546", - "escrowFinaliseWithSignature": "51532", - "escrowOpen": "56800", - "escrowOpenFor3009Single": "85401", - "escrowOpenFor3009SingleArray": "90505", - "escrowOpenFor3009Two": "140507", - "escrowOpenForMsgSender": "57023", - "escrowOpenForPermit2": "94692" + "escrowFinaliseSelfWithFee": "106519", + "escrowFinaliseWithSignature": "51505", + "escrowOpen": "56999", + "escrowOpenFor3009Single": "85640", + "escrowOpenFor3009SingleArray": "90796", + "escrowOpenFor3009Two": "140807", + "escrowOpenForMsgSender": "57219", + "escrowOpenForPermit2": "94897" } \ No newline at end of file diff --git a/src/input/compact/InputSettlerCompactLIFI.sol b/src/input/compact/InputSettlerCompactLIFI.sol index 1763a02..4ebe1b3 100644 --- a/src/input/compact/InputSettlerCompactLIFI.sol +++ b/src/input/compact/InputSettlerCompactLIFI.sol @@ -30,7 +30,10 @@ contract InputSettlerCompactLIFI is InputSettlerCompact, GovernanceFee { event IntentRegistered(bytes32 indexed orderId, StandardOrder order); - constructor(address compact, address initialOwner) InputSettlerCompact(compact) { + constructor( + address compact, + address initialOwner + ) InputSettlerCompact(compact) { _initializeOwner(initialOwner); } diff --git a/src/input/escrow/InputSettlerEscrowLIFI.sol b/src/input/escrow/InputSettlerEscrowLIFI.sol index 3d11579..ff34a06 100644 --- a/src/input/escrow/InputSettlerEscrowLIFI.sol +++ b/src/input/escrow/InputSettlerEscrowLIFI.sol @@ -54,7 +54,11 @@ contract InputSettlerEscrowLIFI is InputSettlerEscrow, GovernanceFee { * msg.sender. * Does not validate fillDeadline. */ - function _validateFillsNow(address inputOracle, MandateOutput[] calldata outputs, bytes32 orderId) internal view { + function _validateFillsNow( + address inputOracle, + MandateOutput[] calldata outputs, + bytes32 orderId + ) internal view { uint256 numOutputs = outputs.length; bytes memory proofSeries = new bytes(32 * 4 * numOutputs); for (uint256 i; i < numOutputs; ++i) { diff --git a/src/libs/GovernanceFee.sol b/src/libs/GovernanceFee.sol index e4dd61a..c07b727 100644 --- a/src/libs/GovernanceFee.sol +++ b/src/libs/GovernanceFee.sol @@ -85,7 +85,10 @@ abstract contract GovernanceFee is Ownable { * @param fee Fee to subtract from amount. Is percentage and GOVERNANCE_FEE_DENOM based. * @return amountFee Fee */ - function _calcFee(uint256 amount, uint256 fee) internal pure returns (uint256 amountFee) { + function _calcFee( + uint256 amount, + uint256 fee + ) internal pure returns (uint256 amountFee) { unchecked { // Check if amount * fee overflows. If it does, don't take the fee. if (fee == 0 || amount >= type(uint256).max / fee) return amountFee = 0; diff --git a/src/libs/RegisterIntentLib.sol b/src/libs/RegisterIntentLib.sol index 032b521..cfe0422 100644 --- a/src/libs/RegisterIntentLib.sol +++ b/src/libs/RegisterIntentLib.sol @@ -21,7 +21,7 @@ library RegisterIntentLib { bytes32 constant STANDARD_ORDER_BATCH_COMPACT_TYPE_HASH = keccak256( bytes( - "BatchCompact(address arbiter,address sponsor,uint256 nonce,uint256 expires,Lock[] commitments,Mandate mandate)Lock(bytes12 lockTag,address token,uint256 amount)Mandate(uint32 fillDeadline,address inputOracle,MandateOutput[] outputs)MandateOutput(bytes32 oracle,bytes32 settler,uint256 chainId,bytes32 token,uint256 amount,bytes32 recipient,bytes call,bytes context)" + "BatchCompact(address arbiter,address sponsor,uint256 nonce,uint256 expires,Lock[] commitments,Mandate mandate)Lock(bytes12 lockTag,address token,uint256 amount)Mandate(uint32 fillDeadline,address inputOracle,MandateOutput[] outputs)MandateOutput(bytes32 oracle,bytes32 settler,uint256 chainId,bytes32 token,uint256 amount,bytes32 recipient,bytes callbackData,bytes context)" ) ); @@ -42,7 +42,7 @@ library RegisterIntentLib { output.token, output.amount, output.recipient, - keccak256(output.call), + keccak256(output.callbackData), keccak256(output.context) ) ); @@ -112,7 +112,10 @@ library RegisterIntentLib { } } - function compactClaimHash(address settler, StandardOrder calldata order) internal pure returns (bytes32) { + function compactClaimHash( + address settler, + StandardOrder calldata order + ) internal pure returns (bytes32) { return keccak256( abi.encode( STANDARD_ORDER_BATCH_COMPACT_TYPE_HASH, @@ -133,7 +136,10 @@ library RegisterIntentLib { if (block.chainid != originChainId) revert WrongChain(block.chainid, originChainId); } - function _validateExpiry(uint32 fillDeadline, uint32 expires) internal view { + function _validateExpiry( + uint32 fillDeadline, + uint32 expires + ) internal view { // Check if the fill deadline has been passed if (block.timestamp > fillDeadline) revert DeadlinePassed(); // Check if expiry has been passed @@ -163,14 +169,15 @@ library RegisterIntentLib { } } - (claimHash,) = TheCompact(COMPACT).batchDepositAndRegisterFor( - order.user, - idsAndAmounts, - arbiter, - order.nonce, - order.expires, - STANDARD_ORDER_BATCH_COMPACT_TYPE_HASH, - witnessHash(order) - ); + (claimHash,) = TheCompact(COMPACT) + .batchDepositAndRegisterFor( + order.user, + idsAndAmounts, + arbiter, + order.nonce, + order.expires, + STANDARD_ORDER_BATCH_COMPACT_TYPE_HASH, + witnessHash(order) + ); } } diff --git a/test/input/compact/InputSettlerCompactLIFI.t.sol b/test/input/compact/InputSettlerCompactLIFI.t.sol index 2b36435..3a4e721 100644 --- a/test/input/compact/InputSettlerCompactLIFI.t.sol +++ b/test/input/compact/InputSettlerCompactLIFI.t.sol @@ -39,7 +39,10 @@ contract InputSettlerCompactLIFITest is InputSettlerCompactTest { InputSettlerCompactLIFI(inputSettlerCompact).setGovernanceFee(type(uint64).max); } - function test_governance_fee_change_not_ready(uint64 fee, uint256 timeDelay) public { + function test_governance_fee_change_not_ready( + uint64 fee, + uint256 timeDelay + ) public { vm.assume(fee <= MAX_GOVERNANCE_FEE); vm.assume(timeDelay < uint32(block.timestamp) + GOVERNANCE_FEE_CHANGE_DELAY); @@ -96,7 +99,7 @@ contract InputSettlerCompactLIFITest is InputSettlerCompactTest { token: bytes32(uint256(uint160(address(anotherToken)))), amount: amount, recipient: bytes32(uint256(uint160(swapper))), - call: hex"", + callbackData: hex"", context: hex"" }); StandardOrder memory order = StandardOrder({ @@ -125,14 +128,12 @@ contract InputSettlerCompactLIFITest is InputSettlerCompactTest { InputSettlerBase.SolveParams[] memory solveParams = new InputSettlerBase.SolveParams[](1); solveParams[0] = InputSettlerBase.SolveParams({ - solver: bytes32(uint256(uint160((solver)))), - timestamp: uint32(block.timestamp) + solver: bytes32(uint256(uint160((solver)))), timestamp: uint32(block.timestamp) }); vm.prank(solver); - InputSettlerCompactLIFI(inputSettlerCompact).finalise( - order, signature, solveParams, bytes32(uint256(uint160((solver)))), hex"" - ); + InputSettlerCompactLIFI(inputSettlerCompact) + .finalise(order, signature, solveParams, bytes32(uint256(uint160((solver)))), hex""); vm.snapshotGasLastCall("inputSettler", "compactFinaliseSelfWithFee"); assertEq(token.balanceOf(solver), amountPostFee); diff --git a/test/input/escrow/InputSettlerEscrowLIFI.t.sol b/test/input/escrow/InputSettlerEscrowLIFI.t.sol index a7e8d16..72755c9 100644 --- a/test/input/escrow/InputSettlerEscrowLIFI.t.sol +++ b/test/input/escrow/InputSettlerEscrowLIFI.t.sol @@ -14,7 +14,11 @@ contract InputSettlerEscrowLIFIHarness is InputSettlerEscrowLIFI { address initialOwner ) InputSettlerEscrowLIFI(initialOwner) { } - function validateFillsNow(address inputOracle, MandateOutput[] calldata outputs, bytes32 orderId) external view { + function validateFillsNow( + address inputOracle, + MandateOutput[] calldata outputs, + bytes32 orderId + ) external view { _validateFillsNow(inputOracle, outputs, orderId); } } @@ -60,7 +64,7 @@ contract inputSettlerEscrowTestBaseLIFI is InputSettlerEscrowTest { output.token, output.amount, output.recipient, - output.call, + output.callbackData, output.context ) ) @@ -91,7 +95,10 @@ contract inputSettlerEscrowTestBaseLIFI is InputSettlerEscrowTest { InputSettlerEscrowLIFI(inputSettlerEscrow).setGovernanceFee(type(uint64).max); } - function test_governance_fee_change_not_ready(uint64 fee, uint256 timeDelay) public { + function test_governance_fee_change_not_ready( + uint64 fee, + uint256 timeDelay + ) public { vm.assume(fee <= MAX_GOVERNANCE_FEE); vm.assume(timeDelay < uint32(block.timestamp) + GOVERNANCE_FEE_CHANGE_DELAY); @@ -140,7 +147,7 @@ contract inputSettlerEscrowTestBaseLIFI is InputSettlerEscrowTest { token: bytes32(uint256(uint160(address(anotherToken)))), amount: amount, recipient: bytes32(uint256(uint160(swapper))), - call: hex"", + callbackData: hex"", context: hex"" }); uint256[2][] memory inputs = new uint256[2][](1); @@ -181,14 +188,12 @@ contract inputSettlerEscrowTestBaseLIFI is InputSettlerEscrowTest { InputSettlerBase.SolveParams[] memory solveParams = new InputSettlerBase.SolveParams[](1); solveParams[0] = InputSettlerBase.SolveParams({ - timestamp: uint32(block.timestamp), - solver: bytes32(uint256(uint160((solver)))) + timestamp: uint32(block.timestamp), solver: bytes32(uint256(uint160((solver)))) }); vm.prank(solver); - InputSettlerEscrowLIFI(inputSettlerEscrow).finalise( - order, solveParams, bytes32(uint256(uint160((solver)))), hex"" - ); + InputSettlerEscrowLIFI(inputSettlerEscrow) + .finalise(order, solveParams, bytes32(uint256(uint160((solver)))), hex""); vm.snapshotGasLastCall("inputSettler", "escrowFinaliseSelfWithFee"); uint256 govFeeAmount = (amount * fee) / 10 ** 18; diff --git a/test/integration/InputSettler7683LIFI.samechain.t.sol b/test/integration/InputSettler7683LIFI.samechain.t.sol index 06b0c47..d8d458b 100644 --- a/test/integration/InputSettler7683LIFI.samechain.t.sol +++ b/test/integration/InputSettler7683LIFI.samechain.t.sol @@ -61,7 +61,7 @@ contract InputSettlerEscrowSameChainSwapTest is InputSettlerEscrowTestBase { token: bytes32(uint256(uint160(address(anotherToken)))), amount: amount2, recipient: bytes32(uint256(uint160(swapper))), - call: hex"", + callbackData: hex"", context: hex"" }); uint256[2][] memory inputs1 = new uint256[2][](1); @@ -87,7 +87,7 @@ contract InputSettlerEscrowSameChainSwapTest is InputSettlerEscrowTestBase { token: bytes32(uint256(uint160(address(token)))), amount: amount1, recipient: bytes32(uint256(uint160(swapper2))), - call: hex"", + callbackData: hex"", context: hex"" }); uint256[2][] memory inputs2 = new uint256[2][](1); @@ -119,9 +119,8 @@ contract InputSettlerEscrowSameChainSwapTest is InputSettlerEscrowTestBase { bytes memory dataToForward = abi.encode(signature2, orderid1, order1, orderid2, order2); // Notice! This test will continue in inputs filled. - InputSettlerEscrowLIFI(inputSettlerEscrow).openForAndFinalise( - order1, order1.user, signature1, address(this), dataToForward - ); + InputSettlerEscrowLIFI(inputSettlerEscrow) + .openForAndFinalise(order1, order1.user, signature1, address(this), dataToForward); assertEq(token.balanceOf(address(swapper)), 0); assertEq(anotherToken.balanceOf(address(swapper2)), 0); @@ -148,9 +147,8 @@ contract InputSettlerEscrowSameChainSwapTest is InputSettlerEscrowTestBase { assertEq(anotherToken.balanceOf(address(swapper2)), amount2); // Notice! The test will continue after "} else {" - InputSettlerEscrowLIFI(inputSettlerEscrow).openForAndFinalise( - order2, order2.user, signature2, address(this), dataToForward - ); + InputSettlerEscrowLIFI(inputSettlerEscrow) + .openForAndFinalise(order2, order2.user, signature2, address(this), dataToForward); } else { (, bytes32 orderid1, StandardOrder memory order1, bytes32 orderid2, StandardOrder memory order2) = abi.decode(dataToForward, (bytes, bytes32, StandardOrder, bytes32, StandardOrder)); diff --git a/test/lib/RegisterIntentLib.t.sol b/test/lib/RegisterIntentLib.t.sol index b6dac33..da556e1 100644 --- a/test/lib/RegisterIntentLib.t.sol +++ b/test/lib/RegisterIntentLib.t.sol @@ -25,7 +25,10 @@ contract RegisterIntentLibTest is InputSettlerCompactTestBase { event IntentRegistered(bytes32 indexed orderId, StandardOrder order); - function test_depositFor(address depositor, address user) public { + function test_depositFor( + address depositor, + address user + ) public { vm.assume(depositor != address(0)); vm.assume(user != address(0)); vm.assume(depositor != address(inputSettlerCompact)); From f9e4348e14f4d32c9259cfcf870ab54a23d6540d Mon Sep 17 00:00:00 2001 From: Alexander Date: Mon, 3 Nov 2025 16:37:17 +0100 Subject: [PATCH 2/2] New deployments --- README.md | 6 +-- foundry.toml | 1 + script/deploy.s.sol | 118 ++++++++++++++++++-------------------------- 3 files changed, 52 insertions(+), 73 deletions(-) diff --git a/README.md b/README.md index d84378b..96322d3 100644 --- a/README.md +++ b/README.md @@ -6,9 +6,9 @@ LI.FI Intent is a cross-chain swap protocol built with the Open Intents Framewor Deployed addresses: - Compact Address: `0x00000000000000171ede64904551eeDF3C6C9788` -- Input Settler Compact Address: `0x000000c9eC71B1a39055Ec631200ED0022140074` -- Input Settler Escrow Address: `0x000001bf3F3175BD007f3889b50000c7006E72c0` -- Output Settler Address: `0x00000000D7278408CE7a490015577c41e57143a5` +- Input Settler Compact Address: `0x0000000000cd5f7fDEc90a03a31F79E5Fbc6A9Cf` +- Input Settler Escrow Address: `0x000025c3226C00B2Cdc200005a1600509f4e00C0` +- Output Settler Address: `0x0000000000eC36B683C2E6AC89e9A75989C22a2e` - Polymer Oracle Testnet: `0x00d5b500ECa100F7cdeDC800eC631Aca00BaAC00` - Polymer Oracle Mainnet: `0x0000006ea400569c0040d6e5ba651c00848409be` diff --git a/foundry.toml b/foundry.toml index ab51ffc..6c2d3d5 100644 --- a/foundry.toml +++ b/foundry.toml @@ -7,6 +7,7 @@ evm_version = "cancun" via_ir = true optimizer = true optimizer_runs = 100_000_000 +bytecode_hash = 'none' fuzz.runs = 10_000 fs_permissions = [{ access = "read-write", path = "./script/wormhole.json" }, { access = "read-write", path = "./script/polymer.json" }] diff --git a/script/deploy.s.sol b/script/deploy.s.sol index 89f0dfa..ac6671c 100644 --- a/script/deploy.s.sol +++ b/script/deploy.s.sol @@ -32,57 +32,68 @@ contract deploy is multichain { uint256 private constant _ALLOCATOR_BY_ALLOCATOR_ID_SLOT_SEED = 0x000044036fc77deaed2300000000000000000000000; - bytes32 compactInputSettlerSalt = 0x00000000000000000000000000000000000000006ff68c8dad0e10d563870020; - bytes32 escrowInputSettlerSalt = 0x0000000000000000000000000000000000000000f358e61463148e7aa0b80038; - bytes32 outputSettlerSalt = 0x00000000000000000000000000000000000000007db1f09bb639430ecc0700a0; + bytes32 compactInputSettlerSalt = 0x0000000000000000000000000000000000000000f6984c847844f46d961403a0; + bytes32 escrowInputSettlerSalt = 0x000000000000000000000000000000000000000036953f8842af61be32560ee0; + bytes32 outputSettlerSalt = 0x0000000000000000000000000000000000000000071f34063c15a56d555d1000; + + function inputSettlerCompactInitcodeHash( + address initialOwner + ) external returns (bytes32) { + return + keccak256(abi.encodePacked(type(InputSettlerCompactLIFI).creationCode, abi.encode(COMPACT, initialOwner))); + } + + function inputSettlerEscrowInitcodeHash( + address initialOwner + ) external returns (bytes32) { + return keccak256(abi.encodePacked(type(InputSettlerEscrowLIFI).creationCode, abi.encode(initialOwner))); + } + + function outputSettlerInitcodeHash() external returns (bytes32) { + return keccak256(abi.encodePacked(type(OutputSettlerSimple).creationCode, hex"")); + } function run( string[] calldata chains - ) public returns (InputSettlerCompactLIFI compactSettler, InputSettlerEscrowLIFI escrowSettler) { + ) + public + returns ( + InputSettlerCompactLIFI compactSettler, + InputSettlerEscrowLIFI escrowSettler, + OutputSettlerSimple filler + ) + { return run(chains, getSender()); } function run( string[] calldata chains, address initialOwner - ) public returns (InputSettlerCompactLIFI compactSettler, InputSettlerEscrowLIFI escrowSettler) { - address expectedCompactSettlerAddress = getExpectedCreate2Address( - compactInputSettlerSalt, // salt - type(InputSettlerCompactLIFI).creationCode, - abi.encode(COMPACT, initialOwner) - ); - address expectedEscrowSettlerAddress = getExpectedCreate2Address( - escrowInputSettlerSalt, // salt - type(InputSettlerEscrowLIFI).creationCode, - abi.encode(initialOwner) - ); - return run(chains, initialOwner, expectedCompactSettlerAddress, expectedEscrowSettlerAddress); - } - - function run( - string[] calldata chains, - address initialOwner, - address expectedCompactSettlerAddress, - address expectedEscrowSettlerAddress ) public iter_chains(chains) broadcast - returns (InputSettlerCompactLIFI compactSettler, InputSettlerEscrowLIFI escrowSettler) + returns ( + InputSettlerCompactLIFI compactSettler, + InputSettlerEscrowLIFI escrowSettler, + OutputSettlerSimple filler + ) { deployCompact(); - compactSettler = deployCompactSettler(initialOwner, expectedCompactSettlerAddress); - escrowSettler = deployEscrowSettler(initialOwner, expectedEscrowSettlerAddress); + compactSettler = deployCompactSettler(initialOwner); + escrowSettler = deployEscrowSettler(initialOwner); - deployOutputSettlerSimple(); - deployAlwaysOkAllocaor(); - deployAlwaysYesOracle(); + filler = deployOutputSettlerSimple(); } function deployCompactSettler( - address initialOwner, - address expectedSettlerAddress + address initialOwner ) internal returns (InputSettlerCompactLIFI settler) { + address expectedSettlerAddress = getExpectedCreate2Address( + compactInputSettlerSalt, // salt + type(InputSettlerCompactLIFI).creationCode, + abi.encode(COMPACT, initialOwner) + ); bool isSettlerDeployed = address(expectedSettlerAddress).code.length != 0; if (!isSettlerDeployed) { @@ -97,9 +108,13 @@ contract deploy is multichain { } function deployEscrowSettler( - address initialOwner, - address expectedSettlerAddress + address initialOwner ) internal returns (InputSettlerEscrowLIFI settler) { + address expectedSettlerAddress = getExpectedCreate2Address( + escrowInputSettlerSalt, // salt + type(InputSettlerEscrowLIFI).creationCode, + abi.encode(initialOwner) + ); bool isSettlerDeployed = address(expectedSettlerAddress).code.length != 0; if (!isSettlerDeployed) { @@ -138,43 +153,6 @@ contract deploy is multichain { return OutputSettlerSimple(expectedAddress); } - function deployAlwaysOkAllocaor() internal returns (AlwaysOKAllocator allocator, uint96 allocatorId) { - address expectedAddress = getExpectedCreate2Address( - bytes32(uint256(0)), // salt - type(AlwaysOKAllocator).creationCode, - hex"" - ); - bool isAllocatorDeployed = address(expectedAddress).code.length != 0; - - if (!isAllocatorDeployed) allocator = new AlwaysOKAllocator{ salt: bytes32(uint256(0)) }(); - else allocator = AlwaysOKAllocator(expectedAddress); - - allocatorId = IdLib.toAllocatorId(address(allocator)); - - bytes32 storageSlotKey; - assembly { - storageSlotKey := or(_ALLOCATOR_BY_ALLOCATOR_ID_SLOT_SEED, allocatorId) - } - - bytes32 storageSlotValue = vm.load(COMPACT, storageSlotKey); - if (storageSlotValue == bytes32(0)) { - uint96 registeredAllocatorId = TheCompact(COMPACT).__registerAllocator(address(allocator), ""); - assert(registeredAllocatorId == allocatorId); - } - } - - function deployAlwaysYesOracle() internal returns (AlwaysYesOracle oracle) { - address expectedAddress = getExpectedCreate2Address( - bytes32(uint256(0)), // salt - type(AlwaysYesOracle).creationCode, - hex"" - ); - bool isOracleDeployed = address(expectedAddress).code.length != 0; - - if (!isOracleDeployed) return oracle = new AlwaysYesOracle{ salt: bytes32(uint256(0)) }(); - return AlwaysYesOracle(expectedAddress); - } - bytes constant COMPACT_INIT = hex"610140604052346101bb57696002601e613d5c3d52f35f52600a60165ff08060601b156101ac575f80808084600a5a04fa60a0526080524660c05260a06040517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81527f5e6f7b4e1ac3d625bac418bc955510b3e054cb6cc23cc27885107f080180b29260208201527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660408201524660608201523060808201522060e052604051614d7380820182811060018060401b03821117610198578291615d2e833903905ff01561018d576e22d473030f116ddee9f6b43ac78ba33b151561010052604051610ea48082016001600160401b0381118382101761019857829161aaa1833903905ff0801561018d576001600160a01b031661012052604051615b6e90816101c082396080518161189f015260a051818181611875015281816141d50152614f5e015260c05181613d3c015260e05181613d1b015261010051816150bd0152610120518161199b0152f35b6040513d5f823e3d90fd5b634e487b7160e01b5f52604160045260245ffd5b632aea588760e01b5f5260045ffd5b5f80fdfe60806040526004361015610011575f80fd5b5f3560e01c8062ad800c146136e2578062fdd58e1461368857806301aaa5d81461363b57806301ffc9a7146135c1578063054ab40b1461338c57806306ef7267146132af57806306fdde0314613267578063095bcdb6146131c757806312d4888514613036578063144bd5b514612fbd578063164e131514612e855780631b0196d414612d2c5780631e2eaeaf14612cf25780632a9c4d0d14612a705780632e3ff2f71461294e5780632ea8433c146127e45780632f926732146127a65780633644e5151461276e5780633ddf74001461270e5780633f47e662146126cf578063426a84931461266b578063456b7d0c1461260457806345ebe2181461246657806347c96396146123e15780634a6bf993146120f35780634e41a1fb146120b457806351d35ee114611fc9578063558a729714611f3657806355dc8cfc14611d75578063598af9e714611d0b5780635b15bfd914611c195780636428cb59146119dc5780636d2388651461196557806370030190146118ea5780637423eb3c146118415780637c0ce006146117745780637e2480ab146114e05780638f3994de146114095780638fa31b58146113915780639816962f1461127f578063a38cc1621461121b578063b6363cf2146111b8578063ba377eb414611173578063bf38c9bd1461112b578063c0587a87146110b7578063c42f38e114610d9d578063c87b56dd14610d5e578063cbb6857a14610c13578063d14de84a14610abe578063da2f268b14610a57578063dbd035ff146109c1578063e1950ef51461085f578063e7fd251e146107a9578063e9626d0c1461052c578063eb35a6d21461049b578063f135baaa14610461578063f2d67062146103eb5763fe99049a14610295575f80fd5b60807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103e7576102c7613720565b6102cf613766565b9060443591606435906102e482858386613a76565b67edcaa89a822939406034528260285233601452603460202054156103ae575b83601452604060142080548084116103a157839003905580602852836014526040601420908154928084019384106103945773ffffffffffffffffffffffffffffffffffffffff93849355335f526020521691167f1b3d7edb2e9c0b0e7c525b20aaaef0f5940d2ed71663c7d39266ecafac72885960405fa45f603452610389614f5c565b602060405160018152f35b6389560ca15f526004601cfd5b63f4d678b85f526004601cfd5b835f5260545f208054600181016103c7575b5050610304565b8084116103da5783900390555f806103c0565b63deda90305f526004601cfd5b5f80fd5b60e07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103e757604061041f613720565b61045561042a6137fe565b61043c83610436613789565b92613a32565b9260c4359160a435916084359160643591873491614041565b82519182526020820152f35b346103e75760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103e7576004355c5f5260205ff35b346103e75760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103e757602060043561052462ffffff77278d00094890015180000f3c00025800003c00000f000001601860078560fc1c16021c164201828161051e8195336014526341d0e04b5f526034526038601c20905f603452565b55614f2b565b604051908152f35b60e07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103e75761055e613720565b60243567ffffffffffffffff81116103e75761057e90369060040161391a565b91610587613789565b9060a435906105946141d3565b8015330218916105a385613e36565b9380358060601b1560208301353414158116341582141788151761079c576bffffffffffffffffffffffff906b0fffffffffffffffffffffff8360a01c1692816105ec856142fd565b61077f575b509116905b878110610711575050610607614f5c565b604051907ffb7744571d97aa61eb9c2bc3c67b9b1ba047ac9e95afb2ef02bc5b3d9e64fbe58252602082015f906040840190602c85019160608601935b8b81106106e15750505050505060806106c194959660051b9101206040519183835260208301528460408301526064356060830152608435608083015260a082015260c43560c08201527f179fcd593ea3b4b32623a455fb55eb007c5040f4c85774f2e3f18d98e87eb76b82141560051b60c00190208093614160565b6106dd604051928392835260406020840152604083019061394b565b0390f35b8060019160061b87013580855283525f85528b60208260051b809201015187526080808a20918a01015201610644565b61071c818985613e7b565b90813591836b0fffffffffffffffffffffff8460a01c1603610772576001926020610761920135908973ffffffffffffffffffffffffffffffffffffffff8216614a68565b61076b828a613d05565b52016105f6565b63af3463065f526004601cfd5b61078b903490896140f3565b3461079589613cf8565b52896105f1565b63ca0fc08e5f526004601cfd5b346103e7576101207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103e7576107e1613720565b6107e9613766565b906044357fffffffffffffffffffffffff0000000000000000000000000000000000000000811681036103e75761084d61083283606095610828613743565b9460643591613de9565b929093610104359160e4359160c43591868860a43593614041565b60405192835260208301526040820152f35b346103e7577ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360161010081126103e7576080136103e75761089f613743565b506108a861382d565b506108b16137ac565b60e4359067ffffffffffffffff82116103e7576109b861099d916108db60209436906004016138ec565b916108e46139ee565b6109b33615946108f660a48717614d8e565b9461090084614379565b9b839c9a939991929a60607f63697069656e7429546f6b656e5065726d697373696f6e73286164647265737391607681527f436f6d706163744465706f736974207769746e65737329436f6d70616374446560208201527f706f7369742862797465733132206c6f636b5461672c6164647265737320726560408201527520746f6b656e2c75696e7432353620616d6f756e742960768201520152565b6101008201526101406101e083179217906148ee565b614947565b50610524614f5c565b346103e75760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103e75760043567ffffffffffffffff81116103e757610a109036906004016138bb565b6040519160408360208152836020820152019160051b83019060206040830191935b843554815201928482851015610a4e5750602080910193610a32565b60408185030190f35b346103e75760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103e7576020600435610a93613766565b906040519183526303f37b1a600c52806040526001603760282054918360405260ff161b1615158152f35b346103e75760e07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103e757600435610af8613766565b60c43567ffffffffffffffff81116103e757602092610b1e6105249236906004016138ec565b93610c0e610bad60a43560a090604051907f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f82527f5e6f7b4e1ac3d625bac418bc955510b3e054cb6cc23cc27885107f080180b29260208301527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc6604083015260608201523060808201522090565b6040517f179fcd593ea3b4b32623a455fb55eb007c5040f4c85774f2e3f18d98e87eb76b86147f73b631296de001508966ddfc334593ad8f850ccd3be4d2c58a9ed469844eebc787141760051b60a0039081600482372096879484866153ae565b614160565b346103e75760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103e75760043567ffffffffffffffff81116103e75780600401906101207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc82360301126103e757610d56602092610c946141d3565b60a0610cac610ca660e4860184613fad565b90615443565b9360546050610d11610cbd86615520565b9890879060a07fc3e0b49b35866f940704f2fb568b9d5dae17a245971e2c095778b60ea177f03b9260405194838652336020870152466040870152606086015201356080840152141560051b608001902090565b926040519384525f6004610104830135830101803560051b808c8801928d0183378b01862060808701528986525201602c8301372092610d4f613d19565b9184614e3b565b610524614f5c565b346103e75760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103e757600435630e89341c3615176140be565b346103e757610dab3661397e565b610db36141d3565b60e0810190610dc5610ca68383613fad565b610e25610dd183615520565b9290849060a07fc3e0b49b35866f940704f2fb568b9d5dae17a245971e2c095778b60ea177f03b9260405194838652336020870152466040870152606086015201356080840152141560051b608001902090565b6040516101008401358401803560051b9261012086013560051b905f925f5b86811061108857505050501561107b5760a091602001812060808201528281525f60208201526054604c8501602c8301372092610f0561014084013560a090604051907f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f82527f5e6f7b4e1ac3d625bac418bc955510b3e054cb6cc23cc27885107f080180b29260208301527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc6604083015260608201523060808201522090565b92610f0e613d19565b913581019182602001923593841561105357610f2a8585614dc2565b95863592610f7d826b0fffffffffffffffffffffff8660a01c1695610f4e8a613c36565b9a6020610f59613b2d565b9183835201356020820152610f6d8c613cf8565b52610f778b613cf8565b506158ec565b60015b888110610fef5750610fe257610f989488948a614fae565b935f5b8451811015610fd75780610fd1610fb56001938787614dfb565b88610fc36040830183613ca4565b602084013593359291615028565b01610f9b565b602082610524614f5c565b633a03d3bb5f526004601cfd5b80610ffd6001928b8b614dfb565b92602084359161100d88846158ec565b8a6b0fffffffffffffffffffffff8560a01c16141517179461102d613b2d565b92835201356020820152611041828d613d05565b5261104c818c613d05565b5001610f80565b7fcfbccf0c000000000000000000000000000000000000000000000000000000005f5260045ffd5b6371515b9a5f526004601cfd5b80860160208284010135868201528482146110a7575b50602001610e44565b602090810184905294508461109e565b346103e75760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103e75760206111206110f3613720565b6044359060243590605892601c926040519260148401526368a30dd0835260348301526054820152012090565b546040519015158152f35b346103e7575f7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103e757604063655e83a85463824664ed5482519182526020820152f35b60407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103e75760206105246111aa6137cf565b6111b2613766565b90613a32565b346103e75760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103e7576111ef613720565b6111f7613766565b9067edcaa89a822939406020526014525f5260206034600c20546040519015158152f35b346103e75760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103e75760043567ffffffffffffffff81116103e75761127561126f602092369060040161391a565b90614d58565b6040519015158152f35b346103e75760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103e75760206112b86137cf565b6112d26b0fffffffffffffffffffffff8260a01c166142fd565b6112f08133601452632d5c707e5f526034526024601c20905f603452565b9062ffffff77278d00094890015180000f3c00025800003c00000f000001601860078460fc1c16021c16420191805473ffffffffffffffffffffffffffffffffffffffff7fffffffffffffffffffffffff0000000000000000000000000000000000000000808660a01b16169116179055815f52337f16c05a1aea0a2659b53f72fda6b47106e4aa07338b16993a01ece024df9d8cc4845fa3604051908152f35b346103e75760807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103e7576113c8613720565b6113d06137fe565b60643573ffffffffffffffffffffffffffffffffffffffff811681036103e7576020926114009260443591613de9565b50604051908152f35b346103e7576101007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103e757600435611444613766565b5061144d613789565b60e43567ffffffffffffffff81116103e7576020926114736105249236906004016138ec565b93610c0e61147f613d19565b6040517f179fcd593ea3b4b32623a455fb55eb007c5040f4c85774f2e3f18d98e87eb76b86147f73b631296de001508966ddfc334593ad8f850ccd3be4d2c58a9ed469844eebc787141760051b60e0039081600482372096879484866153ae565b346103e75760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103e75760043567ffffffffffffffff81116103e757806004016101a07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc83360301126103e75761155a6141d3565b611563816154d2565b916115c461157083615520565b9490849060a07fc3e0b49b35866f940704f2fb568b9d5dae17a245971e2c095778b60ea177f03b9260405194838652336020870152466040870152606086015201356080840152141560051b608001902090565b6040516004610144840135840101803560051b9261016485013560051b905f925f5b86811061174557505050501561107b5760a091602001812060808201528481525f6020820152605460508401602c83013720916116a761018483013560a090604051907f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f82527f5e6f7b4e1ac3d625bac418bc955510b3e054cb6cc23cc27885107f080180b29260208301527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc6604083015260608201523060808201522090565b906117136116b3613d19565b9160e485013596846004610104880135976101248101350101946116d5613bd6565b936116de613b2d565b8b81528960208201526116f086613cf8565b526116fa85613cf8565b506b0fffffffffffffffffffffff8b60a01c168a614fae565b918560ff1c15901517156117345793610d5692918560209635908701615028565b8463a06356f55f526020526024601cfd5b8086016020828401013586820152848214611764575b506020016115e6565b602090810184905294508461175b565b346103e75760206117843661397e565b61178c6141d3565b610d56611798826154d2565b9160a06117fb6117a783615520565b9590849060a07fc3e0b49b35866f940704f2fb568b9d5dae17a245971e2c095778b60ea177f03b9260405194838652336020870152466040870152606086015201356080840152141560051b608001902090565b6040519081525f6101408401358401803560051b80898501928a018337880183206080840152868352526054604c8401602c830137209261183a613d19565b918461426b565b346103e7575f7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103e7575f5415157f0000000000000000000000000000000000000000000000000000000000000000176118dd575f8080807f0000000000000000000000000000000000000000000000000000000000000000600a5a04fa156118d057436001015f55005b6370a4078f5f526004601cfd5b63f45b98b05f526004601cfd5b346103e75760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103e75760043561193a81336014526341d0e04b5f526034526038601c20905f603452565b80541561195057905f6103899255361590614f2b565b5063e632dbad5f52336020526040526044601cfd5b60207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103e757365f803760405f3681347f00000000000000000000000000000000000000000000000000000000000000005af1156119d4575f5163655e83a85560205163824664ed55005b3d5f803e3d5ffd5b346103e75760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103e75760043567ffffffffffffffff81116103e75780600401906101007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc82360301126103e757611a576141d3565b611a67610ca660e4830184613fad565b9060c4810135810190600482013592602484159301918460a9019260a4605083019201359360405195611ba6577f4261746368436f6d70616374286164647265737320617262697465722c616464865260208601967f726573732073706f6e736f722c75696e74323536206e6f6e63652c75696e743288528060408801937f353620657870697265732c4c6f636b5b5d20636f6d6d69746d656e74732c4d618552606089017f6e64617465206d616e64617465294c6f636b2862797465733132206c6f636b54905260888901674d616e64617465289052608089017f61672c6164647265737320746f6b656e2c75696e7432353620616d6f756e7429905260a8890137860160a801602990538520808652339096525f9052605490604c85013760a083015260c082015260e0902090602092610d56915b610d4f613d19565b5050602095945060c0925090605484927f179fcd593ea3b4b32623a455fb55eb007c5040f4c85774f2e3f18d98e87eb76b610d56965233888501525f6040850152604c84013760a082015220917f179fcd593ea3b4b32623a455fb55eb007c5040f4c85774f2e3f18d98e87eb76b611b9e565b346103e75760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103e757600435611c656b0fffffffffffffffffffffff8260a01c1661496c565b60078260fc1c168260ff1c9073ffffffffffffffffffffffffffffffffffffffff6040519381861685521660208401526008811015611cde5760408301526002811015611cde5760a0927fffffffffffffffffffffffff0000000000000000000000000000000000000000916060840152166080820152f35b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b346103e75760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103e757611d42613720565b611d4a613766565b9067edcaa89a822939406034526028526014526044355f52602060545f20545f603452604051908152f35b60e07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103e757611da7613720565b5060243567ffffffffffffffff81116103e757611dc890369060040161391a565b60607fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbc3601126103e75760a4359173ffffffffffffffffffffffffffffffffffffffff831683036103e75760c4359067ffffffffffffffff82116103e7576106dd93611f1c611e3e611f229436906004016138ec565b959093611e4c848383614ae2565b9592611f0860c09b9399929b361592611e6760848517614d8e565b611e718d83614c34565b94909460607f63697069656e7429546f6b656e5065726d697373696f6e73286164647265737391607681527f436f6d706163744465706f736974207769746e65737329436f6d70616374446560208201527f706f7369742862797465733132206c6f636b5461672c6164647265737320726560408201527520746f6b656e2c75696e7432353620616d6f756e742960768201520152565b608084015260071b610200019217906148ee565b86614ce3565b60405191829160208352602083019061394b565b60407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103e757611f68613720565b602435908115158092036103e75767edcaa89a82293940602052336014525f52806034600c2055602052600c5160601c337fceb576d9f15e4e200fdb5096d64d5dfd667e16def20c1eefd14256d8e3faa267602080a3602060405160018152f35b346103e7576101407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103e757600435612004613766565b5061200d613789565b61201561382d565b5061201e6137ac565b506101243567ffffffffffffffff81116103e7576020926120466105249236906004016138ec565b93610c0e612052613d19565b6040517f179fcd593ea3b4b32623a455fb55eb007c5040f4c85774f2e3f18d98e87eb76b86147f73b631296de001508966ddfc334593ad8f850ccd3be4d2c58a9ed469844eebc787141760051b610120039081600482372096879484866153ae565b346103e75760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103e757600435634e41a1fb3615176140be565b346103e75760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103e75760043567ffffffffffffffff81116103e7578060040160807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc83360301126103e75761216c6141d3565b606482019061217b8282613fad565b939061218685613c36565b945f5b8181106123955750505061219d8383613fad565b6121d981604051917ffb7744571d97aa61eb9c2bc3c67b9b1ba047ac9e95afb2ef02bc5b3d9e64fbe5835260808084019260051b840101604052565b92906020810160608201602c8301604084015f5b878110612352578c8c8c8c60c08d8d60051b9020604051907f179fcd593ea3b4b32623a455fb55eb007c5040f4c85774f2e3f18d98e87eb76b825233602083015233604083015260446024850135948560608501520135608083015260a0820152209361225a8484613fad565b9081159182610fe25781357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc1833603018112156103e7576b0fffffffffffffffffffffff90839293013560a01c166122bb6122b48261496c565b809761432d565b6001925b8084106123205750505050610fe257826122dc926122e1966149d5565b613fad565b905f5b8281106122f357610389614f5c565b8061231a6123046001938686614001565b6123116020820182613ca4565b90913591615378565b016122e4565b90919293600190836b0fffffffffffffffffffffff612340888689614001565b3560a01c1614151794019291906122bf565b806123606001928a8a614001565b6123796123738235926020810190613ca4565b9061498f565b9080885284525f85528552608087208160051b8b0152016121ed565b806123a36001928486614001565b6123c06123736123b1613b2d565b92803584526020810190613ca4565b60208201526123cf828a613d05565b526123da8189613d05565b5001612189565b60407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103e75760043567ffffffffffffffff81116103e75761242b90369060040161391a565b906024359067ffffffffffffffff82116103e75760209261246061245661127594369060040161391a565b9390923391613e8b565b50614d58565b6101207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103e757612499613720565b60243567ffffffffffffffff81116103e7576124b990369060040161391a565b60607fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbc9392933601126103e75760a43560c4359360038510156103e75760e43567ffffffffffffffff81116103e7576125169036906004016138ec565b93610104359067ffffffffffffffff82116103e757869161253b9036906004016138ec565b919098612549848388614ae2565b959281809e9399925160051b90602001209b6125658a83614c34565b90968236159560018717926125799461441d565b9d604051915f52336020526040528c60605260805f2060808801526040525f60605280151501610153017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169060071b01610180019060c0176125db946148ee565b6125e59489614ce3565b6125ee92614160565b604051809160208252602082016106dd9161394b565b60407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103e75760043567ffffffffffffffff81116103e75761265161265f91369060040161391a565b612659613766565b91613e8b565b50602060405160018152f35b61267436613866565b909167edcaa89a8229394060345233602852601452815f528060545f20555f5260205160601c337fb3fd5071835887567a0671151121894ddccc2842f1d10bedad13e0d17cace9a760205fa45f603452602060405160018152f35b346103e75760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103e757600435633f47e6623615176140be565b346103e75760a07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103e757602061275e61274a613720565b6127526137fe565b90339160443591613de9565b5061052460843560643533614160565b346103e7575f7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103e7576020610524613d19565b346103e75760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103e75761038960243560043533614160565b346103e75760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103e75760043567ffffffffffffffff81116103e757806004019060a07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc82360301126103e757612940612946926128656141d3565b61286d613bd6565b9061293b612879613b2d565b928260648701359687865260848101956128966123738885613ca4565b60208201526128a484613cf8565b526128ae83613cf8565b506101006128bf6123738885613ca4565b916024604051917f73b631296de001508966ddfc334593ad8f850ccd3be4d2c58a9ed469844eebc783523360208401523360408401520192604c8460608401378a60c08301525f60ac83015260e08201522061293661292e6b0fffffffffffffffffffffff8b60a01c1661496c565b80933561432d565b6149d5565b613ca4565b90615378565b610389614f5c565b346103e75760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103e757600435612988613766565b604435906129aa83336014526341d0e04b5f526034526038601c20905f603452565b54428111901517612a5f576129bd6141d3565b33811502188173ffffffffffffffffffffffffffffffffffffffff841680612a065750905f80809338935af15b156129f9576129469133615188565b63580d4e5e5f526004601cfd5b919250612a13308361508d565b926014526034526fa9059cbb0000000000000000000000005f52612a5060205f6044601082865af13d1560015f51141716915f603452309061508d565b908282101691038102906129ea565b82639287bcb05f526020526024601cfd5b346103e75760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103e757612aa7613720565b60243567ffffffffffffffff81116103e757612adc73ffffffffffffffffffffffffffffffffffffffff9136906004016138ec565b9190921691823b15158333141790605583149283612c69575b50501715612c5957612be0816b0f0000000000000000000000690fedcba98765432100007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc607f6affffffffffffffffffffff687fffffffffffffffff8660591c1668ffffffffffffffffff8760581c16178060021c178060041c178060081c178060101c178060201c178060401c176755555555555555558160011c169003673333333333333333808260021c169116018060041c01670f0f0f0f0f0f0f0f660f0f0f0f0f0f0f8260081c169116018060101c019516948060201c0116604803161c60581b161790565b8073044036fc77deaed23000000000000000000000001791825480612c4557508060209355815f5282527fc54dcaa67a8fd7b4a9aa6fd57351934c792613d5ec1acbd65274270e6de8f7e460405fa16bffffffffffffffffffffffff60405191168152f35b8263c18b0e975f526020526040526044601cfd5b634e7f492b5f526020526024601cfd5b809192935015612cc5577fff0000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff8282938560405137604051201685149235161416908380612af5565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b346103e75760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103e757600435545f5260205ff35b346103e75760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103e757612d636137cf565b612d6b613766565b9073ffffffffffffffffffffffffffffffffffffffff612d9b6b0fffffffffffffffffffffff8360a01c1661496c565b83821691168114612e7857612dc48233601452632d5c707e5f526034526024601c20905f603452565b9081548060a01c42811173ffffffffffffffffffffffffffffffffffffffff8316151516612e68575081612e285750505f90555b337f92de0e90f030663724bafa9b7a9ba2643e3f4ced55f1cfee8b01e2682aeb45fd5f80a4602060405160018152f35b5073ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffff0000000000000000000000000000000000000000179055612df8565b63174f07765f526020526024601cfd5b632411f3105f526004601cfd5b346103e7577ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360161014081126103e7576080136103e757612ec5613743565b612ecd61382d565b5060c43590600360e43510156103e7576101043567ffffffffffffffff81116103e757612efe9036906004016138ec565b610124359367ffffffffffffffff85116103e75783612fb7612f5b610d5695612f2d60209936906004016138ec565b6109b3612f3b9a929a6139ee565b91612f4583614379565b839f93989299919d361593849260e4359061441d565b9c90604051905f5233602052886040528c60605260805f206101008301526040525f6060526101407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe061017f61016084015101169217906148ee565b50614160565b346103e75760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103e7576040613016612ff9613720565b602435906014526341d0e04b5f526034526038601c20905f603452565b548151908015154282116002030261302d8161385c565b82526020820152f35b346103e75760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103e75760043567ffffffffffffffff81116103e7576130859036906004016138bb565b9061317161316c336b0f0000000000000000000000690fedcba98765432100007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc607f6affffffffffffffffffffff687fffffffffffffffff8660591c1668ffffffffffffffffff8760581c16178060021c178060041c178060081c178060101c178060201c178060401c176755555555555555558160011c169003673333333333333333808260021c169116018060041c01670f0f0f0f0f0f0f0f660f0f0f0f0f0f0f8260081c169116018060101c019516948060201c0116604803161c60581b161790565b6142fd565b809160051b01905b81811061318b57602060405160018152f35b806020913561319a338261432d565b5f52337f378325bc73c84116a385ff3c287be7229f0aa047254a780befebba0fc966216e835fa201613179565b6131d036613866565b90916131de82848333613a76565b67edcaa89a8229394060205233601452825f5260405f2080548084116103a157839003905580601452825f5260405f209182548181019081106103945773ffffffffffffffffffffffffffffffffffffffff9355335f5260205216337f1b3d7edb2e9c0b0e7c525b20aaaef0f5940d2ed71663c7d39266ecafac72885960405fa4610389614f5c565b346103e7575f7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103e757602080526b0b54686520436f6d70616374604b5260606020f35b346103e75760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103e75760606133276132eb613720565b6132f36137fe565b9061330e6b0fffffffffffffffffffffff8360a01c166142fd565b601452632d5c707e5f526034526024601c20905f603452565b5473ffffffffffffffffffffffffffffffffffffffff8160a01c911680155f14613369575f915b6040519261335b8161385c565b835260208301526040820152f35b6bffffffffffffffffffffffff82036133845760029161334e565b60019161334e565b346103e75760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103e75760043567ffffffffffffffff81116103e7576101407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc82360301126103e7576134026141d3565b60c4810135810160048101359060248215910182608c01906050850160e48601359060f087019260a4880135946040519661353f577f436f6d70616374286164647265737320617262697465722c6164647265737320875260208701977f73706f6e736f722c75696e74323536206e6f6e63652c75696e7432353620657889528060408901937f70697265732c62797465733132206c6f636b5461672c6164647265737320746f8552606b8a016a7465294d616e6461746528905260608a017f6b656e2c75696e7432353620616d6f756e742c4d616e64617465206d616e64619052608b8a01378701608b01602990538620808752339097525f9052605490604c86013760a08401525f60ac84015260349060cc840137610100820152610120902090602092610d56915b613535613d19565b916004018461426b565b50506020969550610100935091603491605486947f73b631296de001508966ddfc334593ad8f850ccd3be4d2c58a9ed469844eebc7610d569852338a8701525f6040870152604c86013760a08401525f60ac84015260cc83013720917f73b631296de001508966ddfc334593ad8f850ccd3be4d2c58a9ed469844eebc761352d565b346103e75760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103e7576004357fffffffff00000000000000000000000000000000000000000000000000000000811681036103e75760209060e01c604051906301ffc9a7630f632fb3821491141715158152f35b60607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103e75760206136796136726137cf565b3390613a32565b61052460443560243533614160565b346103e75760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103e7576136bf613720565b67edcaa89a822939406020526014526024355f52602060405f2054604051908152f35b346103e75760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103e75760043562ad800c3615176140be565b6004359073ffffffffffffffffffffffffffffffffffffffff821682036103e757565b6084359073ffffffffffffffffffffffffffffffffffffffff821682036103e757565b6024359073ffffffffffffffffffffffffffffffffffffffff821682036103e757565b6044359073ffffffffffffffffffffffffffffffffffffffff821682036103e757565b60c4359073ffffffffffffffffffffffffffffffffffffffff821682036103e757565b600435907fffffffffffffffffffffffff0000000000000000000000000000000000000000821682036103e757565b602435907fffffffffffffffffffffffff0000000000000000000000000000000000000000821682036103e757565b60a435907fffffffffffffffffffffffff0000000000000000000000000000000000000000821682036103e757565b60031115611cde57565b7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc60609101126103e75760043573ffffffffffffffffffffffffffffffffffffffff811681036103e757906024359060443590565b9181601f840112156103e75782359167ffffffffffffffff83116103e7576020808501948460051b0101116103e757565b9181601f840112156103e75782359167ffffffffffffffff83116103e757602083818601950101116103e757565b9181601f840112156103e75782359167ffffffffffffffff83116103e7576020808501948460061b0101116103e757565b90602080835192838152019201905f5b8181106139685750505090565b825184526020938401939092019160010161395b565b60207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8201126103e7576004359067ffffffffffffffff82116103e7577ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc82610160920301126103e75760040190565b60043573ffffffffffffffffffffffffffffffffffffffff811681036103e75790565b3573ffffffffffffffffffffffffffffffffffffffff811681036103e75790565b919091613a4f6b0fffffffffffffffffffffff8260a01c166142fd565b80923415613a6957613a6791349180153302186140f3565b565b63426d8dcf5f526004601cfd5b60a45f918260209473ffffffffffffffffffffffffffffffffffffffff97631a808f9197613aa26141d3565b89613abd6b0fffffffffffffffffffffff8360a01c1661496c565b936040519b8c97878052601c89019c8d99528d8c339101521660408d01521660608b015260808a015260a08901525af17f1a808f91000000000000000000000000000000000000000000000000000000005f5103613b1a57505050565b3d1517156119d45763014c931060a49252fd5b604051906040820182811067ffffffffffffffff821117613b4d57604052565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f604051930116820182811067ffffffffffffffff821117613b4d57604052565b67ffffffffffffffff8111613b4d5760051b60200190565b604090613be282613b7a565b60018152917fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001825f5b828110613c1857505050565b6020906040613c2681613b7a565b9036823782828501015201613c0c565b90613c48613c4383613bbe565b613b7a565b8281527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0613c768294613bbe565b01905f5b828110613c8657505050565b6020906040613c9481613b7a565b9036823782828501015201613c7a565b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1813603018212156103e7570180359067ffffffffffffffff82116103e757602001918160061b360383136103e757565b805115612cc55760200190565b8051821015612cc55760209160051b010190565b7f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000004618613d645790565b5060a06040517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81527f5e6f7b4e1ac3d625bac418bc955510b3e054cb6cc23cc27885107f080180b29260208201527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660408201524660608201523060808201522090565b9392613e2b9291613df986614a4e565b90613e146b0fffffffffffffffffffffff8260a01c166142fd565b17948591613e206141d3565b801533021890614a68565b613e33614f5c565b90565b90613e43613c4383613bbe565b8281527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0613e718294613bbe565b0190602036910137565b9190811015612cc55760061b0190565b909291613e966141d3565b8015330218613ea484613e36565b938235908160601b159160208501353414158316341584141782151761079c57806b0fffffffffffffffffffffff849260a01c16613ee1816142fd565b93613f90575b505b818110613efd575050505050613a67614f5c565b613f08818387613e7b565b8035906b0fffffffffffffffffffffff8260a01c166bffffffffffffffffffffffff86168103613f6f575b50600192916020613f5e920135908773ffffffffffffffffffffffffffffffffffffffff8216614a68565b613f68828a613d05565b5201613ee9565b613f5e91955091602083613f85600196956142fd565b969250509192613f33565b613f9c903490866140f3565b34613fa688613cf8565b525f613ee7565b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1813603018212156103e7570180359067ffffffffffffffff82116103e757602001918160051b360383136103e757565b9190811015612cc55760051b810135907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc1813603018212156103e7570190565b94613a6796959897939498801533021898604051958787526020870152896040870152606086015260808501528060a085015260c08401525f60ac84015260e08301526101008201527f73b631296de001508966ddfc334593ad8f850ccd3be4d2c58a9ed469844eebc782141560051b6101000190208094614160565b6024601c5f939284933060145261d694855260026034536017601e209185526020525afa3d5f803e156140ef573d5ff35b3d5ffd5b91909167edcaa89a8229394060205280601452825f5260405f209182548181019081106103945773ffffffffffffffffffffffffffffffffffffffff9355335f52602052165f7f1b3d7edb2e9c0b0e7c525b20aaaef0f5940d2ed71663c7d39266ecafac728859604082a4565b909173ffffffffffffffffffffffffffffffffffffffff9260016141a5838386605892601c926040519260148401526368a30dd0835260348301526054820152012090565b555f52602052167f52dd3aeaf9d70bfcfdd63526e155ba1eea436e7851acf5c950299321c671b92760405fa2565b7f00000000000000000000000000000000000000000000000000000000000000001568929eee149b4bd212685c8161424d575b6001811161423d5750614222575b3368929eee149b4bd212685d565b5f5443811190151715614214573368929eee149b4bd2126855565b63f57c448b5f526020526024601cfd5b5f5443811190151715614206575068929eee149b4bd2126854614206565b610120820135820194936101008301359360e0840135936142cf93925f91614291613bd6565b9461429a613b2d565b8881528960208201526142ac87613cf8565b526142b686613cf8565b506b0fffffffffffffffffffffff8860a01c1690614fae565b8160ff1c15600117156142ec5784613a6794953590602001615028565b5063a06356f55f526020526024601cfd5b8073044036fc77deaed230000000000000000000000017541561431d5750565b63cf90c3a85f526020526024601cfd5b604051916020526303f37b1a600c5280604052603760282090600182549160ff161b9080821661435f57179055604052565b6fdbc205b1000000000000000000000000600c526044601cfd5b906143826141d3565b6143d760a4357fffffffffffffffffffffffff00000000000000000000000000000000000000006143b285614a4e565b916143cd6b0fffffffffffffffffffffff8260a01c166142fd565b161792309061508d565b906040519065ffffffffffff60405263137c29fe82526080600460208401373060a083015260243560c083015260843560e0830152610140610120830152610160820190565b94935f9384939092918490156020890181614899575b8615614830575b505f93801561476b575b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff810115614669575b841561465c5785156144d7575050509181818694600196943701956e75696e7432353620616d6f756e7429600f8801527f29546f6b656e5065726d697373696f6e73286164647265737320746f6b656e2c8752600f81880301905282818703019020940301902090565b9198945094507ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff692955083915060051b946e75696e7432353620616d6f756e7429838201527f29546f6b656e5065726d697373696f6e73286164647265737320746f6b656e2c7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe78201520301905261460c575b82156145bc575b7f73b631296de001508966ddfc334593ad8f850ccd3be4d2c58a9ed469844eebc75f527f179fcd593ea3b4b32623a455fb55eb007c5040f4c85774f2e3f18d98e87eb76b6020525190565b7f25686dcdaf36339365d8aad4b420a3460867a181238971ffae587b16c6d9660f5f527fa794ed1a28cdf297ac45a3eee4643e35d29b295a389368da5f6baa420872c9b760205280519250614571565b7f8b05b54b25c4a22095273abeb15e89077542cdca8be672282102c3473780942c5f527f5a6488a03f679efdf6390ea1cada208092f98514652ffa4036265fd48bcdbf4f6020528051925061456a565b63dae3f1085f526004601cfd5b9693507f4261746368436f6d7061637420636f6d70616374294261746368436f6d70616384527f74286164647265737320617262697465722c616464726573732073706f6e736f60208501526f2c4d616e64617465206d616e646174656062850152714c6f636b5b5d20636f6d6d69746d656e747360528501527f722c75696e74323536206e6f6e63652c75696e7432353620657870697265732c6040850152674d616e6461746528609d8501527f294c6f636b2862797465733132206c6f636b5461672c6164647265737320746f607286151560041b8601726b656e2c75696e7432353620616d6f756e742960858201520152601560bd850194019661446d565b7f436f6d7061637420636f6d7061637429436f6d7061637428616464726573732088527f617262697465722c616464726573732073706f6e736f722c75696e743235362060208901527f6e6f6e63652c75696e7432353620657870697265732c62797465733132206c6f60408901527a6e742c4d616e64617465206d616e64617465294d616e6461746528607b8901527f636b5461672c6164647265737320746f6b656e2c75696e7432353620616d6f7560608901526010880197609b019450614444565b7f426174636841637469766174696f6e207769746e657373294261746368416374905267365b5d206964732c60488a01527f69766174696f6e286164647265737320616374697661746f722c75696e74323560408a01526068890196506038890195505f61443a565b7a647265737320616374697661746f722c75696e743235362069642c603b8b01527f41637469766174696f6e207769746e6573732941637469766174696f6e2861648152605b8a01975060338a019650614433565b935f9281849395826148fe6150bb565b978901526040838901836020820152013701602401601c8501826e22d473030f116ddee9f6b43ac78ba35af1161561493557604052565b3d6119d457637f28c61e5f526004601cfd5b6149569094939294309061508d565b9182811015613a6957613a6792039384916140f3565b908173044036fc77deaed2300000000000000000000000175491821561431d5750565b5f92918391602081019160061b015b8082106149bf5750506149ad57565b634e487b715f5260116020526024601cfd5b909160409083359586019586101792019061499e565b60408301356020840135936149e9826151f9565b8035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1813603018212156103e7570180359067ffffffffffffffff82116103e75760200181360381136103e757613a6796614a489387338789615214565b3361532e565b8060601b15614a5a5790565b63961c9a4f6040526024605cfd5b9190614a74308461508d565b9260405194606052306040523360601b602c526f23b872dd000000000000000000000000600c5260205f6064601c82855af18060015f51141615614ac4575b50613e33945f606052604052614947565b3d823b15171015614ad5575f614ab3565b637939f4245f526004601cfd5b9192614aec6141d3565b823560601b159260208101353414158416341585141783151761079c57839260843595614b4c6b0fffffffffffffffffffffff7fffffffffffffffffffffffff000000000000000000000000000000000000000089169860a01c166142fd565b614b5582613e36565b94614c17575b5084810395614b6987613e36565b925f925f5b898110614b8d5750505050614b805790565b630f2f1e515f526004601cfd5b80614c038a600193979596970194614bae614ba987878a613e7b565b613a11565b9073ffffffffffffffffffffffffffffffffffffffff82167fffffffffffffffffffffffff00000000000000000000000000000000000000008a1617988911151797614bfb81978d613d05565b52309061508d565b614c0d8289613d05565b5201929192614b6e565b614c23908734916140f3565b85614c2d85613cf8565b525f614b5b565b91906040519265ffffffffffff604052610180808260061b8060448560071b9660061b6024350163fe8ec1a78a5260c060208b0152826101400160408b015260043560608b0152876101600160a08b0152606060e08b015281356101008b01526064356101208b0152866101408b015282602482016101608c0137828a0196610160880152016101a086013783010191015b818110614cd857505082016101800190565b308152604001614cc6565b83515f96909594939290875b878110614d0a575050505050505050613a6957613a67614f5c565b80614d5283600193019a614d2c8c614d27614ba930928c8b613e7b565b61508d565b90614d48614d3a858c613d05565b519183831015179d89613d05565b519103908a6140f3565b01614cef565b905f5b818110614d6a57505050600190565b80614d88614d7b6001938587613e7b565b6020810135903533614160565b01614d5b565b60609060408051917faced9f7c53bfda31d043cbef88f9ee23b8171ec904889af3d5d0b9b81914a404835260208301372090565b9015612cc5578035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa1813603018212156103e7570190565b9190811015612cc55760051b810135907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa1813603018212156103e7570190565b929060e081013581019182602001923593841561105357614e5c8585614dc2565b95863592614e805f6b0fffffffffffffffffffffff8660a01c1695610f4e8a613c36565b60015b888110614ec75750610fe257614e9c9488945f93614fae565b935f5b8451811015614ebf5780614eb9610fb56001938787614dfb565b01614e9f565b509350505050565b80614ed56001928b8b614dfb565b926020843591614ee55f846158ec565b8a6b0fffffffffffffffffffffff8560a01c161415171794614f05613b2d565b92835201356020820152614f19828d613d05565b52614f24818c613d05565b5001614e83565b908015155f52602052337fe27f5e0382cf5347965fc81d5c81cd141897fe9ce402d22c496b7c2ddc84e5fd60405fa3565b7f000000000000000000000000000000000000000000000000000000000000000015614f92575b600168929eee149b4bd212685d565b5f5443811190151715614f8357600168929eee149b4bd2126855565b919561502291613a6796989795949561500e604c82013560601c9a848c60608501359a8b9a614ff4614fed608089013599614fe88b6151f9565b61496c565b809d61432d565b60208701358701918115020191813591602001908b615902565b8035019182359260200191878b8789615214565b8561532e565b5f949385939192845b81811061505c57505050505082821017615049575050565b633078b2f65f526020526040526044601cfd5b8061508761507060019385899c9a9c613e7b565b9760208901358091019a818c1017983586886156a3565b01615031565b602460106020939284936014526f70a082310000000000000000000000005f525afa601f3d11166020510290565b7f00000000000000000000000000000000000000000000000000000000000000006150f6576e22d473030f116ddee9f6b43ac78ba33b151590565b600190565b91929067edcaa89a8229394060205282601452835f5260405f2080548084118415176103a157839003905580601452835f5260405f20908154928084019384106103945773ffffffffffffffffffffffffffffffffffffffff93849355335f526020521691167f1b3d7edb2e9c0b0e7c525b20aaaef0f5940d2ed71663c7d39266ecafac72885960405fa4565b909167edcaa89a8229394060205281601452825f5260405f20918254918281118115176103a1575f938173ffffffffffffffffffffffffffffffffffffffff94039055338452602052167f1b3d7edb2e9c0b0e7c525b20aaaef0f5940d2ed71663c7d39266ecafac728859604083a4565b428111156152045750565b63f80dbaea5f526020526024601cfd5b96949190939592956040519673ffffffffffffffffffffffffffffffffffffffff8451938460061b97637bb023f78b5260208b01523360408b0152166060890152608088015260a087015260e060c0870152610100840160e08701528061010087015260051b905f5b8281106153085750505082825f94601c936101408896602099018361012082015201378480520161012401910182855af17f7bb023f7000000000000000000000000000000000000000000000000000000005f51036152da575050565b3d1517156119d457632ce89d2a5f5273ffffffffffffffffffffffffffffffffffffffff166020526024601cfd5b8060209160011b880161014083808487010151805161012085015201519101520161527d565b9192905f5260205273ffffffffffffffffffffffffffffffffffffffff8033931691167f9a071f16ca19062495c8c0e832e4541b4453cd2995fd631b0b7e9f0ee300ff1260405fa4565b91905f5b8181106153895750505050565b806153a861539a6001938588613e7b565b6020810135903586336156a3565b0161537c565b604080516119015f526020969096529081526042601e209490529192906153d78482848661582d565b61543d577f1626ba7e000000000000000000000000000000000000000000000000000000009260209260405190858252600482015260648660248301978895604087528160448601528385013701915afa91511416613a6757638baa579f5f526004601cfd5b50505050565b9061548081604051917ffb7744571d97aa61eb9c2bc3c67b9b1ba047ac9e95afb2ef02bc5b3d9e64fbe5835260808084019260051b840101604052565b9290602c8101604c8201602083015f5b8681106154a55750505050505060051b902090565b806034600c6154b76001948b8b614dfb565b803586520185375f8552608086208160051b8a015201615490565b608090603460ec604051927ffb7744571d97aa61eb9c2bc3c67b9b1ba047ac9e95afb2ef02bc5b3d9e64fbe5845260e081013560208501525f602c85015201604c830137205f5260205f2090565b906040519160c0810135019182359283156156595783907f4d756c7469636861696e436f6d7061637428616464726573732073706f6e736f83527f722c75696e74323536206e6f6e63652c75696e7432353620657870697265732c60208401527f456c656d656e745b5d20656c656d656e747329456c656d656e7428616464726560408401527f737320617262697465722c75696e7432353620636861696e49642c4c6f636b5b60608401527f5d20636f6d6d69746d656e74732c4d616e64617465206d616e64617465294c6f6080840152772c75696e7432353620616d6f756e74294d616e646174652860b88401527f636b2862797465733132206c6f636b5461672c6164647265737320746f6b656e60a084015260200160d8830137602960d884830101538260860160538201209260d901902090565b505090507fc3e0b49b35866f940704f2fb568b9d5dae17a245971e2c095778b60ea177f03b907f172d857ea70e48d30dcad00bb0fc789a34f09c5545da1245400da01d4ef6c8a290565b9273ffffffffffffffffffffffffffffffffffffffff8316927fffffffffffffffffffffffff000000000000000000000000000000000000000016806157b0575091829073ffffffffffffffffffffffffffffffffffffffff8316801590811561575357505f38818086865a60011cf15b1561572557505050613a6792615188565b909193505a9063e718e7450263824664ed18541161574657613a67936150fb565b63c52745985f526004601cfd5b945061575f308661508d565b9482601452836034526fa9059cbb0000000000000000000000005f526157a160205f6044601082865a60011cf13d1560015f51141716915f603452309061508d565b90868210169503850294615714565b9092907fffffffffffffffffffffffff0000000000000000000000000000000000000000831681036157e65750613a67936150fb565b83836158289273ffffffffffffffffffffffffffffffffffffffff613a6798961617946158236b0fffffffffffffffffffffff8760a01c166142fd565b615188565b6140f3565b90939291935f9473ffffffffffffffffffffffffffffffffffffffff8316338114809115176158e4575060405193806040146158a0576041146158705750505050565b60408092939496508101355f1a60205281375b5f526020600160805f825afa511860601b3d11915f606052604052565b507f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9192939550602081013590601b8260ff1c016020523560405216606052615883565b955050505050565b60ff1c6002811015611cde576001149015151690565b9195615932909491948386605892601c926040519260148401526368a30dd0835260348301526054820152012090565b80549081615b58575b50615b5057604080516119015f526020929092528281526042601e20919052916159678187858761582d565b615b50576040517f1626ba7e0000000000000000000000000000000000000000000000000000000081528360048201527f1626ba7e00000000000000000000000000000000000000000000000000000000602060248301809360408252856044820152858b60648301376064860190895a60011cfa91511416615b50577fffffffffffffffffffffffff0000000000000000000000000000000000000000615a0e86613cf8565b515116945f9080516001915b818310615b0f57505050615b025773ffffffffffffffffffffffffffffffffffffffff615a5b8686601452632d5c707e5f526034526024601c20905f603452565b5416928315615af5576020965f96601c948493604051988b8a015289600c8a015263f699ba1c89526040890152606088015260a0608088015260a08701528660ac8701528160c087015260e086013784805260c4019201905afa7ff699ba1c000000000000000000000000000000000000000000000000000000005f5103615ae05750565b3d1517156119d457638baa579f5f526004601cfd5b638baa579f5f526004601cfd5b63bbfc3c515f526004601cfd5b909192600190897fffffffffffffffffffffffff0000000000000000000000000000000000000000615b418786613d05565b51511614151793019190615a1a565b505050505050565b5f90555f61593b56fea164736f6c634300081e000a60a0806040523460285733608052614d46908161002d8239608051818181609b01526102700152f35b5f80fdfe6101806040526004361015610012575f80fd5b5f5f3560e01c8062ad800c14613f745780630e89341c146101f65780633f47e662146101985780634e41a1fb146100c25763d6a39a5114610051575f80fd5b346100bf57807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100bf57602060405173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b80fd5b50346100bf5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100bf57602061018860256101949361011e73ffffffffffffffffffffffffffffffffffffffff60043516614300565b906040519485927ff09fa49d2d000000000000000000000000000000000000000000000000000000828501528051918291018585015e8201908382015203017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0810183528261407f565b60405191829182614037565b0390f35b50346100bf5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100bf5760206101eb73ffffffffffffffffffffffffffffffffffffffff600435166142cc565b60ff60405191168152f35b34613f5d5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112613f5d576040517f5b15bfd9000000000000000000000000000000000000000000000000000000008152600435600482015260a08160248173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000165afa8015613f69575f915f925f915f93613ecc575b50604051936080850185811067ffffffffffffffff821117613e9f5760405273ffffffffffffffffffffffffffffffffffffffff91821685521660208401526008811015613a3f5760408301526002811015613a3f57606082015261032073ffffffffffffffffffffffffffffffffffffffff825116614300565b6040516103b360026032836020808201967f7b226e616d65223a2022436f6d7061637420000000000000000000000000000088528051918291018484015e81017f222c0000000000000000000000000000000000000000000000000000000000008382015203017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe281018452018261407f565b61040183516040517fffffffffffffffffffffffffffffffffffffffff000000000000000000000000602082019260601b168252601481526103f660348261407f565b51902060e81c614ca8565b90602061040d5f614ca8565b92610541600960a161041e5f614ca8565b936040519586917f3c7376672077696474683d2235303022206865696768743d2232393022207669828401527f6577426f783d2230203020353030203239302220786d6c6e733d22687474703a60408401527f2f2f7777772e77332e6f72672f323030302f737667223e3c726563742077696460608401527f74683d22353030707822206865696768743d223239307078222066696c6c3d2260808401527f230000000000000000000000000000000000000000000000000000000000000060a08401528051918291018484015e81017f222f3e3c2f7376673e00000000000000000000000000000000000000000000008382015203017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe981018552018361407f565b81606092815180613d97575b50505061067c600960a26020966040519788917f3c7376672077696474683d2235303022206865696768743d2232393022207669828401527f6577426f783d2230203020353030203239302220786d6c6e733d22687474703a60408401527f2f2f7777772e77332e6f72672f323030302f737667223e3c636972636c65206360608401527f783d22343030222063793d223130302220723d223135307078222066696c6c3d60808401527f222300000000000000000000000000000000000000000000000000000000000060a08401528051918291018484015e81017f222f3e3c2f7376673e00000000000000000000000000000000000000000000008382015203017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe981018752018561407f565b83606094815180613c8f575b505050926107b8600960a26020966040519788917f3c7376672077696474683d2235303022206865696768743d2232393022207669828401527f6577426f783d2230203020353030203239302220786d6c6e733d22687474703a60408401527f2f2f7777772e77332e6f72672f323030302f737667223e3c636972636c65206360608401527f783d22313230222063793d223230302220723d223132307078222066696c6c3d60808401527f222300000000000000000000000000000000000000000000000000000000000060a08401528051918291018484015e81017f222f3e3c2f7376673e00000000000000000000000000000000000000000000008382015203017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe981018752018561407f565b83516060948082613b84575b505050603e610aea92816020809760718261016d976040519b8c977f3c646566733e3c66696c7465722069643d226631223e3c6665496d6167652072828a01527f6573756c743d2270302220786c696e6b3a687265663d22646174613a696d616760408a01527f652f7376672b786d6c3b6261736536342c00000000000000000000000000000060608a0152805191829101858a015e8701907f222f3e3c6665496d61676520726573756c743d2270312220786c696e6b3a6872848301527f65663d22646174613a696d6167652f7376672b786d6c3b6261736536342c0000609183015280519283910160af83015e0101907f222f3e3c6665496d61676520726573756c743d2270322220786c696e6b3a6872848301527f65663d22646174613a696d6167652f7376672b786d6c3b6261736536342c0000605e830152805192839101607c83015e01017f222f3e3c6665426c656e64206d6f64653d226f7665726c61792220696e3d2270838201527f302220696e323d22703122202f3e3c6665426c656e64206d6f64653d22657863605e8201527f6c7573696f6e2220696e323d22703222202f3e3c6665476175737369616e426c607e8201527f757220737464446576696174696f6e3d22343222202f3e3c2f66696c7465723e609e8201527f3c66696c7465722069643d227462223e3c6665476175737369616e426c75722060be8201527f696e3d22536f75726365477261706869632220737464446576696174696f6e3d60de8201527f22323422202f3e3c2f66696c7465723e3c66696c7465722069643d227473222060fe8201527f783d222d3230252220793d222d323025222077696474683d223134302522206861011e8201527f65696768743d2231343025223e3c666544726f70536861646f772064783d223061013e8201527f222064793d22302220737464446576696174696f6e3d22312220666c6f6f642d61015e8201527f6f7061636974793d22302e382220666c6f6f642d636f6c6f723d22626c61636b61017e8201527f22202f3e3c2f66696c7465723e0000000000000000000000000000000000000061019e820152030161014d81018552018361407f565b604051610af96102208261407f565b6101f681527f3c636c6970506174682069643d2263223e3c726563742077696474683d22353060208201527f3022206865696768743d22323930222072783d223432222072793d223432222060408201527f2f3e3c2f636c6970506174683e3c706174682069643d2274702220643d224d3460608201527f302031322048343630204132382032382030203020312034383820343020563260808201527f353020413238203238203020302031203436302032373820483430204132382060a08201527f323820302030203120313220323530205634302041323820323820302030203160c08201527f203430203132207a22202f3e3c6c696e6561724772616469656e742069643d2260e08201527f6773222078313d2230222079313d2230222078323d2231222079323d2230223e6101008201527f3c73746f70206f66667365743d22302e37222073746f702d636f6c6f723d22776101208201527f68697465222073746f702d6f7061636974793d223122202f3e3c73746f70206f6101408201527f66667365743d222e3935222073746f702d636f6c6f723d2277686974652220736101608201527f746f702d6f7061636974793d223022202f3e3c2f6c696e6561724772616469656101808201527f6e743e3c6d61736b2069643d22667322206d61736b436f6e74656e74556e69746101a08201527f733d227573657253706163654f6e557365223e3c726563742077696474683d226101c08201527f343430707822206865696768743d223230307078222066696c6c3d2275726c286101e08201527f2367732922202f3e3c2f6d61736b3e3c2f646566733e00000000000000000000610200820152604051928051907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08060208401165b8083015181880152018015610dcc577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe090610d96565b50508151918185017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08060208601165b808401518184015201908115610e3457907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe090610dfc565b5050500180830190602082015f905283526040016040526101c060405190610e5c908261407f565b61018a81527f3c6720636c69702d706174683d2275726c28236329223e3c726563742066696c60208201527f6c3d226e6f6e652220783d223070782220793d22307078222077696474683d226040808301919091527f353030707822206865696768743d22323930707822202f3e3c7265637420737460608301527f796c653d2266696c7465723a2075726c28236631292220783d2230707822207960808301527f3d22307078222077696474683d22353030707822206865696768743d2232393060a08301527f707822202f3e3c67207374796c653d2266696c7465723a75726c28237462293b60c08301527f207472616e73666f726d3a7363616c6528312e35293b207472616e73666f726d60e08301527f2d6f726967696e3a6c65667420746f703b223e3c726563742066696c6c3d226e6101008301527f6f6e652220783d223070782220793d22307078222077696474683d2235303070610120808401919091527f7822206865696768743d22323930707822202f3e3c656c6c697073652063783d6101408401527f22323525222063793d22307078222072783d223138307078222072793d2231326101608401527f307078222066696c6c3d222330303022206f7061636974793d22302e383522206101808401527f2f3e3c2f673e3c2f673e000000000000000000000000000000000000000000006101a08401529051939061106b908561407f565b60e484527f3c7265637420783d22302220793d2230222077696474683d223530302220686560208501527f696768743d22323930222072783d223432222072793d223432222066696c6c3d60408501527f227267626128302c302c302c302922207374726f6b653d22726762612832353560608501527f2c3235352c3235352c302e322922202f3e3c7265637420783d2231362220793d60808501527f223136222077696474683d2234363822206865696768743d223235382220727860a08501527f3d223236222072793d223236222066696c6c3d227267626128302c302c302c3060c08501527f2922207374726f6b653d2272676261283235352c3235352c3235352c302e322960e08501527f22202f3e000000000000000000000000000000000000000000000000000000006101008501526111a986614632565b5093915f969196506040968751916111c1898461407f565b600583527f20e280a22000000000000000000000000000000000000000000000000000000060208401526111f48b614ada565b60a01c61120090614966565b90895197838994516020819201602087015e840160208101905f82528651809260208901905e016020015f815281516020819301825e015f81528451908160208701825e015f815281516020819301825e015f81528351908160208601825e017f4c6f636b20546167200000000000000000000000000000000000000000000000815281516020819301600983015e01600981015f9052036009017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0810186526112ca908661407f565b6060890151906002821015613a3f576112e388926147d9565b9060208b015173ffffffffffffffffffffffffffffffffffffffff16611308906146ac565b9060208c015173ffffffffffffffffffffffffffffffffffffffff1661132d90614824565b845192839260208401957f54686520436f6d70616374207631000000000000000000000000000000000000875281518060208401602e88015e8501602e8101915f83528051926020849201905e01602e017f205265736f75726365204c6f636b000000000000000000000000000000000000815281516020819301600e83015e01600e8101915f83528051926020849201905e01600e017f2040200000000000000000000000000000000000000000000000000000000000815281516020819301600383015e01600381015f9052036003017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08101825261142e908261407f565b82519661143b848961407f565b6005885260208801977f2d3130302500000000000000000000000000000000000000000000000000000089528451809960208201927f3c74657874506174682073746172744f66667365743d220000000000000000008452518091603784015e7f222066696c6c3d2277686974652220666f6e742d66616d696c793d226d6f6e6f6037918301918201527f73706163652220666f6e742d73697a653d22313070782220786c696e6b3a687260578201527f65663d22237470223e000000000000000000000000000000000000000000000060778201528351908160208601608083015e7f3c616e696d6174652061646469746976653d2273756d22206174747269627574910160808101919091527f654e616d653d2273746172744f6666736574222066726f6d3d2230252220746f60a08201527f3d22313030252220626567696e3d22307322206475723d22333073222072657060c08201527f656174436f756e743d22696e646566696e69746522202f3e3c2f74657874506160e08201527f74683e00000000000000000000000000000000000000000000000000000000006101008201520360e381018a526115f790610103018a61407f565b8451611603868261407f565b60028152602081017f30250000000000000000000000000000000000000000000000000000000000008152865193849160208301937f3c74657874506174682073746172744f66667365743d220000000000000000008552518091603785015e8201603781017f222066696c6c3d2277686974652220666f6e742d66616d696c793d226d6f6e6f9052605781017f73706163652220666f6e742d73697a653d22313070782220786c696e6b3a68729052607781017f65663d22237470223e0000000000000000000000000000000000000000000000905281516020819301608083015e7f3c616e696d6174652061646469746976653d2273756d22206174747269627574910160808101919091527f654e616d653d2273746172744f6666736574222066726f6d3d2230252220746f60a08201527f3d22313030252220626567696e3d22307322206475723d22333073222072657060c08201527f656174436f756e743d22696e646566696e69746522202f3e3c2f74657874506160e08201527f74683e00000000000000000000000000000000000000000000000000000000006101008201520360e3810184526117bf90610103018461407f565b8551926117cc878561407f565b6003845260208401927f353025000000000000000000000000000000000000000000000000000000000084528751809460208201967f3c74657874506174682073746172744f66667365743d220000000000000000008852518091603784015e7f222066696c6c3d2277686974652220666f6e742d66616d696c793d226d6f6e6f6037918301918201527f73706163652220666f6e742d73697a653d22313070782220786c696e6b3a687260578201527f65663d22237470223e00000000000000000000000000000000000000000000006077820152875190818a608083015e7f3c616e696d6174652061646469746976653d2273756d22206174747269627574910160808101919091527f654e616d653d2273746172744f6666736574222066726f6d3d2230252220746f60a08201527f3d22313030252220626567696e3d22307322206475723d22333073222072657060c08201527f656174436f756e743d22696e646566696e69746522202f3e3c2f74657874506160e08201527f74683e00000000000000000000000000000000000000000000000000000000006101008201520360e38101855261198590610103018561407f565b875196611992898961407f565b6004885260208801907f2d3530250000000000000000000000000000000000000000000000000000000082528951978892602084019a7f3c74657874506174682073746172744f66667365743d220000000000000000008c52518091603786015e830190603782017f222066696c6c3d2277686974652220666f6e742d66616d696c793d226d6f6e6f9052605782017f73706163652220666f6e742d73697a653d22313070782220786c696e6b3a68729052607782017f65663d22237470223e00000000000000000000000000000000000000000000009052518092608083015e7f3c616e696d6174652061646469746976653d2273756d22206174747269627574910160808101919091527f654e616d653d2273746172744f6666736574222066726f6d3d2230252220746f60a08201527f3d22313030252220626567696e3d22307322206475723d22333073222072657060c08201527f656174436f756e743d22696e646566696e69746522202f3e3c2f74657874506160e08201527f74683e00000000000000000000000000000000000000000000000000000000006101008201520360e381018752611b4c90610103018761407f565b87519b8c9860208a017f3c7465787420746578742d72656e646572696e673d226f7074696d697a655370905289017f656564222066696c7465723d2275726c2823747329223e000000000000000000905251809160578a015e87019060578201905f8252519283915e01605701905f8252518092825e01905f8252518092825e017f3c2f746578743e000000000000000000000000000000000000000000000000008152037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe781018552600701611c23908561407f565b611c2c88614632565b5091505060608901516002811015613a3f57611c47906147d9565b60608a01516002811015613a3f5760408b0151926008841015613a3f578960886020609c938f8261204b9881611db18473ffffffffffffffffffffffffffffffffffffffff7f33327078222066696c6c3d2277686974652220666f6e742d66616d696c793d229e600b9d611d9b838760a89b0151166b0f0000000000000000000000690fedcba98765432100007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc607f6affffffffffffffffffffff687fffffffffffffffff8660591c1668ffffffffffffffffff8760581c16178060021c178060041c178060081c178060101c178060201c178060401c176755555555555555558160011c169003673333333333333333808260021c169116018060041c01670f0f0f0f0f0f0f0f660f0f0f0f0f0f0f8260081c169116018060101c019516948060201c0116604803161c60581b161790565b60a01b9160fc1b9060ff1b171791511617614966565b9488519c8d997f3c672069643d227469746c65223e3c7465787420793d22363070782220783d22848c01528a01527f6d6f6e6f73706163652220666f6e742d7765696768743d223130302220666f6e60608a01527f742d73697a653d2233327078222066696c7465723d2275726c2823747329223e60808a01527f436f6d706163742000000000000000000000000000000000000000000000000060a08a0152805191829101858a015e8701907f3c2f746578743e3c7465787420793d22393070782220783d2233327078222066848301527f696c6c3d2272676261283235352c3235352c3235352c302e36292220666f6e7460c88301527f2d66616d696c793d226d6f6e6f73706163652220666f6e742d7765696768743d60e88301527f2235302220666f6e742d73697a653d2232327078222066696c7465723d2275726101088301527f6c2823747329223e00000000000000000000000000000000000000000000000061012883015280519283910161013083015e0101907f205265736f75726365204c6f636b3c2f746578743e3c7465787420793d223131848301527f3070782220783d2233327078222066696c6c3d2272676261283235352c32353560a88301527f2c3235352c302e36292220666f6e742d66616d696c793d226d6f6e6f7370616360c88301527f652220666f6e742d7765696768743d223130302220666f6e742d73697a653d2260e88301527f31307078222066696c7465723d2275726c2823747329223e49443a200000000061010883015280519283910161012483015e01017f3c2f746578743e3c2f673e0000000000000000000000000000000000000000008382015203017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeb81018452018261407f565b61205489614632565b5092915061207b73ffffffffffffffffffffffffffffffffffffffff60208d0151166146ac565b60408c01516008811015613a3f5761209290614707565b60608d0151916002831015613a3f576120ab8c936147d9565b908351946120ba60a08761407f565b607c8652602086017f3c67207374796c653d227472616e73666f726d3a7472616e736c61746528343290528486017f3070782c203530707829223e3c7465787420783d22323070782220793d2232389052606086017f70782220746578742d616e63686f723d226d6964646c652220666f6e742d73699052608086017f7a653d223634707822206f7061636974793d22302e34223ef09fa49d000000009052845197818992516020819201602085015e8201602081017f2028000000000000000000000000000000000000000000000000000000000000905281516020819301602283015e01602001600281017f29000000000000000000000000000000000000000000000000000000000000009052036002017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe181018852600101612200908861407f565b6122086145bc565b6122106145f7565b978551988992602084017f3c666f726569676e4f626a65637420783d22313270782220793d22323270782290528784017f2077696474683d22000000000000000000000000000000000000000000000000905280516020819201604886015e8301604881017f22206865696768743d2200000000000000000000000000000000000000000000905281516020819301605283015e01604801600a81017f223e3c7370616e20786d6c6e733d22687474703a2f2f7777772e77332e6f72679052602a81017f2f313939392f7868746d6c22207374796c653d22666f6e742d66616d696c793a9052604a81017f206d6f6e6f73706163653b666f6e742d73697a653a20313470783b636f6c6f729052606a81017f3a2077686974653b223e00000000000000000000000000000000000000000000905281516020819301607483015e01600a01606a81017f3c2f7370616e3e3c2f666f726569676e4f626a6563743e000000000000000000905203606a017ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7810188526017016123b1908861407f565b6123b96145bc565b6123c16145f7565b918551928392602084017f3c666f726569676e4f626a65637420783d22313270782220793d22323270782290528784017f2077696474683d22000000000000000000000000000000000000000000000000905280516020819201604886015e8301604881017f22206865696768743d2200000000000000000000000000000000000000000000905281516020819301605283015e01604801600a81017f223e3c7370616e20786d6c6e733d22687474703a2f2f7777772e77332e6f72679052602a81017f2f313939392f7868746d6c22207374796c653d22666f6e742d66616d696c793a9052604a81017f206d6f6e6f73706163653b666f6e742d73697a653a20313470783b636f6c6f729052606a81017f3a2077686974653b223e00000000000000000000000000000000000000000000905281516020819301607483015e01600a01606a81017f3c2f7370616e3e3c2f666f726569676e4f626a6563743e000000000000000000905203606a017ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff781018252601701612562908261407f565b61256b46614c05565b928451978895602087017f3c2f746578743e3c2f673e3c67207374796c653d227472616e73666f726d3a74905286017f72616e736c61746528333270782c20313430707829223e3c72656374207769649052606086017f74683d22323030707822206865696768743d2236347078222072783d223870789052608086017f222072793d22387078222066696c6c3d227267626128302c302c302c302e3629905260a086017f22202f3e3c7465787420783d22313270782220793d22313770782220666f6e74905260c086017f2d66616d696c793d226d6f6e6f73706163652220666f6e742d73697a653d2231905260e086017f327078222066696c6c3d2272676261283235352c3235352c3235352c302e3629905261010086017f223e4c6f636b656420546f6b656e3a203c2f746578743e00000000000000000090528051602081920161011788015e7f3c2f673e3c67207374796c653d227472616e73666f726d3a7472616e736c6174610117918701918201527f6528333270782c20323132707829223e3c726563742077696474683d223230306101378201527f707822206865696768743d2232367078222072783d22387078222072793d22386101578201527f7078222066696c6c3d227267626128302c302c302c302e362922202f3e3c74656101778201527f787420783d22313270782220793d22313770782220666f6e742d66616d696c796101978201527f3d226d6f6e6f73706163652220666f6e742d73697a653d2231327078222066696101b78201527f6c6c3d227768697465223e3c747370616e2066696c6c3d2272676261283235356101d78201527f2c3235352c3235352c302e3629223e526573657420506572696f643a203c2f746101f78201527f7370616e3e000000000000000000000000000000000000000000000000000000610217820152815191829060200161021c83015e7f3c2f746578743e3c2f673e3c67207374796c653d227472616e73666f726d3a7461021c92909101918201527f72616e736c6174652832363070782c20313430707829223e3c7265637420776961023c8201527f6474683d22323130707822206865696768743d2236347078222072783d22387061025c8201527f78222072793d22387078222066696c6c3d227267626128302c302c302c302e3661027c8201527f2922202f3e3c7465787420783d22313270782220793d22313770782220666f6e61029c8201527f742d66616d696c793d226d6f6e6f73706163652220666f6e742d73697a653d226102bc8201527f31327078222066696c6c3d2272676261283235352c3235352c3235352c302e366102dc8201527f29223e416c6c6f6361746f723a203c2f746578743e00000000000000000000006102fc820152815191610117820191839160200190610311015e7f3c2f673e3c67207374796c653d227472616e73666f726d3a7472616e736c61746101fa92909101918201527f652832363070782c20323132707829223e3c726563742077696474683d22323161021a8201527f30707822206865696768743d2232367078222072783d22387078222072793d2261023a8201527f387078222066696c6c3d227267626128302c302c302c302e362922202f3e3c7461025a8201527f65787420783d22313270782220793d22313770782220666f6e742d66616d696c61027a8201527f793d226d6f6e6f73706163652220666f6e742d73697a653d223132707822206661029a8201527f696c6c3d227768697465223e3c747370616e2066696c6c3d22726762612832356102ba8201527f352c3235352c3235352c302e3629223e53636f70653a203c2f747370616e3e006102da8201528151916101058201918391602001906102f9015e0160f50160ff81017f3c2f746578743e3c2f673e3c673e3c7465787420783d223530252220793d2232905261011f81017f363070782220666f6e742d66616d696c793d226d6f6e6f73706163652220666f905261013f81017f6e742d73697a653d2231327078222066696c6c3d227768697465222074657874905261015f81017f2d616e63686f723d226d6964646c65222066696c7465723d2275726c28237473905261017f81017f29223e3c747370616e2066696c6c3d2272676261283235352c3235352c323535905261019f81017f2c302e3629223e4f726967696e20436861696e3a203c2f747370616e3e0000009052815160208193016101bc83015e0160ff0160bd81017f3c2f746578743e3c2f673e00000000000000000000000000000000000000000090520360bd017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeb81018452600b01612c29908461407f565b885196815191602083017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0905b80830151818c0152018015612cae577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe090612c78565b50508351937fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08060208701165b8083015181868d01015201908b8a8315612d1a575090917fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09150612cdb565b5f959097018088016020818101979097528189528083019092527f3c7376672077696474683d2235303022206865696768743d223239302220766960608301527f6577426f783d2230203020353030203239302220786d6c6e733d22687474703a60808301527f2f2f7777772e77332e6f72672f323030302f7376672220786d6c6e733a786c6960a08301527f6e6b3d22687474703a2f2f7777772e77332e6f72672f313939392f786c696e6b60c08301527f223e00000000000000000000000000000000000000000000000000000000000060e08301528a51909a612edb9a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc69a97998a98899750955060e294879492938f9291849187019088015e0101908382015f8152815193849201905e0101905f8252805192839101825e01905f8252805192839101825e01905f8252805192839101825e015f81528451908160208701825e017f3c2f7376673e0000000000000000000000000000000000000000000000000000815283850190037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa6810187858701015201858385010161407f565b81810184018051606093909182613a6c575b50505050600260446020612fb993865160a0527f22696d616765223a2022646174613a696d6167652f7376672b786d6c3b6261738260a05101527f6536342c000000000000000000000000000000000000000000000000000000008760a05101528051918291018360a051015e60a051017f222c0000000000000000000000000000000000000000000000000000000000008282015260a0519003017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe2810160a051520160a05161407f565b612fc284614632565b5050612fea73ffffffffffffffffffffffffffffffffffffffff6020889594950151166146ac565b60408701516008811015613a3f5761300190614707565b9060608801516002811015613a3f57613019906147d9565b90602089015173ffffffffffffffffffffffffffffffffffffffff1661303e90614824565b908751968795602087017f226465736372697074696f6e223a20225b54686520436f6d706163742076315d90528987017f2000000000000000000000000000000000000000000000000000000000000000905280516020819201604189015e8601604181017f2028000000000000000000000000000000000000000000000000000000000000905281516020819301604383015e01604101600281017f29207265736f75726365206c6f636b207573696e672000000000000000000000905281516020819301601883015e01600201601681017f2028000000000000000000000000000000000000000000000000000000000000905281516020819301601883015e01601601600281017f292c200000000000000000000000000000000000000000000000000000000000905281516020819301600583015e01600201600381017f2073636f70652c20616e64206120000000000000000000000000000000000000905281516020819301601183015e7f20726573657420706572696f64222c000000000000000000000000000000000060119290910191820152038083526131ea906020018361407f565b6131f385614632565b9194929190613203600435614966565b875190613210898361407f565b600282527f49440000000000000000000000000000000000000000000000000000000000006020830152613243916149a2565b92875190613251898361407f565b600d82527f546f6b656e2041646472657373000000000000000000000000000000000000006020830152613284916149a2565b95875190613292898361407f565b600a82527f546f6b656e204e616d650000000000000000000000000000000000000000000060208301526132c5916149a2565b908751906132d3898361407f565b600c82527f546f6b656e2053796d626f6c00000000000000000000000000000000000000006020830152613306916149a2565b908751613313898261407f565b600e8152602081017f546f6b656e20446563696d616c7300000000000000000000000000000000000090525f610140526020610140528851936101405161335a908661407f565b5f855289519061336a8b8361407f565b600282526101405182017f7d2c00000000000000000000000000000000000000000000000000000000000090528a519586936101405185017f7b2274726169745f74797065223a202200000000000000000000000000000000905280516020819201603087015e840191603083017f222c202276616c7565223a20000000000000000000000000000000000000000090528151610140518301938185603c83015e01603001600c8101915f835280519283916101405101905e01600c01905f8252518092825e015f8152815180926101405101825e015f8152037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081018452613473908461407f565b87519687946101405186017f2261747472696275746573223a205b00000000000000000000000000000000009052805180916101405101602f88015e8501602f8101915f835280519283916101405101905e01602f015f8152815180926101405101825e015f8152815180926101405101825e015f8152815180926101405101825e015f8152037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081018452613529908461407f565b602086015173ffffffffffffffffffffffffffffffffffffffff1661354d90614824565b84519061355a868361407f565b601182526101405182017f416c6c6f6361746f7220416464726573730000000000000000000000000000009052613590916149a2565b95602081015173ffffffffffffffffffffffffffffffffffffffff166135b5906146ac565b8551906135c2878361407f565b600e82526101405182017f416c6c6f6361746f72204e616d6500000000000000000000000000000000000090526135f8916149a2565b9060608101516002811015613a3f57613613613650916147d9565b875161361f898261407f565b600581527f53636f7065000000000000000000000000000000000000000000000000000000610140518201526149a2565b60c0526040810151916008831015613a3f5761019498613a35966137126136d56136cd6002966136c48d6136866139b49b614707565b906136938151918261407f565b600c81527f526573657420506572696f640000000000000000000000000000000000000000610140518201526149a2565b61010052614ada565b60a01c614966565b8a516136e18c8261407f565b600881527f4c6f636b20546167000000000000000000000000000000000000000000000000610140518201526149a2565b6101205261371f46614c05565b610160526138bc898051613733828261407f565b600c81527f4f726967696e20436861696e000000000000000000000000000000000000000061014051820152600c6030835192613770858561407f565b600184527f2200000000000000000000000000000000000000000000000000000000000000610140518501528451946137a9818761407f565b600186527f7d00000000000000000000000000000000000000000000000000000000000000610140518701525160e0527f7b2274726169745f74797065223a2022000000000000000000000000000000006101405160e05101528051809161014051018360e051015e60e051017f222c202276616c7565223a2000000000000000000000000000000000000000008282015283519081610140518601603c83015e0101818101905f825261016051518092610140516101605101905e01015f8152815180926101405101825e015f8152815180926101405101825e015f815260e05190037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0810160e0515260e05161407f565b60e05150885160805280518091610140510161014051608051015e6080510190610140518201905f825280519182916101405101905e610140519101015f8152815180926101405101825e015f815260c0515190816101405160c05101825e015f815261010051519081610140516101005101825e015f815261012051519081610140516101205101825e015f815260e0515190816101405160e05101825e017f5d7d000000000000000000000000000000000000000000000000000000000000815260805190037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe28101608051520160805161407f565b602084519586935180916101405186015e8301916101405183015f8152815192839201905e610140519101015f815260a051519081602060a05101825e015f81526080515190816101405160805101825e015f8152037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0810184528361407f565b5191829182614037565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b86517f4142434445464748494a4b4c4d4e4f505152535455565758595a616263646566601f527f6768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2f603f52848301840160600180515f909152949550929391929060208201906004906003905b0191603f8351818160121c16515f538181600c1c1651600153818160061c165160025316516003535f518152019060206003600288010460021b840101821015613b2757600490600390613ad8565b506002855f6003936020966060859a612fb99c60449b010101528b8585850104851b8701018c527f3d3d0000000000000000000000000000000000000000000000000000000000008584068504820352520104841b815293612eed565b91955091926003600287010460021b92604051927f4142434445464748494a4b4c4d4e4f505152535455565758595a616263646566601f526106707f6768696a6b6c6d6e6f707172737475767778797a303132333435363738392d5f18603f5260208401938581019160208a81850195010195600460038851935f8a525b0191603f8351818160121c16515f538181600c1c1651600153818160061c165160025316516003535f518152019085821015613c4357600490600390613c02565b50955260409182019091527f3d3d0000000000000000000000000000000000000000000000000000000000006003909806600204840397909752505f90915290845290603e82816107c4565b95506003600287010460021b95604051937f4142434445464748494a4b4c4d4e4f505152535455565758595a616263646566601f526106707f6768696a6b6c6d6e6f707172737475767778797a303132333435363738392d5f18603f52602085019760208382880196010198600460038b51965f8d525b0191603f8351818160121c16515f538181600c1c1651600153818160061c165160025316516003535f518152019060208701821015613d4a57600490600390613d06565b505f907f3d3d000000000000000000000000000000000000000000000000000000000000600360a29660406107b89a60209f9a60099b520160405206600204820352528552939650610688565b9593506003600287010460021b95604051947f4142434445464748494a4b4c4d4e4f505152535455565758595a616263646566601f526106707f6768696a6b6c6d6e6f707172737475767778797a303132333435363738392d5f18603f52602086019760208382890196010198600460038b51965f8d525b0191603f8351818160121c16515f538181600c1c1651600153818160061c165160025316516003535f518152019060208701821015613e5357600490600390613e0f565b505f907f3d3d000000000000000000000000000000000000000000000000000000000000600360a296604061067c9a60209f9a60099b520160405206600204820352528652965061054d565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b935050505060a0813d60a011613f61575b81613eea60a0938361407f565b81010312613f5d57613efb816142ab565b90613f08602082016142ab565b906040810151926008841015613f5d576060820151916002831015613f5d57608001517fffffffffffffffffffffffff0000000000000000000000000000000000000000811603613f5d5791929091846102a5565b5f80fd5b3d9150613edd565b6040513d5f823e3d90fd5b34613f5d5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112613f5d5761019460206101886028613fce73ffffffffffffffffffffffffffffffffffffffff600435166140fa565b6040519384917f436f6d7061637420000000000000000000000000000000000000000000000000828401528051918291018484015e81015f8382015203017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0810183528261407f565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f602060409481855280519182918282880152018686015e5f8582860101520116010190565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff821117613e9f57604052565b67ffffffffffffffff8111613e9f57601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b73ffffffffffffffffffffffffffffffffffffffff81161561426f5761412b906306fdde0360045260045f5261449e565b9060405191602083017b5c75303030303031323334353637383961626364656662746e00667260155281518201915b8281036141d957505f81528381037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe00184526020016040525081511561419c57565b90506040516141ac60408261407f565b600d81527f556e6b6e6f776e20546f6b656e00000000000000000000000000000000000000602082015290565b6001019081519060ff8216916020831015614238576137006001841b161561421657506008600292605c83530151600182015301915b919061415a565b6006925080600f809260041c1651601d531651601e536019518152019161420f565b506b1000000000000004000000006001831b161561426357600291605c82536001820153019161420f565b6001918153019161420f565b5060405161427e60408261407f565b600c81527f4e617469766520546f6b656e0000000000000000000000000000000000000000602082015290565b519073ffffffffffffffffffffffffffffffffffffffff82168203613f5d57565b8060601b156142fa5760208060048160ff9463313ce5678352825f52620186a0fa601f3d1116602051021690565b50601290565b8060601b156144625761431e906395d89b4160045260045f5261449e565b9060405191602083017b5c75303030303031323334353637383961626364656662746e00667260155281518201915b8281036143cc57505f81528381037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe00184526020016040525081511561438f57565b905060405161439f60408261407f565b600381527f3f3f3f0000000000000000000000000000000000000000000000000000000000602082015290565b6001019081519060ff821691602083101561442b576137006001841b161561440957506008600292605c83530151600182015301915b919061434d565b6006925080600f809260041c1651601d531651601e5360195181520191614402565b506b1000000000000004000000006001831b161561445657600291605c825360018201530191614402565b60019181530191614402565b5060405161447160408261407f565b600381527f4554480000000000000000000000000000000000000000000000000000000000602082015290565b60205f60609282825191620186a0fa156145b957506040518060200160403d1015614521575b5f60203d806103e8106103e8821802188083853e840101535b80515f1a156144ee576001016144dd565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08282030182525f815260200160405290565b5f517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe03d01811115614554575b506144c4565b602081843e7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0813d030183519081111561458e575061454e565b90604092826020936103e8106103e88218021892839283875201903e82015f60208201520160405290565b90565b604051906145cb60408361407f565b600582527f31393070780000000000000000000000000000000000000000000000000000006020830152565b6040519061460660408361407f565b600482527f34307078000000000000000000000000000000000000000000000000000000006020830152565b9061465373ffffffffffffffffffffffffffffffffffffffff835116614824565b9161467473ffffffffffffffffffffffffffffffffffffffff8251166140fa565b916145b960ff6146a673ffffffffffffffffffffffffffffffffffffffff61469e81875116614300565b9551166142cc565b16614c05565b6146c1906306fdde0360045260045f5261449e565b8051156146cb5790565b506040516146da60408261407f565b601181527f556e6e616d656420416c6c6f6361746f72000000000000000000000000000000602082015290565b7f3330640037643168323468003168356d31306d00316d000031357300317300009060051b1c908160e01b8260f81b15928060f01b158460011b01600503931561479e575b5061476f614759846140c0565b93614767604051958661407f565b8085526140c0565b927fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe06020820194013685379252565b9050602062ffff007cffff0000000000000000000000000000000000000000000000000000008360d81b169260081c161860e81b185f61474c565b604051906147e860408361407f565b600e82526020368184013715790a4d756c7469636861696e0e436861696e2d7370656369666963816078021c9060051b6088011b601f82015290565b9060405191608083016040526f30313233343536373839616263646566600f526002830190602882525f604a85015260601b60015f5b8080018601602284831a600f811651602384015360041c51910153019060148214614888579060019061485a565b50506130786002825101915282528160228101907f8888888888888888888888888888888888888888888888888888888888888880602883201660015f5b82811a7e88000000000000000000000000000000000000000000000000000000000000028180015201906014821461490157906001906148c6565b505060429180517f2020202020202020202020202020202020202020202020202020202020202020815f511660011c161890520180517f2020202020202020202020202020202020202020202020202020202020202020816020511660011c16189052565b61496f90614ca8565b907ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe600283510192613078815201918252565b6145b99060209260409081516149b8838261407f565b60018152858101907f22000000000000000000000000000000000000000000000000000000000000008252600c878551946149f3878761407f565b600286526030828701977f7d2c0000000000000000000000000000000000000000000000000000000000008952519a8b997f7b2274726169745f74797065223a202200000000000000000000000000000000828c0152805191829101838c015e89017f222c202276616c7565223a200000000000000000000000000000000000000000828201528551908188603c83015e0101908382015f8152815193849201905e0101905f8252518092825e01905f8252518092825e015f8152037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0810183528261407f565b614bd773ffffffffffffffffffffffffffffffffffffffff6020830151166b0f0000000000000000000000690fedcba98765432100007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc607f6affffffffffffffffffffff687fffffffffffffffff8660591c1668ffffffffffffffffff8760581c16178060021c178060041c178060081c178060101c178060201c178060401c176755555555555555558160011c169003673333333333333333808260021c169116018060041c01670f0f0f0f0f0f0f0f660f0f0f0f0f0f0f8260081c169116018060101c019516948060201c0116604803161c60581b161790565b906060810151906002821015613a3f5760400151916008831015613a3f5760a01b9160fc1b9060ff1b171790565b90604051600a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff608083019460a084016040525f8652945b0193818106603001855304928315614c78577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600a91614c3d565b92506080837fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09203019201918252565b906040517ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe608082019360a083016040525f85526f30313233343536373839616263646566600f52935b0192600f8116516001850153600f8160041c1651845360081c928315614c78577ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe90614cf256fea164736f6c634300081e000a60e0806040523461011157610b948181016001600160401b038111838210176100fd578291610310833903905ff080156100f2576001600160a01b031660805272f15a6080526060526040526020523d52593df36013527f600b5981380380925939f35a3d383d3860013d355af15a3d383d3860013d355a5f90815260339080f07f600b5981380380925939f35a3d35315a3d35315a60405250602052503d52593d5f5260f360205360215f80f09081158115176100e55760a05260c0526040516101fa908161011682396080518161010d015260a05181609b015260c0518160550152f35b639f608b8a5f526004601cfd5b6040513d5f823e3d90fd5b634e487b7160e01b5f52604160045260245ffd5b5f80fdfe6080806040526004361015610012575f80fd5b5f3560e01c636d23886514610025575f80fd5b60207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101e957600435907f000000000000000000000000000000000000000000000000000000000000000091305f52806020526034600c2060601c803160023418176101dc575f5260a08260205f60027f00000000000000000000000000000000000000000000000000000000000000005af192825193602084019485519160408601918251916060880151938360808a01519303975f5260608960205f8a5afa98519951905181039903971590151788881417910385111517911615176101dc577f00000000000000000000000000000000000000000000000000000000000000006383ceba495443146101dc575f926060604093436383ceba4955602085519687928682525afa938051906020810151948591015191039303931584841115176101dc573360145260016034526fa9059cbb0000000000000000000000005f525a9060205f6044601082875af1925a935f6034523d1560015f51141716156101dc575f906389afcb448252336020526024601c8338935af1156101dc57604096875196030185520301036020820152f35b639f608b8a5f526004601cfd5b5f80fdfea164736f6c634300081e000a60a08060405234609757336080526805345cdf77eb68f44c545f198101908110608a576805345cdf77eb68f44c556387a211a2600c52335f526020600c205f1981540190555f19602052600c5160601c5f7fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef602080a3610af8908161009c82396080518161049c0152f35b63e5cfe9575f526004601cfd5b5f80fdfe60806040526004361015610011575f80fd5b5f3560e01c806306fdde031461093c578063095ea7b31461088257806318160ddd1461083f57806323b872dd1461071e578063313ce567146106e55780633644e5151461061b57806370a08231146105cb5780637ecebe001461057b57806389afcb441461044e57806395d89b41146103df578063a9059cbb14610332578063d505accf146100fe5763dd62ed3e146100a8575f80fd5b346100fa5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100fa5760206100f26100e46109eb565b6100ec610a0e565b90610a82565b604051908152f35b5f80fd5b346100fa5760e07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100fa576101356109eb565b61013d610a0e565b604435916064356084359260ff841684036100fa5773ffffffffffffffffffffffffffffffffffffffff16938019156e22d473030f116ddee9f6b43ac78ba3861817156103255761018c610a31565b60208101907f42656e63686d61726b20455243323000000000000000000000000000000000008252519020908242116103185773ffffffffffffffffffffffffffffffffffffffff60405194169465383775081901600e52855f5260c06020600c20958654957f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f8252602082019586528660408301967fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc688528b6060850198468a528c608087019330855260a08820602e527f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9885252528688525260a082015220604e526042602c205f5260ff1660205260a43560405260c43560605260208060805f60015afa93853d510361030b577f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259460209401905585777f5e9f200000000000000000000000000000000000000000176040526034602c2055a3005b63ddafbaef5f526004601cfd5b631a15a3cc5f526004601cfd5b633f68539a5f526004601cfd5b346100fa5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100fa576103696109eb565b602435906387a211a2600c52335f526020600c2080548084116103d25783900390555f526020600c20818154019055602052600c5160601c337fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef602080a3602060405160018152f35b63f4d678b85f526004601cfd5b346100fa575f7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100fa5761044a610418610a31565b7f42454e43484d41524b5f455243323000000000000000000000000000000000006020820152604051918291826109a3565b0390f35b346100fa5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100fa576104856109eb565b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8216908082149033141517610553576387a211a2600c52815f526020600c2054916387a211a2600c525f526020600c20918254928382116103d257815f94039055806805345cdf77eb68f44c54036805345cdf77eb68f44c5582527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef602083a3005b7feeddf6ab000000000000000000000000000000000000000000000000000000005f5260045ffd5b346100fa5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100fa576105b26109eb565b6338377508600c525f52602080600c2054604051908152f35b346100fa5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100fa576106026109eb565b6387a211a2600c525f52602080600c2054604051908152f35b346100fa575f7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100fa57602060a0610655610a31565b828101907f42656e63686d61726b20455243323000000000000000000000000000000000008252519020604051907f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f8252838201527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc6604082015246606082015230608082015220604051908152f35b346100fa575f7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100fa57602060405160128152f35b346100fa5760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100fa576107556109eb565b61075d610a0e565b604435908260601b6e22d473030f116ddee9f6b43ac78ba333036107f5575b6387a211a217600c526020600c2080548084116103d25783900390555f526020600c2081815401905560205273ffffffffffffffffffffffffffffffffffffffff600c5160601c91167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef602080a3602060405160018152f35b33602052637f5e9f208117600c526034600c2090815491821961081b575b50905061077c565b82851161083257846387a211a29303905585610813565b6313be252b5f526004601cfd5b346100fa575f7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100fa5760206805345cdf77eb68f44c54604051908152f35b346100fa5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100fa576108b96109eb565b602435908119156e22d473030f116ddee9f6b43ac78ba373ffffffffffffffffffffffffffffffffffffffff831618171561032557602052637f5e9f20600c52335f52806034600c20555f52602c5160601c337f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560205fa3602060405160018152f35b346100fa575f7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100fa5761044a610975610a31565b7f42656e63686d61726b20455243323000000000000000000000000000000000006020820152604051918291825b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f602060409481855280519182918282880152018686015e5f8582860101520116010190565b6004359073ffffffffffffffffffffffffffffffffffffffff821682036100fa57565b6024359073ffffffffffffffffffffffffffffffffffffffff821682036100fa57565b604051906040820182811067ffffffffffffffff821117610a5557604052600f8252565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b906e22d473030f116ddee9f6b43ac78ba373ffffffffffffffffffffffffffffffffffffffff821614610ac557602052637f5e9f20600c525f526034600c205490565b50507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9056fea164736f6c634300081e000a"; }