From 172d052ca3f4004e5e2da0309c6e3dece83fa034 Mon Sep 17 00:00:00 2001 From: David Meister Date: Sun, 25 Oct 2026 20:32:09 +0000 Subject: [PATCH 1/3] WIP baseline: per-entrypoint context columns (M02) Co-Authored-By: Claude Opus 5.5 --- src/concrete/raindex/RaindexV6.sol | 45 ++++++++++------ src/lib/LibRaindex.sol | 84 ++++++++++++++++++++++-------- src/lib/LibRaindexArb.sol | 7 +-- src/lib/LibRaindexSubParser.sol | 40 ++++++++++++-- 4 files changed, 129 insertions(+), 47 deletions(-) diff --git a/src/concrete/raindex/RaindexV6.sol b/src/concrete/raindex/RaindexV6.sol index d7d3a9ce80..ae2f178490 100644 --- a/src/concrete/raindex/RaindexV6.sol +++ b/src/concrete/raindex/RaindexV6.sol @@ -52,6 +52,8 @@ import {LibOrder} from "../../lib/LibOrder.sol"; import { CALLING_CONTEXT_COLUMNS, CONTEXT_CALLING_CONTEXT_COLUMN, + CONTEXT_DEPOSIT_COLUMN, + CONTEXT_WITHDRAW_COLUMN, CONTEXT_CALCULATIONS_COLUMN, CONTEXT_CALCULATIONS_ROWS, CONTEXT_VAULT_IO_BALANCE_DIFF, @@ -62,7 +64,6 @@ import { } from "../../lib/LibRaindex.sol"; import {RaindexV6FlashLender} from "../../abstract/RaindexV6FlashLender.sol"; import {LibBytes32Array} from "rain-solmem-0.1.28/src/lib/LibBytes32Array.sol"; -import {LibBytes32Matrix} from "rain-solmem-0.1.28/src/lib/LibBytes32Matrix.sol"; import {LibFormatDecimalFloat} from "rain-math-float-0.3.10/src/lib/format/LibFormatDecimalFloat.sol"; import { @@ -175,13 +176,15 @@ contract RaindexV6 is IRaindexV6, IMetaV1_2, ReentrancyGuard, Multicall, Raindex if (post.length != 0) { LibRaindex.doPost( - LibBytes32Matrix.matrixFrom( + LibRaindex.callingContextColumn( + CONTEXT_DEPOSIT_COLUMN, LibBytes32Array.arrayFrom( bytes32(uint256(uint160(token))), bytes32(vaultId), Float.unwrap(beforeBalance), Float.unwrap(afterBalance), - bytes32(uint256(decimals)) + bytes32(uint256(decimals)), + bytes32(uint256(uint160(msg.sender))) ) ), post @@ -212,19 +215,22 @@ contract RaindexV6 is IRaindexV6, IMetaV1_2, ReentrancyGuard, Multicall, Raindex emit WithdrawV2(msg.sender, token, vaultId, targetAmount, withdrawAmount, withdrawAmountUint256); } - bytes32[] memory contextColumn = LibBytes32Array.arrayFrom( - bytes32(uint256(uint160(token))), - vaultId, - Float.unwrap(beforeBalance), - Float.unwrap(afterBalance), - Float.unwrap(targetAmount), - bytes32(uint256(decimals)) - ); - - bytes32[][] memory context = LibBytes32Matrix.matrixFrom(contextColumn); - if (post.length != 0) { - LibRaindex.doPost(context, post); + LibRaindex.doPost( + LibRaindex.callingContextColumn( + CONTEXT_WITHDRAW_COLUMN, + LibBytes32Array.arrayFrom( + bytes32(uint256(uint160(token))), + vaultId, + Float.unwrap(beforeBalance), + Float.unwrap(afterBalance), + Float.unwrap(targetAmount), + bytes32(uint256(decimals)), + bytes32(uint256(uint160(msg.sender))) + ) + ), + post + ); } } @@ -307,7 +313,9 @@ contract RaindexV6 is IRaindexV6, IMetaV1_2, ReentrancyGuard, Multicall, Raindex /// with a context of the order hash and the caller. function _doOrderPost(bytes32 orderHash, TaskV2[] calldata post) internal { LibRaindex.doPost( - LibBytes32Matrix.matrixFrom(LibBytes32Array.arrayFrom(orderHash, bytes32(uint256(uint160(msg.sender))))), + LibRaindex.callingContextColumn( + CONTEXT_CALLING_CONTEXT_COLUMN, LibBytes32Array.arrayFrom(orderHash, bytes32(uint256(uint160(msg.sender)))) + ), post ); } @@ -709,7 +717,10 @@ contract RaindexV6 is IRaindexV6, IMetaV1_2, ReentrancyGuard, Multicall, Raindex { bytes32[][] memory callingContext = new bytes32[][](CALLING_CONTEXT_COLUMNS); callingContext[CONTEXT_CALLING_CONTEXT_COLUMN - 1] = LibBytes32Array.arrayFrom( - order.hash(), bytes32(uint256(uint160(order.owner))), bytes32(uint256(uint160(counterparty))) + order.hash(), + bytes32(uint256(uint160(order.owner))), + bytes32(uint256(uint160(counterparty))), + bytes32(uint256(uint160(msg.sender))) ); // The calculations column holds the calculated max output and IO diff --git a/src/lib/LibRaindex.sol b/src/lib/LibRaindex.sol index e2055bfad7..e5737ebe2a 100644 --- a/src/lib/LibRaindex.sol +++ b/src/lib/LibRaindex.sol @@ -10,7 +10,12 @@ import { EvalV4 } from "rainlang-interface-0.2.13/src/interface/IInterpreterV4.sol"; import {LibNamespace, FullyQualifiedNamespace} from "rainlang-interface-0.2.13/src/lib/ns/LibNamespace.sol"; -import {LibContext} from "rainlang-interface-0.2.13/src/lib/caller/LibContext.sol"; +import { + LibContext, + CONTEXT_BASE_COLUMN, + CONTEXT_BASE_ROW_SENDER +} from "rainlang-interface-0.2.13/src/lib/caller/LibContext.sol"; +import {LibBytes32Array} from "rain-solmem-0.1.28/src/lib/LibBytes32Array.sol"; /// @dev Raindex context is actually fairly complex. The calling context column /// is populated before calculate order, but the remaining columns are only @@ -19,41 +24,50 @@ import {LibContext} from "rainlang-interface-0.2.13/src/lib/caller/LibContext.so /// as accounting limits such as current vault balances, etc. /// The token address and decimals for vault inputs and outputs IS available to /// the calculate order entrypoint, but not the final vault balances/diff. -uint256 constant CALLING_CONTEXT_COLUMNS = 4; +/// Each entrypoint fills only its own columns and leaves the rest empty, so a +/// word read outside the entrypoints that fill its cell reverts out of bounds +/// instead of reading another entrypoint's value. +uint256 constant CALLING_CONTEXT_COLUMNS = 7; uint256 constant CONTEXT_COLUMNS = CALLING_CONTEXT_COLUMNS + 1; -/// @dev Total number of context columns including extensions: base columns -/// plus 2 for signers and signed context start, 1 for deposit, 1 for withdraw. -uint256 constant CONTEXT_COLUMNS_EXTENDED = CONTEXT_COLUMNS + 2 + 1 + 1; +/// @dev Number of sub parser word tables, one per context column up to and +/// including the first signed context column. +uint256 constant CONTEXT_COLUMNS_EXTENDED = CONTEXT_SIGNED_CONTEXT_START_COLUMN + 1; -/// @dev Contextual data available to both calculate order and handle IO. The -/// order hash, order owner and order counterparty. IMPORTANT NOTE that the -/// typical base context of an order with the caller will often be an unrelated -/// clearer of the order rather than the owner or counterparty. +/// @dev Order column. Calculate order and handle IO get all rows; add and +/// remove order tasks get only the order hash and owner. IMPORTANT NOTE that +/// the clearer will often be unrelated to the owner or counterparty. uint256 constant CONTEXT_CALLING_CONTEXT_COLUMN = 1; -uint256 constant CONTEXT_CALLING_CONTEXT_ROWS = 3; +uint256 constant CONTEXT_CALLING_CONTEXT_ROWS = 4; uint256 constant CONTEXT_CALLING_CONTEXT_ROW_ORDER_HASH = 0; uint256 constant CONTEXT_CALLING_CONTEXT_ROW_ORDER_OWNER = 1; uint256 constant CONTEXT_CALLING_CONTEXT_ROW_ORDER_COUNTERPARTY = 2; +uint256 constant CONTEXT_CALLING_CONTEXT_ROW_ORDER_CLEARER = 3; -/// @dev Context rows for the deposit calling context column. Available to the -/// deposit post-action entrypoint. +/// @dev Deposit column. Filled only for deposit tasks. +uint256 constant CONTEXT_DEPOSIT_COLUMN = 5; uint256 constant CONTEXT_CALLING_CONTEXT_ROW_DEPOSIT_TOKEN = 0; uint256 constant CONTEXT_CALLING_CONTEXT_ROW_DEPOSIT_VAULT_ID = 1; uint256 constant CONTEXT_CALLING_CONTEXT_ROW_DEPOSIT_VAULT_BEFORE = 2; uint256 constant CONTEXT_CALLING_CONTEXT_ROW_DEPOSIT_VAULT_AFTER = 3; uint256 constant CONTEXT_CALLING_CONTEXT_ROW_DEPOSIT_TOKEN_DECIMALS = 4; +uint256 constant CONTEXT_CALLING_CONTEXT_ROW_DEPOSIT_DEPOSITOR = 5; -/// @dev Context rows for the withdraw calling context column. Available to the -/// withdraw post-action entrypoint. +/// @dev Withdraw column. Filled only for withdraw tasks. +uint256 constant CONTEXT_WITHDRAW_COLUMN = 6; uint256 constant CONTEXT_CALLING_CONTEXT_ROW_WITHDRAW_TOKEN = 0; uint256 constant CONTEXT_CALLING_CONTEXT_ROW_WITHDRAW_VAULT_ID = 1; uint256 constant CONTEXT_CALLING_CONTEXT_ROW_WITHDRAW_VAULT_BEFORE = 2; uint256 constant CONTEXT_CALLING_CONTEXT_ROW_WITHDRAW_VAULT_AFTER = 3; uint256 constant CONTEXT_CALLING_CONTEXT_ROW_WITHDRAW_TARGET_AMOUNT = 4; uint256 constant CONTEXT_CALLING_CONTEXT_ROW_WITHDRAW_TOKEN_DECIMALS = 5; +uint256 constant CONTEXT_CALLING_CONTEXT_ROW_WITHDRAW_WITHDRAWER = 6; + +/// @dev Post-arb column: the input, output and gas balances swept to the +/// sender. Filled only for the post-arb task. +uint256 constant CONTEXT_ARB_COLUMN = 7; /// @dev Calculations column contains the DECIMAL RESCALED calculations but /// otherwise provided as-is according to calculate order entrypoint @@ -91,23 +105,44 @@ uint256 constant CONTEXT_VAULT_IO_ROWS = 5; /// @dev Signed context signer addresses occupy their own column so that each /// signer can be matched to its corresponding signed context column. -uint256 constant CONTEXT_SIGNED_CONTEXT_SIGNERS_COLUMN = 5; +uint256 constant CONTEXT_SIGNED_CONTEXT_SIGNERS_COLUMN = 8; uint256 constant CONTEXT_SIGNED_CONTEXT_SIGNERS_ROWS = 1; uint256 constant CONTEXT_SIGNED_CONTEXT_SIGNERS_ROW = 0; /// @dev Signed context data columns start after the signers column. Each /// signer's data is a separate column at this offset + signer index. -uint256 constant CONTEXT_SIGNED_CONTEXT_START_COLUMN = 6; +uint256 constant CONTEXT_SIGNED_CONTEXT_START_COLUMN = 9; uint256 constant CONTEXT_SIGNED_CONTEXT_START_ROWS = 1; uint256 constant CONTEXT_SIGNED_CONTEXT_START_ROW = 0; library LibRaindex { - /// @dev Evaluates each task in `post` against `context` padded with empty - /// columns to `CALLING_CONTEXT_COLUMNS`, so the signers and signed context - /// columns are at `CONTEXT_SIGNED_CONTEXT_SIGNERS_COLUMN` and - /// `CONTEXT_SIGNED_CONTEXT_START_COLUMN` as in order evaluation. Tasks with - /// empty bytecode are skipped. + /// @dev Builds a calling context with `values` as context column `column` + /// and every other calling context column empty. + function callingContextColumn(uint256 column, bytes32[] memory values) + internal + pure + returns (bytes32[][] memory) + { + bytes32[][] memory callingContext = new bytes32[][](CALLING_CONTEXT_COLUMNS); + callingContext[column - 1] = values; + return callingContext; + } + + /// @dev Evaluates each Raindex post task in `post` against `context` padded + /// with empty columns to `CALLING_CONTEXT_COLUMNS`. Tasks with empty + /// bytecode are skipped. function doPost(bytes32[][] memory context, TaskV2[] memory post) internal { + evalPost(context, post, true); + } + + /// @dev As `doPost` for the post-arb task, with `arbColumn` as + /// `CONTEXT_ARB_COLUMN`. The calling contract is the arb, not a raindex, so + /// the base column drops its calling contract row. + function doArbPost(bytes32[] memory arbColumn, TaskV2[] memory post) internal { + evalPost(callingContextColumn(CONTEXT_ARB_COLUMN, arbColumn), post, false); + } + + function evalPost(bytes32[][] memory context, TaskV2[] memory post, bool callerIsRaindex) private { bytes32[][] memory callingContext = new bytes32[][](CALLING_CONTEXT_COLUMNS); for (uint256 i = 0; i < context.length; ++i) { callingContext[i] = context[i]; @@ -120,6 +155,11 @@ library LibRaindex { for (uint256 i = 0; i < post.length; ++i) { task = post[i]; if (task.evaluable.bytecode.length > 0) { + bytes32[][] memory fullContext = LibContext.build(callingContext, task.signedContext); + if (!callerIsRaindex) { + fullContext[CONTEXT_BASE_COLUMN] = + LibBytes32Array.arrayFrom(fullContext[CONTEXT_BASE_COLUMN][CONTEXT_BASE_ROW_SENDER]); + } //slither-disable-next-line unused-return (, bytes32[] memory writes) = task.evaluable.interpreter .eval4( @@ -128,7 +168,7 @@ library LibRaindex { namespace: qualifiedNamespace, bytecode: task.evaluable.bytecode, sourceIndex: SourceIndexV2.wrap(0), - context: LibContext.build(callingContext, task.signedContext), + context: fullContext, inputs: emptyStack, stateOverlay: emptyStateOverlay }) diff --git a/src/lib/LibRaindexArb.sol b/src/lib/LibRaindexArb.sol index d3c064406a..7beeee887d 100644 --- a/src/lib/LibRaindexArb.sol +++ b/src/lib/LibRaindexArb.sol @@ -15,7 +15,7 @@ library LibRaindexArb { /// @dev Sweeps the orders' input and output token balances and any native /// gas held by this contract to `msg.sender`, then evaluates the post-arb - /// task with a context column containing those balances as Floats. Only the + /// task with `CONTEXT_ARB_COLUMN` holding those balances as Floats. Only the /// two order tokens are swept; any other token left on the arb stays put. /// The Float columns are the balances read immediately before each transfer, /// so for fee-on-transfer tokens they can exceed the amount actually @@ -27,7 +27,6 @@ library LibRaindexArb { address ordersOutputToken, uint8 outputDecimals ) internal { - bytes32[][] memory context = new bytes32[][](1); bytes32[] memory col = new bytes32[](3); { @@ -72,10 +71,8 @@ library LibRaindexArb { col[2] = Float.unwrap(gasFloat); } - context[0] = col; - TaskV2[] memory post = new TaskV2[](1); post[0] = task; - LibRaindex.doPost(context, post); + LibRaindex.doArbPost(col, post); } } diff --git a/src/lib/LibRaindexSubParser.sol b/src/lib/LibRaindexSubParser.sol index b99cdc1a74..9d767d1db0 100644 --- a/src/lib/LibRaindexSubParser.sol +++ b/src/lib/LibRaindexSubParser.sol @@ -11,6 +11,13 @@ import { CONTEXT_BASE_ROW_CALLING_CONTRACT, CONTEXT_BASE_ROWS } from "rainlang-interface-0.2.13/src/lib/caller/LibContext.sol"; +import { + CONTEXT_CALLING_CONTEXT_ROW_ORDER_CLEARER, + CONTEXT_DEPOSIT_COLUMN, + CONTEXT_WITHDRAW_COLUMN, + CONTEXT_CALLING_CONTEXT_ROW_DEPOSIT_DEPOSITOR, + CONTEXT_CALLING_CONTEXT_ROW_WITHDRAW_WITHDRAWER +} from "./LibRaindex.sol"; import { CONTEXT_COLUMNS, CONTEXT_COLUMNS_EXTENDED, @@ -86,6 +93,9 @@ bytes constant WORD_WITHDRAW_VAULT_AFTER = "withdraw-vault-after"; bytes constant WORD_WITHDRAW_TARGET_AMOUNT = "withdraw-target-amount"; bytes constant WORD_WITHDRAW_TOKEN_DECIMALS = "withdraw-token-decimals"; +uint256 constant BASE_WORD_RAINDEX = 0; +uint256 constant BASE_WORDS_LENGTH = 1; + uint256 constant DEPOSIT_WORD_DEPOSITOR = 0; uint256 constant DEPOSIT_WORD_TOKEN = 1; uint256 constant DEPOSIT_WORD_VAULT_ID = 2; @@ -109,10 +119,34 @@ uint256 constant WITHDRAW_WORDS_LENGTH = 7; library LibRaindexSubParser { using LibUint256Matrix for uint256[][]; - /// @dev Maps the "sender" word to the base context column sender row. - function subParserSender(uint256, uint256, OperandV2) internal pure returns (bool, bytes memory, bytes32[] memory) { + /// @dev Maps the "order-clearer" word to the calling context column. + function subParserOrderClearer(uint256, uint256, OperandV2) + internal + pure + returns (bool, bytes memory, bytes32[] memory) + { + //slither-disable-next-line unused-return + return LibSubParse.subParserContext(CONTEXT_CALLING_CONTEXT_COLUMN, CONTEXT_CALLING_CONTEXT_ROW_ORDER_CLEARER); + } + + /// @dev Maps the "depositor" word to the deposit column. + function subParserDepositor(uint256, uint256, OperandV2) + internal + pure + returns (bool, bytes memory, bytes32[] memory) + { + //slither-disable-next-line unused-return + return LibSubParse.subParserContext(CONTEXT_DEPOSIT_COLUMN, CONTEXT_CALLING_CONTEXT_ROW_DEPOSIT_DEPOSITOR); + } + + /// @dev Maps the "withdrawer" word to the withdraw column. + function subParserWithdrawer(uint256, uint256, OperandV2) + internal + pure + returns (bool, bytes memory, bytes32[] memory) + { //slither-disable-next-line unused-return - return LibSubParse.subParserContext(CONTEXT_BASE_COLUMN, CONTEXT_BASE_ROW_SENDER); + return LibSubParse.subParserContext(CONTEXT_WITHDRAW_COLUMN, CONTEXT_CALLING_CONTEXT_ROW_WITHDRAW_WITHDRAWER); } /// @dev Maps the "calling-contract" word to the base context column. From 551ec954f19c0c0476fb0e73dd7798cfb9efe777 Mon Sep 17 00:00:00 2001 From: David Meister Date: Sun, 25 Oct 2026 20:49:42 +0000 Subject: [PATCH 2/3] M02: per-entrypoint context word columns (WIP phase 3) Co-Authored-By: Claude Opus 5.5 --- crates/test_fixtures/abis/RaindexV6.json | 2 +- .../abis/RaindexV6SubParser.json | 2 +- meta/RaindexV6SubParser.rain.meta | Bin 1380 -> 1372 bytes .../RaindexV6SubParserAuthoringMeta.rain.meta | Bin 7584 -> 7584 bytes src/concrete/parser/RaindexV6SubParser.sol | 42 +-- src/concrete/raindex/RaindexV6.sol | 3 +- src/generated/RaindexV6SubParserPointers.sol | 10 +- .../GenericPoolRaindexV6ArbOrderTaker.sol | 8 +- .../GenericPoolRaindexV6FlashBorrower.sol | 8 +- src/generated/candidate/RaindexV6.sol | 8 +- .../candidate/RaindexV6SubParser.sol | 8 +- .../RouteProcessorRaindexV6ArbOrderTaker.sol | 8 +- src/lib/LibRaindex.sol | 6 +- src/lib/LibRaindexSubParser.sol | 80 ++--- .../RaindexV6ArbOrderTaker.context.t.sol | 6 +- ...ndexV6ArbOrderTaker.finalizeDecimals.t.sol | 6 +- ...ndexV6FlashBorrower.finalizeDecimals.t.sol | 14 +- ...dexV6SubParser.operandHandlersWiring.t.sol | 63 ++-- .../parser/RaindexV6SubParser.routing.t.sol | 70 ++-- ...bParser.routingTokenDecimalsAndMasks.t.sol | 68 +--- .../parser/RaindexV6SubParser.signers.t.sol | 12 + ...RaindexV6SubParser.wordParsersWiring.t.sol | 296 ++--------------- .../RaindexV6.contextWordEntrypoints.t.sol | 307 ++++++++++++++++++ ...ibRaindexArb.finalizeArbContextWords.t.sol | 72 ++++ ...LibRaindexArb.finalizeArbTaskContext.t.sol | 18 +- .../LibRaindexSubParserContextFixture.sol | 16 +- test/util/lib/LibTestContextWords.sol | 42 +++ 27 files changed, 641 insertions(+), 534 deletions(-) create mode 100644 test/concrete/raindex/RaindexV6.contextWordEntrypoints.t.sol create mode 100644 test/lib/LibRaindexArb.finalizeArbContextWords.t.sol create mode 100644 test/util/lib/LibTestContextWords.sol diff --git a/crates/test_fixtures/abis/RaindexV6.json b/crates/test_fixtures/abis/RaindexV6.json index d242f0006f..c9ca4bf160 100644 --- a/crates/test_fixtures/abis/RaindexV6.json +++ b/crates/test_fixtures/abis/RaindexV6.json @@ -2362,7 +2362,7 @@ } ], "bytecode": { - "object": "0x6080806040523460395760017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00556150f5908161003e8239f35b5f80fdfe6080806040526004361015610012575f80fd5b5f3560e01c90816301ffc9a7146117cc575080631f69cb751461156f5780632cb77e9f146115435780632fbc4ba0146113f957806341d1514f146113c25780635cffe9de1461126657806360746119146110e2578063613255ab1461105f57806369c7285614610771578063709fb8a5146104375780639235084d146103e3578063ac9650d814610295578063d7e442ec14610237578063d9d98ce4146101865763fa501182146100c1575f80fd5b34610182576101403660031901126101825767ffffffffffffffff600435818111610182576100f4903690600401611b61565b6024358281116101825761010c903690600401611b61565b60c0366043190112610182576101043583811161018257610131903690600401611d07565b90610124359384116101825761014e61015c943690600401611d07565b9261015761264d565b61222d565b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055005b5f80fd5b34610182576040366003190112610182576001600160a01b036101a7611850565b166040516370a0823160e01b8152306004820152602081602481855afa90811561022c575f916101fa575b50156101e25760206040515f8152f35b60249060405190633c5bf76960e21b82526004820152fd5b90506020813d602011610224575b81610215602093836119d0565b810103126101825751826101d2565b3d9150610208565b6040513d5f823e3d90fd5b346101825760203660031901126101825760043567ffffffffffffffff81116101825761028f61026e61015c92369060040161181f565b919061027861264d565b60405192610285846119b4565b5f84523691611ddb565b90612ae5565b34610182576020806003193601126101825760043567ffffffffffffffff8111610182576102c790369060040161181f565b9190604051926102d6846119b4565b5f84528284016102e582611ab4565b946102f360405196876119d0565b8286526102ff83611ab4565b9361031186880195601f190186612211565b5f5b84811061037557604080518881528951818a018190525f92600582901b83018101918a918c9085015b8287106103495785850386f35b909192938280610365600193603f198a820301865288516118dc565b960192019601959291909261033c565b806103c4886103be61039160019560059d9c9d1b8701876120f1565b929089846040519586938585013782018381015f81528b519283915e015f838201520380845201826119d0565b30613965565b6103ce828a611fd7565b526103d98189611fd7565b5001969596610313565b3461018257600319602036820112610182576004359067ffffffffffffffff821161018257608090823603011261018257610422606091600401612139565b90604051921515835260208301526040820152f35b34610182576003196040368201126101825760043567ffffffffffffffff8082116101825760c082600401938336030112610182576024359081116101825761048490369060040161181f565b9061048d61264d565b6104be6104b96104b46104ad6104a38880612124565b60408101906120f1565b36916119f2565b6138fb565b613950565b801561075f576001101561074d57602483016104da8186611f44565b90501561073b5760448401946104f08682611f44565b9050156107295761055661051e9661054a61051561050e8580612124565b9585611f44565b99909285611f44565b91909261053b6040519761053189611900565b3389523690611a56565b9a60209b8c8901523691611acc565b60408601523691611acc565b60608301526064850135608083015261056e8261268f565b91825f525f875260405f209586541596876105b2575b888860017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055604051908152f35b6001905560a46001600160a01b03917f87491344dfbcf91f6cbbc610cbbeedc85313d37a02df0c93527f7ea5f8db717f83855116604051908152878c8201526060604082015280610606606082018861203f565b0390a1019161061583856120f1565b9050610679575b5050505061066d929161066561064e61028f933390919060405192600284526020840152604083015260608201604052565b906040519160018352602083015260408201604052565b923691611ddb565b82808080808080610584565b6106866104ad84866120f1565b61068f816146ec565b156107025750937fd46c2c56b35c8210e9e712ec3f02242d5fc90187c0ac8ed80cc33626846ec3698961066d9897956106f56106d86106659761064e9761028f9b5116936120f1565b866040519586958652850152606060408501526060840191611d36565b0390a1938395965061061c565b89610725604051928392630c89984b60e31b8452600484015260248301906118dc565b0390fd5b60405163540e5f0b60e01b8152600490fd5b604051636c44ef8f60e01b8152600490fd5b604051633c8270bd60e21b8152600490fd5b604051632cff108b60e21b8152600490fd5b34610182576003196020368201126101825767ffffffffffffffff600435116101825760c09060043536030112610182576107aa61264d565b5f80806107bf60048035608481019101611e8d565b90501561104d5760246004350135926107d7846126f4565b1561103b576060806040516107eb81611968565b6107f3611ee2565b81525f60208201525f6040820152015261080b611ee2565b5061086b61086661084561083b61083561082f608460043501600435600401611e8d565b90611f14565b80611f2f565b6040810190611f44565b602061085e61082f608460043501600435600401611e8d565b013591611f7a565b611d22565b936001600160a01b036108ba6108666108a161089761083561082f608460043501600435600401611e8d565b6060810190611f44565b604061085e61082f608460043501600435600401611e8d565b81604051976108c889611930565b16875216602086015260408501526108ea608460043501600435600401611e8d565b9490506001604051950160051b85016040525f905f5b610914608460043501600435600401611e8d565b9050811080611028575b15610e7557610937608460043501600435600401611e8d565b821015610e61578160051b810135607e1982360301811215610182576080818301360312610182576040519161096c83611968565b8181013567ffffffffffffffff81116101825761098e90369084840101611b61565b835280820160208181013590850152604080820135908501526060013567ffffffffffffffff8111610182576109c79236920101611d07565b606082015280516001600160a01b036109e96040830151602085015190611fd7565b5151166001600160a01b0385511614801590610e2d575b610e1b57610a18602083015160408401519083613035565b610a218161268f565b91825f525f60205260405f2054155f14610a85575051604080513381526001600160a01b039092166020830152810191909152600191907fb70c12fa453793fa6818ec07c91e74363a47aa6a6829dcd9533937fdf30314f390606090a15b01610900565b9190610ab6602084979597015160408501519060608601519060405192610aab846119b4565b5f845233918661307c565b925f93610ace60608201516044600435013590612717565b15610b3557505051604080513381526001600160a01b03909216602083015281019190915260019291907fe3151dc8cb7a54ffc4baabd28c1f241c94d510b5e5b502491ac3cad6c16316d590606090a15b8115610b2d575b5092610a7f565b905088610b26565b610b4260408201516126f4565b158015610e08575b15610b9f57505051604080513381526001600160a01b03909216602083015281019190915260019291907f500b713857325f9e6dcb52ae832eca9109d107ed1aae9cb4928b4c1e13f051aa90606090a1610b1f565b9250925050600196959691610bb8606460043501611feb565b15610d755796610c2897610c3860408401516040880151610bd981836133d5565b15610d6d5750925b610c32848592610c1b610c1560608a01516001600160e01b03601b918660e01d92828816810b928260e01d9216900b613da5565b90613f60565b9d8e9260408d01516134a0565b60408c01526134ca565b996134ca565b98610c4384846134f4565b610c4d8482613552565b60405192338452608060208501526060610c73845160808088015261010087019061203f565b93602081015160a0870152604081015160c0870152015192607f198582030160e0860152835180825260208201906020808260051b8501019601925f5b828110610d0f57505050505092806001979695937f194f1feb3b4d7076a2c272e774e792e0c48bb8c7aa1a9a3671c1cd6da9e6b4c193610d0a96604084015260608301520390a180858c5101808d5260051b8c0152613664565b610b1f565b9091929396602080610d60600193601f198782030189528b51906001600160a01b0382511681526040610d4f8584015160608785015260608401906120be565b9201519060408184039101526118dc565b9901950193929101610cb0565b905092610be1565b610c2890610c386060840151610c32610db3610c1560408801516001600160e01b0394601b90868360e01d9316820b91878260e01d9216900b613da5565b60408a0151610dc281836133d5565b15610e005750915b829c8d916060890151908116155f14610df1575060408801515b96879460408d01516134a0565b610dfb90856133fc565b610de4565b905091610dca565b50610e1660608201516133b2565b610b4a565b60405163936bb5ad60e01b8152600490fd5b506001600160a01b03610e496060830151604085015190611fd7565b5151166001600160a01b036020860151161415610a00565b634e487b7160e01b5f52603260045260245ffd5b50919390610e87606460043501611feb565b1561102257835b6004356004013590610ea082826133d5565b6110045750508490610ec0856001600160a01b0360208701511633612fcc565b505060a46004350190610ed8826004356004016120f1565b905015159081610ffc575b50610f5b575b506001600160a01b03610eff929351163361273e565b50505b8351811015610f275780610f21610f1b60019387611fd7565b5161383d565b01610f02565b5060409160017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f005582519182526020820152f35b90506001600160a01b03602084015116610f856001600160a01b03855116926004356004016120f1565b929091333b1561018257610fcd5f93604051958694859463691f9ed760e01b8652600486015260248501528960448501528a606485015260a0608485015260a4840191611d36565b038183335af190811561022c57859115610ee9579050610fed9150611984565b5f836001600160a01b03610ee9565b905088610ee3565b604492506040519163573b6f4160e01b835260048301526024820152fd5b84610e8e565b5061103660408301516126f4565b61091e565b60405163315f9e2360e21b8152600490fd5b604051639c95219f60e01b8152600490fd5b3461018257602080600319360112610182576024816001600160a01b03611084611850565b16604051928380926370a0823160e01b82523060048301525afa90811561022c575f916110b5575b50604051908152f35b90508181813d83116110db575b6110cc81836119d0565b810103126101825751826110ac565b503d6110c2565b34610182576110f036611890565b92916110fd94919461264d565b6111088383336126c0565b611111816126f4565b15611235578160ff91611129856111ec969533612cff565b61113381836133d5565b1561122f575080935b61114885828533612f6e565b917f8045c25080b0868951141ed0a91720bcad09a8364a2b3109ee1fd49c1f0bc8b860c0611177898833612fcc565b97906001600160a01b0360405192338452169a8b6020840152856040840152886060840152608083015260a0820152a16040519660068852602088015260408701526060860152608085015260a08401521660c082015260e08101604052906040519160018352602083015260408201604052565b90806112185760017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055005b6112279261028f913691611ddb565b80808061015c565b9361113c565b50604051623a3a4d60e21b81523360048201526001600160a01b039190911660248201526044810191909152606490fd5b34610182576080366003190112610182576004356001600160a01b039081811680910361018257611295611866565b6044359167ffffffffffffffff916064358381116101825736602382011215610182578060040135938411610182573660248583010111610182576113229560209216936112e4868587612e8f565b60405196879283926323e30c8b60e01b84523360048501528760248501528860448501525f606485015260a06084850152602460a485019201611d36565b03815f855af193841561022c575f9461138e575b507f439148f0bbc682ca079e46d6e2c2f0c1e3b820f1a291b069d8882abf8cf18dd984036113755761136a93503091612f08565b602060405160018152f35b604051630b6c58a960e31b815260048101859052602490fd5b9093506020813d6020116113ba575b816113aa602093836119d0565b8101031261018257519284611336565b3d915061139d565b346101825760603660031901126101825760206113f16113e0611850565b6113e8611866565b60443591612cff565b604051908152f35b346101825761140736611890565b9280949261141361264d565b61141e8285336126c0565b611427816126f4565b15611513578061143b61148a92863361273e565b9790957f7f9dfa19cf1cc2f806f2f860fbc9c056b601fb1afc0e9b843dfe5c63616268e660806040513381526001600160a01b038416998a60208301528560408301526060820152a1336127e4565b939091856114b85760017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055005b6115079661028f956106659460ff93604051956005875260208701526040860152606085015260808401521660a082015260c08101604052906040519160018352602083015260408201604052565b8080808080808061015c565b506040516306dde9c360e41b81523360048201526001600160a01b03841660248201526044810191909152606490fd5b34610182576020366003190112610182576004355f525f6020526020600160405f205414604051908152f35b34610182576003196040368201126101825767ffffffffffffffff9060043582811161018257806004019160a08236039182011261018257602435848111610182576115bf90369060040161181f565b90936115c961264d565b5f946001600160a01b0394856115de84611d22565b1633036117aa576115f76115f23685611b61565b61268f565b805f525f60205260405f2096600188541461163e575b60208960017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00556040519015158152f35b9091929394959697505f6001985560405196338852826020890152606060408901528161166a8761187c565b166060890152602484013590606219018112156101825783019060a06080890152806116986004840161187c565b166101008901526116ab6024830161187c565b16610120880152604481013560221982360301811215610182570190602460048301359201988211610182578136038913610182577f09d18501db0080ca2d6cd7c17fa7255daff4b2d503ea93b76ff68b6752ea8e63878061066595608461177361028f9a60209f6117329061179d9f9a606061014061064e9d0152610160880191611d36565b6117646117596117456044880185611d56565b605f198a8603810160a08c01529491611d8b565b926064870190611d56565b918784030160c0880152611d8b565b91013560e08301520390a13390919060405192600284526020840152604083015260608201604052565b828080808080808061160d565b6024866117b685611d22565b6040516335252be360e01b815291166004820152fd5b34610182576020366003190112610182576004359063ffffffff60e01b82168092036101825760209163e414309160e01b811490811561180e575b5015158152f35b6301ffc9a760e01b14905083611807565b9181601f840112156101825782359167ffffffffffffffff8311610182576020808501948460051b01011161018257565b600435906001600160a01b038216820361018257565b602435906001600160a01b038216820361018257565b35906001600160a01b038216820361018257565b906080600319830112610182576004356001600160a01b0381168103610182579160243591604435916064359067ffffffffffffffff8211610182576118d89160040161181f565b9091565b805180835260209291819084018484015e5f828201840152601f01601f1916010190565b60a0810190811067ffffffffffffffff82111761191c57604052565b634e487b7160e01b5f52604160045260245ffd5b6060810190811067ffffffffffffffff82111761191c57604052565b6040810190811067ffffffffffffffff82111761191c57604052565b6080810190811067ffffffffffffffff82111761191c57604052565b67ffffffffffffffff811161191c57604052565b60e0810190811067ffffffffffffffff82111761191c57604052565b6020810190811067ffffffffffffffff82111761191c57604052565b90601f8019910116810190811067ffffffffffffffff82111761191c57604052565b92919267ffffffffffffffff821161191c5760405191611a1c601f8201601f1916602001846119d0565b829481845281830111610182578281602093845f960137010152565b9080601f8301121561018257816020611a53933591016119f2565b90565b91906060838203126101825760405190611a6f82611930565b8193611a7a8161187c565b8352611a886020820161187c565b602084015260408101359167ffffffffffffffff831161018257604092611aaf9201611a38565b910152565b67ffffffffffffffff811161191c5760051b60200190565b929192611ad882611ab4565b604092611ae860405192836119d0565b819581835260208093019160061b84019381851161018257915b848310611b1157505050505050565b8583830312610182578386918251611b288161194c565b611b318661187c565b81528286013583820152815201920191611b02565b9080601f8301121561018257816020611a5393359101611acc565b91909160a0818403126101825760405190611b7b82611900565b8193611b868261187c565b835267ffffffffffffffff9160208101358381116101825782611baa918301611a56565b602085015260408101358381116101825782611bc7918301611b46565b6040850152606081013592831161018257611be86080939284938301611b46565b60608501520135910152565b909291611c0084611ab4565b916040611c1060405194856119d0565b839580855260208095019160059160051b8401948086116101825784935b868510611c3f575050505050505050565b67ffffffffffffffff90853582811161018257870190606082850312610182578451611c6a81611930565b611c738361187c565b81528a83013584811161018257830185601f8201121561018257803590611c9982611ab4565b91611ca6895193846119d0565b8083528d808401918b1b83010191888311610182578e809101915b838310611cf757509150508201528583013593841161018257611ce8858c95869501611a38565b86820152815201940193611c2e565b82358152918101918f9101611cc1565b9080601f8301121561018257816020611a5393359101611bf4565b356001600160a01b03811681036101825790565b908060209392818452848401375f828201840152601f01601f1916010190565b9035601e198236030181121561018257016020813591019167ffffffffffffffff8211610182578160061b3603831361018257565b9190808252602080920192915f905b828210611da8575050505090565b909192936001906001600160a01b03611dc08761187c565b16815285830135838201526040908101950193920190611d9a565b90929192611de881611ab4565b91604091611df960405194856119d0565b839581855260208095019160051b8301938185116101825783925b858410611e245750505050505050565b67ffffffffffffffff908435828111610182578601908382860312610182578351611e4e8161194c565b82358481116101825786611e63918501611a56565b81528983013593841161018257611e7e868b95869501611d07565b83820152815201930192611e14565b903590601e1981360301821215610182570180359067ffffffffffffffff821161018257602001918160051b3603831361018257565b60405190611ed082611930565b60606040835f81525f60208201520152565b60405190611eef82611900565b5f608083828152611efe611ec3565b6020820152606060408201526060808201520152565b9015610e6157803590607e1981360301821215610182570190565b903590609e1981360301821215610182570190565b903590601e1981360301821215610182570180359067ffffffffffffffff821161018257602001918160061b3603831361018257565b9190811015610e615760061b0190565b805115610e615760200190565b805160011015610e615760400190565b805160021015610e615760600190565b805160031015610e615760800190565b805160041015610e615760a00190565b8051821015610e615760209160051b010190565b3580151581036101825790565b9081518082526020808093019301915f5b828110612017575050505090565b835180516001600160a01b031686528201518583015260409094019392810192600101612009565b906080806120b56120a361209160406001600160a01b0380895116885260208901519060a060208a01528082511660a08a015260208201511660c08901520151606060e08801526101008701906118dc565b60408701518682036040880152611ff8565b60608601518582036060870152611ff8565b93015191015290565b9081518082526020808093019301915f5b8281106120dd575050505090565b8351855293810193928101926001016120cf565b903590601e1981360301821215610182570180359067ffffffffffffffff82116101825760200191813603831361018257565b903590605e1981360301821215610182570190565b6121506115f26121498380611f2f565b3690611b61565b5f525f602052600160405f2054036121ec5780612170816121dc93611f2f565b6121d461218f6121946020850135938460408701359384923690611b61565b613035565b6121ac6121a18580611f2f565b946060810190611e8d565b92906121cc604051966121be886119b4565b5f88525f3681373690611b61565b933691611bf4565b92339261307c565b6040810151606090910151600192565b505f905f905f90565b5f5b60808110612203575050565b6060828201526020016121f7565b5f5b82811061221f57505050565b606082820152602001612213565b9291926001600160a01b039081815116828451161461263b57606081018051908361225b6064358094611fd7565b515116906040968787015192866122756084358096611fd7565b5151161480159061260a575b6125f9578785015192866122986044358096611fd7565b515116876122a7878651611fd7565b515116146125e8576122b88661268f565b805f525f602052895f20541561259557506122d28861268f565b998a5f525f602052895f20541561253f57899a5087899a51958c6101203389528060208a01528801612304908b61203f565b888103828a0152612315908d61203f565b958260608a01528960808a01528560a08a01528360a4359d8e60c08c015260c4359a8b60e08201528060e4359a8b610100830152037f6fa7f4c28634b0a9d6831401c45ae468195fb63aed07308935c35374ff5d9e3991a1511691519161237b836119b4565b8a5f8452612389948d61307c565b975116908b5191612399836119b4565b8a5f84526123a7948d61307c565b958951976123b489611968565b5f895260208901995f8b528b8a01965f885260608b01965f88526123d88b8b614710565b8d5289528c6123e78b8d614710565b9091528089528c51906123f9916134a0565b918d518a51612407916134a0565b97612411846133b2565b8015612530575b61251e5789958f8f966124e59f9e9c8f976124e09f9b96978f7fd9fa84dd790c969daa5c33d8050dc06b4a9b59d5b42e2be5f5e8ae20447f618d9f9a60a09f9a8f996124a16124b99f9361249c868f976124a79f6124b09c60609f83879361249685612496946124a79f61249c9961249091516134f4565b516134f4565b51613552565b61383d565b51611fd7565b515116336127e4565b50500151611fd7565b50508a5191338352895160208401528a518c840152516060830152516080820152a1613664565b613664565b6001600160e01b0380915116159182612512575b50506125025750565b516321badf1f60e01b8152600490fd5b51161590505f806124f9565b508e51630d86822160e01b8152600490fd5b5061253a896133b2565b612418565b505095519651338152949096166001600160a01b031660208501525050506040810193909352507fb70c12fa453793fa6818ec07c91e74363a47aa6a6829dcd9533937fdf30314f391905080606081015b0390a1565b95519851338152969098166001600160a01b031660208701525050505060408201527fb70c12fa453793fa6818ec07c91e74363a47aa6a6829dcd9533937fdf30314f39350915081905060608101612590565b8851631cd2f1c760e21b8152600490fd5b875163936bb5ad60e01b8152600490fd5b508561261d606089015160a43590611fd7565b515116866126318a88015160443590611fd7565b5151161415612281565b604051630a98f1f360e21b8152600490fd5b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00600281541461267d5760029055565b604051633ee5aeb560e01b8152600490fd5b6040516126ba816126ac602082019460208652604083019061203f565b03601f1981018352826119d0565b51902090565b9091156126cb575050565b6040516305dbdfd960e41b81526001600160a01b03918216600482015291166024820152604490fd5b612713905f60e01d906001600160e01b038160e01d9116601b0b614773565b1290565b90612713916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b6147f4565b92919261274a82613a38565b93612754816133b2565b6127d25784816001600160e01b036127739360e01d9116601b0b614873565b92908093156127a9575b5082908161278d575b5050509190565b6127a1926001600160a01b03309216612f08565b5f8181612786565b9092505f1981146127be57600101915f61277d565b634e487b7160e01b5f52601160045260245ffd5b604051632eaefac360e21b8152600490fd5b939291936127f1836133b2565b61288f578461280d57612805939450612fcc565b50505f905f90565b6001600160a01b039392919380911694855f52602060018152604092835f20961695865f528152825f20825f52815261284a835f205494856134ca565b95612854876133b2565b612877575f97885260018252838820908852815282872091875252909320829055565b835163c5e12af560e01b815260048101889052602490fd5b60405163793a8f5560e01b815260048101849052602490fd5b919060408382031261018257825167ffffffffffffffff908181116101825784019082601f830112156101825781516020926128e382611ab4565b916128f160405193846119d0565b808352848084019160051b830101918683116101825785809101915b8383106129805750505050948281015191821161018257019180601f8401121561018257825161293c81611ab4565b9361294a60405195866119d0565b818552838086019260051b820101928311610182578301905b828210612971575050505090565b81518152908301908301612963565b825181529181019186910161290d565b90808251908181526020809101926020808460051b8301019501935f915b8483106129be5750505050505090565b90919293949584806129dc600193601f198682030187528a516120be565b98019301930191949392906129ae565b91906020928381526001600160a01b0382511684820152838201516040820152612a26604083015160e060608401526101008301906118dc565b9060608301516080820152612a4d608084015192601f1993848483030160a0850152612990565b9260a081015193838382030160c08401528680865192838152019501905f5b818110612a9057505050611a5394955060c060e091015192828503019101526120be565b825187529588019591880191600101612a6c565b90604082019082526020606081936040838201528551809452019301915f5b828110612ad1575050505090565b835185529381019392810192600101612ac3565b916040805191612af483611900565b60048084526020612b068186016121f5565b5f5b8751811015612b3b5780612b1e6001928a611fd7565b51612b298289611fd7565b52612b348188611fd7565b5001612b08565b5092955092939093335f52308352855f2091865190612b598261194c565b612b61611ec3565b8252606085819301528751612b75816119b4565b5f8152885191612b84836119b4565b5f83525f3681375f5b8151811015612cf257612ba08183611fd7565b5190888c8b84519189818401518d8d8251612bc8575b50505050505050506001915001612b8d565b5f612c3797948197948c9794612bf58c956001600160a01b039d8e81818d51169c0151169b015190613b17565b94865199612c028b611998565b8a528901528488015286015260808501528a60a08501528b60c08501525180958194829363d04dfe2360e01b845283016129ec565b03915afa938415612ce8578b915f95612cc2575b508451612c60575b50908b8e89838d8d612bb6565b51015116803b1561018257612c8f925f918c8f84905180978195829463012c676d60e21b845233908401612aa4565b03925af1918215612cb857600192612ca9575b8981612c53565b612cb290611984565b5f612ca2565b8c513d5f823e3d90fd5b612cdf9195503d805f833e612cd781836119d0565b8101906128a8565b9050935f612c4b565b8e513d5f823e3d90fd5b5050505050505050509050565b8215612d34576001600160a01b038091165f52600160205260405f2091165f5260205260405f20905f5260205260405f205490565b909150612d4082613d49565b6001600160a01b03809316906040918251946370a0823160e01b86528416938460048701526020928387602481865afa968715612e56575f97612e60575b5083612d97612d9083612dc79a614a28565b50906141b3565b508651636eb1769f60e11b81526001600160a01b0390941660048501523060248501529297889081906044820190565b0381865afa968715612e56575f97612e25575b50612d90612deb91611a5398614a28565b50612df681836133d5565b15612e1d5750935b5f5260018252825f20905f528152815f20905f8052525f2054906134ca565b905093612dfe565b96508387813d8311612e4f575b612e3c81836119d0565b8101031261018257955195612d90612dda565b503d612e32565b85513d5f823e3d90fd5b96508387813d8311612e88575b612e7781836119d0565b810103126101825795519583612d7e565b503d612e6d565b6040519263a9059cbb60e01b5f526001600160a01b0380931660045260245260205f60448180855af160015f5114811615612ee9575b8360405215612ed357505050565b635274afe760e01b835216600482015260249150fd5b6001811516612eff57813b15153d151616612ec5565b833d5f823e3d90fd5b9092604051936323b872dd60e01b5f526001600160a01b0393848092166004521660245260445260205f60648180855af160015f5114811615612f58575b836040525f60605215612ed357505050565b6001811516612eff57813b15153d151616612f46565b93929193612f7b836133b2565b61288f5784612f8f5761280593945061273e565b6001600160a01b039392919380911694855f52602060018152604092835f20961695865f528152825f20825f52815261284a835f205494856134a0565b90929192612fd981613a38565b93612fe3816133b2565b6130235784816001600160e01b036130029360e01d9116601b0b614873565b50809281613011575050509190565b6001600160a01b036127a19316612e8f565b604051632d1671a360e11b8152600490fd5b91613060906060613055936001600160a01b039485916040880151611fd7565b515116940151611fd7565b5151161461306a57565b604051631cd2f1c760e21b8152600490fd5b9491936132bb919360c0915f61324260409283519461309a86611998565b6130a2611ee2565b86526020958487820152848682015260609781868a809401528260808201528660a082015201526131f28551916130d883611900565b600483526130e78884016121f5565b8d6130f18161268f565b9c896001600160a01b039e8f94859182865116908d5194600386528501528c840152168c820152608081018a5261312786611f8a565b5261313185611f8a565b50885161313d81611930565b6002815289368c83013761315086611f97565b5261315a85611f97565b5060ff8a6131bd8b8501936131a78761318081613178858a51611fd7565b515116613d49565b9751168861318f848951611fd7565b5151168561319e858a51611fd7565b51015191612cff565b966131b3828751611fd7565b5151169451611fd7565b51015192169093929190604051946005865260208601526040850152606084015260808301525f60a083015260c08201604052565b6131fb82611fa7565b5261320581611fa7565b506132298a8d8d60ff8a6131bd8d8501936131a78761318081613178858a51611fd7565b61323282611fb7565b5261323c81611fb7565b50613b17565b95878a511697848b0191825191868184511693015116928a85523087528580862091510151865191613273836119b4565b86835287519561328287611998565b86528886015286850152848885015289608085015260a084015260c08301528351808098819463d04dfe2360e01b8352600483016129ec565b03915afa9687156133a8575f945f98613386575b5084516002811061336f575081838601519501516132f56132ef88611fc7565b51611fb7565b5161330081836133d5565b156133675750925b61332a8685919060405192600284526020840152604083015260608201604052565b61333388611fa7565b5261333d87611fa7565b5082519961334a8b611998565b8a52890152870152850152608084015260a083015260c082015290565b905092613308565b602490835190630fbb8e5560e21b82526004820152fd5b90975061339e9194503d805f833e612cd781836119d0565b939093965f6132cf565b50513d5f823e3d90fd5b6133d1905f60e01d906001600160e01b038160e01d9116601b0b614773565b1390565b906133d1916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b6147f4565b6134236001600160e01b0392838316601b0b9260e01d938160e01d9116601b0b8484613f6a565b90637ffffff58213613473575b9061343a916141b3565b929092158061346b575b61344d57505090565b6044925060405191638eba4d0760e01b835260048301526024820152fd5b508215613444565b61347d8282614e53565b1561343057604483856040519163d556b11160e01b835260048301526024820152fd5b611a5391610c15916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b6143b9565b611a5391610c15916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b61457d565b61354e91608081018261351061350a8351611fc7565b51611fc7565b526135476135416001600160a01b038094515116936135386135328551611fc7565b51611f8a565b51169251611fc7565b51611fa7565b5191612f6e565b5050565b9060808101918061356661350a8551611fb7565b526001600160a01b038092515116916135826135328551611fb7565b51166135916135418551611fb7565b51908161362c576135a1836133b2565b61288f579183917f4cb6e22a3e7e651d7cf0376cff48f20f5007a54147777865be7f5f6c38c50f4a9593612590955f52602090600182526135f7604094855f20835f528452855f20855f528452855f20546134ca565b945f5260018252835f20905f528152825f20915f52525f20555b51604051918291338352604060208401526040830190612990565b9161365d917f4cb6e22a3e7e651d7cf0376cff48f20f5007a54147777865be7f5f6c38c50f4a9593612590956127e4565b5050613611565b60c0810151908151915f926137d8575b506137196020918281510151926001600160a01b039081818187511696015116928660a082019485518252308452604097888320898686510151015160808601518b51916136c1836119b4565b8683528c51936136d0856119b4565b8785528d51966136df88611998565b8752898701528c86015260016060860152608085015260a084015260c08301528851808099819463d04dfe2360e01b8352600483016129ec565b03915afa9485156137ce5787956137b0575b50845161373c575b50505050505050565b81905101510151169051813b156137ac57918491849383613771965180978195829463012c676d60e21b845260048401612aa4565b03925af19081156137a3575061378c575b8080808080613733565b6137968291611984565b6137a05780613782565b80fd5b513d84823e3d90fd5b8480fd5b6137c59195503d8089833e612cd781836119d0565b9050935f61372b565b86513d89823e3d90fd5b6001600160a01b03602080845101510151169060a083015190823b156101825761381b925f928360405180968195829463012c676d60e21b845260048401612aa4565b03925af1801561022c571561367457613835919250611984565b5f905f613674565b6080810161384e6135418251611fb7565b5191821561385b57505050565b6138756135326001600160a01b0380935151169351611fb7565b5116815f5260209160018352604092835f20835f528152835f20855f528152835f2054936001600160e01b0385166138b0575b505050505050565b6138d4955f9284845260018152828420868552815282842091845252812055612fcc565b5f8080806138a8565b81156138e7570490565b634e487b7160e01b5f52601260045260245ffd5b6040815110613943576020810151908051603f1981019081116127be5760051c821161392f5760016020920160051b010190565b505060405161393d816119b4565b5f815290565b5060405161393d816119b4565b80511561396057602001515f1a90565b505f90565b905f8091602081519101845af480806139e3575b156139995750506040513d81523d5f602083013e60203d82010160405290565b156139c057604051639996b31560e01b81526001600160a01b039091166004820152602490fd5b3d156139d1576040513d5f823e3d90fd5b60405163d6bda27560e01b8152600490fd5b503d1515806139795750813b1515613979565b60041115613a0057565b634e487b7160e01b5f52602160045260245ffd5b602090939291936001600160a01b036040820195168152613a34836139f6565b0152565b613a40614f41565b6040805163b7bad1b160e01b81526001600160a01b0383166004820152909182826024815f73200e12d10bb0c5e4a17e7018f0f1161919bb93895af1928315613b0e575f925f94613ad9575b50613a96836139f6565b600183141580613ac7575b613aab5750505090565b5163ee07877f60e01b8152918291610725919060048401613a14565b50613ad1836139f6565b821515613aa1565b90809450613afd9293503d8511613b07575b613af581836119d0565b810190614849565b919091925f613a8c565b503d613aeb565b513d5f823e3d90fd5b90805191613b2483611ab4565b91613b3f604094613b37865195866119d0565b808552611ab4565b601f199460209186013686840137835183519095908015613d3e576001613b959101965b6001978891010197613b8c613b778a611ab4565b99613b8486519b8c6119d0565b808b52611ab4565b01848901612211565b85805f9684516002815233878201523086820152606081018652613bb88b611f8a565b52613bc28a611f8a565b505f925b613cfa575b5050508351613bde575b50505050505090565b85809598979692980181613bf28289611fd7565b52613bfd8188611fd7565b505f925b613c10575b5085969750613bd5565b8451831015613cf5576001600160a01b03613c8781613c2f8689611fd7565b51511686613c3d878a611fd7565b51015187815160051b9101207f19457468657265756d205369676e6564204d6573736167653a0a3332000000005f52601c52603c5f208c613c7e888b611fd7565b5101519161499f565b15613cdd57868098999a928192613c9e878a611fd7565b515116613cab8787611fd7565b52019385613cb98289611fd7565b510151613cc6868c611fd7565b52613cd1858b611fd7565b50019290989796613c01565b8951630a57f30960e31b815260048101859052602490fd5b613c06565b9091968151881015613d35578280910197613d158184611fd7565b51613d208a8d611fd7565b52613d2b898c611fd7565b5001919081613bc6565b96829150613bcb565b50613b955f96613b63565b613d51614f41565b60408051630782d7e160e01b81526001600160a01b03831660048201529091828260248173200e12d10bb0c5e4a17e7018f0f1161919bb93895afa928315613b0e575f925f94613ad95750613a96836139f6565b9091939284158215175f14613dbf5750505090505f905f90565b82810192600160fd1b8082019083011760fe1c613ef6575b5050613de281614b18565b93613dec81614b18565b94613df78682614b38565b90918215613ee7575f9083986f0785ee10d5da46d900f436a000000000808611613ed9575b50670de0b6b3a7640000808b11613eca575b50633b9aca00808b11613ebb575b50612710808b11613ead575b5098805b613e9c575081906118d8989982600a0a9109960195817fcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccd0a93838211900382610100031b9203901c170291614b4b565b60019290920191600a900480613e4c565b60049a04998a930192613e48565b600991939a049901915f613e3c565b601291939a049901915f613e2e565b85049950602592505f613e1c565b509290506118d8949550614b4b565b5f821215613f4a57808413613f3c575b7f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb2841315613dd7579092506118d8939491614a56565b9092506118d8939491614abd565b80841215613f06579092506118d8939491614a56565b61343a82826141b3565b92909180613f90576044848460405191637a97930f60e01b835260048301526024820152fd5b90919280155f14613fa557505050505f905f90565b613fbe93613fb291614c05565b92919490938492614c05565b9093919284613fcc88614b18565b91613fd686614b18565b947f161bcca7119915b50764b4abe86529797775a5f171951000000000000000000094604c9186881061417d575b030191600160ff1b98838a018112155f1461414a575050035b5f955f821280614141575b614123575b5f811280614111575b6140f35786820103966001600160ff1b03881490816140e9575b50806140e0575b806140d7575b6140b957509061406d9291614db1565b915f8113614080575b506118d893614b4b565b9091604c82136140ae5761409791600a0a906138dd565b9081156140a4575f614076565b505050505f905f90565b50505050505f905f90565b876044916040519163d556b11160e01b835260048301526024820152fd5b505f851261405d565b50828414614057565b905088145f614050565b604489836040519163d556b11160e01b835260048301526024820152fd5b50806001600160ff1b03018213614036565b955080870186131561413b5786818703015b9561402d565b5f614135565b505f8113614028565b89985090920390506001600160ff1b038190038701821361416e570186019461401d565b5050505050505050505f905f90565b7f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee80000000000000000009650604b9250614004565b81156138e7570590565b8082601b82810b83146143a8577d90e40fbeea1d3a4abc8955e946fe31cdcf66f634e10000000000000000008405614354575b8380820b0361434357507b199999999999999999999999999999999999999999999999999999987b0ccccccccccccccccccccccccccccccccccccccccccccccccccccccc840111156142f4575b838060030b03614278575b80841361425c5750506001600160e01b036001925b60e01b91161791565b8303600a0a80156138e7576001600160e01b0391071592614253565b92915f8413156142c857509061428e8383614e53565b6142aa57637ffffffe1901600a0a810290637fffffff9261423e565b506044916040519163d556b11160e01b835260048301526024820152fd5b637fffffff1992830390604382136140ae576142e791600a0a906141a9565b9182156140a4579261423e565b5f198401808060030b146143085750614233565b90506001600160e01b039293507b7fffffffffffffffffffffffffffffffffffffffffffffffffffffff915060e01b9260ff1d181617905f90565b600190940193600a909305926141e6565b937f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee8000000000000000000840515614395576305f5e100600894058094819201955b9150506141e6565b620186a06005940580948192019561438d565b508261423357505050505f90600190565b919291600160ff1b84016143d1576118d89350614e6c565b906118d8935f039161457d565b919291600160ff1b919080158061456b5750906143fa91614c05565b9490929091905f868585858282138015614562575b614545575b505050508682841860ff1c94860391039081604c03811161452a5701600a0a808205919084614510575b505081019182821860ff1c111561450857826001600160ff1b03146144ea57905f600192135f146144bb57600a9004915b01925b8115811761447f57509190565b80614498575b508015614490579190565b505f91508190565b91926144ae9203600160ff1b01600a0a906141a9565b600160ff1b91905f614485565b600a60037fe666666666666666666666666666666666666666666666666666666666666667920104019161446f565b604490836040519163d556b11160e01b835260048301526024820152fd5b509092614472565b810761451d575b8061443e565b60ff1d600117015f614517565b505050919350614538579190565b60018160ff1d1790039190565b5f9a50909750909550600160ff1b94509250905086808080614414565b50835f1261440f565b156145765750509190565b9350919050565b93929193841581158181176146ce5750509061459891614c05565b91949082956145a982958294614c05565b80969294919693878684821380156146c5575b6146ac575b5050505050508682841860ff1c94860391039081604c03811161452a5701600a0a808205919084614692575b505081019182821860ff1c111561468a57826001600160ff1b03146144ea57905f600192135f1461465b57600a9004915b01925b8115811761462e57509190565b8061463e57508015614490579190565b600160ff1b936146559291038401600a0a906141a9565b5f614485565b600a60037fe666666666666666666666666666666666666666666666666666666666666667920104019161461e565b509092614621565b810761469f575b806145ed565b60ff1d600117015f614699565b929b5098509196509450925090505f80808080806145c1565b508584126145bc565b93959390929190156146e4575050614490579190565b945092915050565b6008815110613960576008015167ffffffffffffffff1667ff0a89c674ee78741490565b916040830192604061474a610c15606087519401938451906001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b613da5565b94519301614759815186612717565b614761575050565b909350611a53919250519251836133fc565b92915f9060018184145f871287151717176147ed575f928082136147df575b03604c81135f8212176147d357600a0a90846147b183820293846141a9565b146147c6575050156147c2575f9190565b5f90565b9093509015611a53579190565b5050156147c2575f9190565b5f9560019450925090614792565b5050505f90565b93929190918083145f83125f87121883158715171717614843575f928082136148365703604c81135f8212176147d357600a0a90846147b183820293846141a9565b9194600193509190614792565b50919050565b919082604091031261018257815160048110156101825760209092015160ff811681036101825790565b91925f83121561489b576044838360405191634a7d166b60e01b835260048301526024820152fd5b9192836148ad57505090505f90600190565b60ff8116820191808312614975575f8312156148e5575050604c198112614490575f03600a0a916148de83826138dd565b9283021490565b909293915f81135f1461496b57604d811361494057600a0a9283156138e757835f190483116149175750500290600190565b60405163c849483b60e01b815260048101849052602481019290925260ff166044820152606490fd5b5060405163c849483b60e01b81526004810192909252602482015260ff919091166044820152606490fd5b5050905090600190565b60405163c849483b60e01b815260048101869052602481019190915260ff82166044820152606490fd5b9091813b6149da576149b19192614faa565b506149bb816139f6565b1591826149c757505090565b6001600160a01b03918216911614919050565b6020918160645f935160405192630b135d3f60e11b9788855260048501526040602485015286820190604485015e8281018201859052601f01601f191601915afa905f5114601f3d11161690565b9060ff165f03916001600160ff1b0382115f14614a4e57600a6001818404940192061590565b909190600190565b909392915f614a66918184613da5565b9490945f8483019182019412159081614ab3575b8115614aa9575b50614a8b57505090565b604492506040519163d556b11160e01b835260048301526024820152fd5b905083125f614a81565b8281129150614a7a565b614ad293600160fe1b90810193920190613da5565b9081815f821215614b09575050604b19821261280557614af7915f03600a0a906141a9565b9081614b01575f90565b600160ff1b90565b93600160ff1b90910192509050565b5f811215611a5357600160ff1b90808203614b31575090565b90505f0390565b905f198183099102908180821091030391565b92939291905f8184181215614be0576001600160ff1b039283831115614bca57600160ff1b93838503614b8057505050509190565b90919293508514614b9a575050600a600191045f03920190565b604051630ed8062160e21b8152600481019190915260248101919091526044810182905260648101849052608490fd5b5090915050600160ff1b81146127be575f039190565b90916001600160ff1b0380841115612786578514614b9a575050600a60019104920190565b9190918015614da757827f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee800000000000000000080830515614cb5575b507f19999999999999999999999999999999999999999999999999999999999999997f0ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc830110614ca6575b8313614c905791905f90565b919060018060ff1b926001600160ff1b03030190565b9290600a02905f190192614c84565b6f4b3b4ca85a86c47a098a22400000000080840515614d95575b507728c87cb5c89a2571ebfdcb54864ada834a00000000000000830515614d7e575b7b097edd871cfda3a5697758bf0e3cbb5ac5741c640000000000000000830515614d6a575b7e3899162693736ac531a5a58f1fbb4b746504382ca7e4000000000000000000830515614d5a57820515614d4b575b5f614c39565b9290600a02905f190192614d45565b9391606402916001190193614d16565b93916402540be40002916009190193614d16565b9391678ac7230489e8000002916012190193614cf1565b6025198301955092909202915f614ccf565b505f915081908190565b90915f198383099280830292838086109503948086039584871015614e2f5714614e27579082910960018219018216809204600280826003021880830282030280830282030280830282030280830282030280830282030280920290030293600183805f03040190848311900302920304170290565b505091500490565b60648386866040519263362ced0960e11b8452600484015260248301526044820152fd5b611a5391905f811215614e67575f03614fe4565b614fe4565b909291600160ff1b91828101614efe5750808414614ef457808413918215614eec578185035b604c811115614edb5750505f915b15614ecc57507f8000000000000000000000000000000000000000000000000000000000000001019190565b92506001600160ff1b03039190565b600a0a9081156138e7570491614ea0565b848203614e92565b505090505f905f90565b93614f0b92945f036143de565b80939180928114614f1f575b50505f039190565b915092506001600160ff1b0383146144ea57600a600191059201915f80614f17565b73200e12d10bb0c5e4a17e7018f0f1161919bb9389803b158015614f7f575b614f675750565b602490604051906373e6d7b360e01b82526004820152fd5b507f1de7d717526cba131d684e312dedbf0852adef9cced9e36798ae4937f7145d41813f1415614f60565b8151919060418303614fda57614fd39250602082015190606060408401519301515f1a90615073565b9192909190565b50505f9160029190565b90637ffffff581131561506d57637ffffffe1981019060438213615066575f82121561503a57637fffffff91505f0301600a0a7b8000000000000000000000000000000000000000000000000000000202111590565b50600a0a80156138e7577b80000000000000000000000000000000000000000000000000000001041090565b5050151590565b50505f90565b91907f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a084116150ea579160209360809260ff5f9560405194855216868401526040830152606082015282805260015afa1561022c575f516001600160a01b038116156150e057905f905f90565b505f906001905f90565b5050505f916003919056", + "object": "0x6080806040523460395760017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055615139908161003e8239f35b5f80fdfe6080806040526004361015610012575f80fd5b5f3560e01c90816301ffc9a71461178f575080631f69cb75146115595780632cb77e9f1461152d5780632fbc4ba0146113cb57806341d1514f146113945780635cffe9de14611238578063607461191461109c578063613255ab1461101957806369c728561461072b578063709fb8a5146104375780639235084d146103e3578063ac9650d814610295578063d7e442ec14610237578063d9d98ce4146101865763fa501182146100c1575f80fd5b34610182576101403660031901126101825767ffffffffffffffff600435818111610182576100f4903690600401611b41565b6024358281116101825761010c903690600401611b41565b60c0366043190112610182576101043583811161018257610131903690600401611ce7565b90610124359384116101825761014e61015c943690600401611ce7565b9261015761263d565b61221d565b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055005b5f80fd5b34610182576040366003190112610182576001600160a01b036101a7611813565b166040516370a0823160e01b8152306004820152602081602481855afa90811561022c575f916101fa575b50156101e25760206040515f8152f35b60249060405190633c5bf76960e21b82526004820152fd5b90506020813d602011610224575b81610215602093836119b0565b810103126101825751826101d2565b3d9150610208565b6040513d5f823e3d90fd5b346101825760203660031901126101825760043567ffffffffffffffff81116101825761028f61026e61015c9236906004016117e2565b919061027861263d565b6040519261028584611994565b5f84523691611dbb565b906128f6565b34610182576020806003193601126101825760043567ffffffffffffffff8111610182576102c79036906004016117e2565b9190604051926102d684611994565b5f84528284016102e582611a94565b946102f360405196876119b0565b8286526102ff83611a94565b9361031186880195601f190186612201565b5f5b84811061037557604080518881528951818a018190525f92600582901b83018101918a918c9085015b8287106103495785850386f35b909192938280610365600193603f198a8203018652885161189f565b960192019601959291909261033c565b806103c4886103be61039160019560059d9c9d1b8701876120e1565b929089846040519586938585013782018381015f81528b519283915e015f838201520380845201826119b0565b306139a9565b6103ce828a611fc7565b526103d98189611fc7565b5001969596610313565b3461018257600319602036820112610182576004359067ffffffffffffffff821161018257608090823603011261018257610422606091600401612129565b90604051921515835260208301526040820152f35b34610182576003196040368201126101825760043567ffffffffffffffff8082116101825760c08260040193833603011261018257602435908111610182576104849036906004016117e2565b61048f92919261263d565b6104c06104bb6104b66104af6104a58880612114565b60408101906120e1565b36916119d2565b61393f565b613994565b801561071957600110156107075760248201926104dd8486611f24565b9050156106f55760448301936104f38587611f24565b9050156106e3576105596105219561054d6105186105118a80612114565b948a611f24565b9890928a611f24565b91909261053e60405196610534886118c3565b3388523690611a36565b9960209a8b8801523691611aac565b60408501523691611aac565b6060820152606484013560808201526105718161267f565b90815f525f865260405f209485541595866105b5575b878760017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055604051908152f35b6001905560a46001600160a01b03917f87491344dfbcf91f6cbbc610cbbeedc85313d37a02df0c93527f7ea5f8db717f83855116604051908152868b8201526060604082015280610609606082018861202f565b0390a10191610618838a6120e1565b905061063b575b50505061062e939495506126b0565b8190838080808080610587565b6106486104af848b6120e1565b61065181614730565b156106bc57509761068f7fd46c2c56b35c8210e9e712ec3f02242d5fc90187c0ac8ed80cc33626846ec369936106af9361062e999a9b5116926120e1565b92906040519384938452868c850152606060408501526060840191611d16565b0390a1859493878061061f565b886106df604051928392630c89984b60e31b84526004840152602483019061189f565b0390fd5b60405163540e5f0b60e01b8152600490fd5b604051636c44ef8f60e01b8152600490fd5b604051633c8270bd60e21b8152600490fd5b604051632cff108b60e21b8152600490fd5b34610182576003196020368201126101825767ffffffffffffffff600435116101825760c090600435360301126101825761076461263d565b5f808061077960048035608481019101611e6d565b90501561100757602460043501359261079184612742565b15610ff5576060806040516107a58161192b565b6107ad611ec2565b81525f60208201525f604082015201526107c5611ec2565b506108256108206107ff6107f56107ef6107e9608460043501600435600401611e6d565b90611ef4565b80611f0f565b6040810190611f24565b60206108186107e9608460043501600435600401611e6d565b013591611f5a565b611d02565b936001600160a01b0361087461082061085b6108516107ef6107e9608460043501600435600401611e6d565b6060810190611f24565b60406108186107e9608460043501600435600401611e6d565b8160405197610882896118f3565b16875216602086015260408501526108a4608460043501600435600401611e6d565b9490506001604051950160051b85016040525f905f5b6108ce608460043501600435600401611e6d565b9050811080610fe2575b15610e2f576108f1608460043501600435600401611e6d565b821015610e1b578160051b810135607e198236030181121561018257608081830136031261018257604051916109268361192b565b8181013567ffffffffffffffff81116101825761094890369084840101611b41565b835280820160208181013590850152604080820135908501526060013567ffffffffffffffff8111610182576109819236920101611ce7565b606082015280516001600160a01b036109a36040830151602085015190611fc7565b5151166001600160a01b0385511614801590610de7575b610dd5576109d2602083015160408401519083612e36565b6109db8161267f565b91825f525f60205260405f2054155f14610a3f575051604080513381526001600160a01b039092166020830152810191909152600191907fb70c12fa453793fa6818ec07c91e74363a47aa6a6829dcd9533937fdf30314f390606090a15b016108ba565b9190610a70602084979597015160408501519060608601519060405192610a6584611994565b5f8452339186613079565b925f93610a8860608201516044600435013590612765565b15610aef57505051604080513381526001600160a01b03909216602083015281019190915260019291907fe3151dc8cb7a54ffc4baabd28c1f241c94d510b5e5b502491ac3cad6c16316d590606090a15b8115610ae7575b5092610a39565b905088610ae0565b610afc6040820151612742565b158015610dc2575b15610b5957505051604080513381526001600160a01b03909216602083015281019190915260019291907f500b713857325f9e6dcb52ae832eca9109d107ed1aae9cb4928b4c1e13f051aa90606090a1610ad9565b9250925050600196959691610b72606460043501611fdb565b15610d2f5796610be297610bf260408401516040880151610b9381836133d8565b15610d275750925b610bec848592610bd5610bcf60608a01516001600160e01b03601b918660e01d92828816810b928260e01d9216900b613de9565b90613fa4565b9d8e9260408d01516134a3565b60408c01526134cd565b996134cd565b98610bfd84846134f7565b610c078482613555565b60405192338452608060208501526060610c2d845160808088015261010087019061202f565b93602081015160a0870152604081015160c0870152015192607f198582030160e0860152835180825260208201906020808260051b8501019601925f5b828110610cc957505050505092806001979695937f194f1feb3b4d7076a2c272e774e792e0c48bb8c7aa1a9a3671c1cd6da9e6b4c193610cc496604084015260608301520390a180858c5101808d5260051b8c01526136a8565b610ad9565b9091929396602080610d1a600193601f198782030189528b51906001600160a01b0382511681526040610d098584015160608785015260608401906120ae565b92015190604081840391015261189f565b9901950193929101610c6a565b905092610b9b565b610be290610bf26060840151610bec610d6d610bcf60408801516001600160e01b0394601b90868360e01d9316820b91878260e01d9216900b613de9565b60408a0151610d7c81836133d8565b15610dba5750915b829c8d916060890151908116155f14610dab575060408801515b96879460408d01516134a3565b610db590856133ff565b610d9e565b905091610d84565b50610dd060608201516133b5565b610b04565b60405163936bb5ad60e01b8152600490fd5b506001600160a01b03610e036060830151604085015190611fc7565b5151166001600160a01b0360208601511614156109ba565b634e487b7160e01b5f52603260045260245ffd5b50919390610e41606460043501611fdb565b15610fdc57835b6004356004013590610e5a82826133d8565b610fbe5750508490610e7a856001600160a01b0360208701511633612dcd565b505060a46004350190610e92826004356004016120e1565b905015159081610fb6575b50610f15575b506001600160a01b03610eb9929351163361278c565b50505b8351811015610ee15780610edb610ed560019387611fc7565b51613881565b01610ebc565b5060409160017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f005582519182526020820152f35b90506001600160a01b03602084015116610f3f6001600160a01b03855116926004356004016120e1565b929091333b1561018257610f875f93604051958694859463691f9ed760e01b8652600486015260248501528960448501528a606485015260a0608485015260a4840191611d16565b038183335af190811561022c57859115610ea3579050610fa79150611947565b5f836001600160a01b03610ea3565b905088610e9d565b604492506040519163573b6f4160e01b835260048301526024820152fd5b84610e48565b50610ff06040830151612742565b6108d8565b60405163315f9e2360e21b8152600490fd5b604051639c95219f60e01b8152600490fd5b3461018257602080600319360112610182576024816001600160a01b0361103e611813565b16604051928380926370a0823160e01b82523060048301525afa90811561022c575f9161106f575b50604051908152f35b90508181813d8311611095575b61108681836119b0565b81010312610182575182611066565b503d61107c565b34610182576110aa36611853565b6110b261263d565b6110bd84863361270e565b6110c683612742565b1561120b576110d6848633612b00565b6110e081856133d8565b15611205575082935b6110f585828833612d6f565b9690947f8045c25080b0868951141ed0a91720bcad09a8364a2b3109ee1fd49c1f0bc8b860c0611126898533612dcd565b94906001600160a01b0360405192338452169a8b6020840152876040840152856060840152608083015260a0820152a1836111815760017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055005b6111f89761028f9660ff946040519960078b5260208b015260408a01526060890152608088015260a08701521660c08501523360e0850152610100840193846040526111cc85611977565b600785526111dd61012082016121e5565b6111e685611fb7565b526111f084611fb7565b503691611dbb565b808080808080808061015c565b936110e9565b604051623a3a4d60e21b81523360048201526001600160a01b038616602482015260448101859052606490fd5b34610182576080366003190112610182576004356001600160a01b039081811680910361018257611267611829565b6044359167ffffffffffffffff916064358381116101825736602382011215610182578060040135938411610182573660248583010111610182576112f49560209216936112b6868587612c90565b60405196879283926323e30c8b60e01b84523360048501528760248501528860448501525f606485015260a06084850152602460a485019201611d16565b03815f855af193841561022c575f94611360575b507f439148f0bbc682ca079e46d6e2c2f0c1e3b820f1a291b069d8882abf8cf18dd984036113475761133c93503091612d09565b602060405160018152f35b604051630b6c58a960e31b815260048101859052602490fd5b9093506020813d60201161138c575b8161137c602093836119b0565b8101031261018257519284611308565b3d915061136f565b346101825760603660031901126101825760206113c36113b2611813565b6113ba611829565b60443591612b00565b604051908152f35b34610182576113d936611853565b839493926113e561263d565b6113f084863361270e565b6113f981612742565b156114ff578061140d61145c92873361278c565b9590967f7f9dfa19cf1cc2f806f2f860fbc9c056b601fb1afc0e9b843dfe5c63616268e660806040513381526001600160a01b0384169a8b60208301528560408301526060820152a133612832565b9590938261148a5760017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055005b6114f39661028f9560ff936040519860068a5260208a01526040890152606088015260808701521660a08501523360c085015260e0840193846040526114cf85611977565b600785526114e061010082016121e5565b6114e985611fa7565b526111f084611fa7565b8080808080808061015c565b6040516306dde9c360e41b81523360048201526001600160a01b038616602482015260448101859052606490fd5b34610182576020366003190112610182576004355f525f6020526020600160405f205414604051908152f35b3461018257600319604036820112610182576004359067ffffffffffffffff808311610182578260040160a08436039384011261018257602435828111610182576115a89036906004016117e2565b906115b161263d565b5f946001600160a01b0394856115c686611d02565b16330361176d576115df6115da3687611b41565b61267f565b91825f525f60205260405f20966001885414611627575b60208960017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00556040519015158152f35b9091929394959697505f600198556040519133835284602084015260606040840152816116538961183f565b16606084015260248a013590606219018112156101825789019060a06080840152806116816004840161183f565b166101008401526116946024830161183f565b16610120830152604481013560221982360301811215610182570195602460048801359701928711610182578636038313610182576020986084611750849361170f7f09d18501db0080ca2d6cd7c17fa7255daff4b2d503ea93b76ff68b6752ea8e63976117609c6060610140890152610160880191611d16565b6117416117366117226044880185611d36565b605f198a8603810160a08c01529491611d6b565b926064870190611d36565b918784030160c0880152611d6b565b91013560e08301520390a16126b0565b82808080808080806115f6565b60248661177987611d02565b6040516335252be360e01b815291166004820152fd5b34610182576020366003190112610182576004359063ffffffff60e01b82168092036101825760209163e414309160e01b81149081156117d1575b5015158152f35b6301ffc9a760e01b149050836117ca565b9181601f840112156101825782359167ffffffffffffffff8311610182576020808501948460051b01011161018257565b600435906001600160a01b038216820361018257565b602435906001600160a01b038216820361018257565b35906001600160a01b038216820361018257565b906080600319830112610182576004356001600160a01b0381168103610182579160243591604435916064359067ffffffffffffffff82116101825761189b916004016117e2565b9091565b805180835260209291819084018484015e5f828201840152601f01601f1916010190565b60a0810190811067ffffffffffffffff8211176118df57604052565b634e487b7160e01b5f52604160045260245ffd5b6060810190811067ffffffffffffffff8211176118df57604052565b6040810190811067ffffffffffffffff8211176118df57604052565b6080810190811067ffffffffffffffff8211176118df57604052565b67ffffffffffffffff81116118df57604052565b60e0810190811067ffffffffffffffff8211176118df57604052565b610100810190811067ffffffffffffffff8211176118df57604052565b6020810190811067ffffffffffffffff8211176118df57604052565b90601f8019910116810190811067ffffffffffffffff8211176118df57604052565b92919267ffffffffffffffff82116118df57604051916119fc601f8201601f1916602001846119b0565b829481845281830111610182578281602093845f960137010152565b9080601f8301121561018257816020611a33933591016119d2565b90565b91906060838203126101825760405190611a4f826118f3565b8193611a5a8161183f565b8352611a686020820161183f565b602084015260408101359167ffffffffffffffff831161018257604092611a8f9201611a18565b910152565b67ffffffffffffffff81116118df5760051b60200190565b929192611ab882611a94565b604092611ac860405192836119b0565b819581835260208093019160061b84019381851161018257915b848310611af157505050505050565b8583830312610182578386918251611b088161190f565b611b118661183f565b81528286013583820152815201920191611ae2565b9080601f8301121561018257816020611a3393359101611aac565b91909160a0818403126101825760405190611b5b826118c3565b8193611b668261183f565b835267ffffffffffffffff9160208101358381116101825782611b8a918301611a36565b602085015260408101358381116101825782611ba7918301611b26565b6040850152606081013592831161018257611bc86080939284938301611b26565b60608501520135910152565b909291611be084611a94565b916040611bf060405194856119b0565b839580855260208095019160059160051b8401948086116101825784935b868510611c1f575050505050505050565b67ffffffffffffffff90853582811161018257870190606082850312610182578451611c4a816118f3565b611c538361183f565b81528a83013584811161018257830185601f8201121561018257803590611c7982611a94565b91611c86895193846119b0565b8083528d808401918b1b83010191888311610182578e809101915b838310611cd757509150508201528583013593841161018257611cc8858c95869501611a18565b86820152815201940193611c0e565b82358152918101918f9101611ca1565b9080601f8301121561018257816020611a3393359101611bd4565b356001600160a01b03811681036101825790565b908060209392818452848401375f828201840152601f01601f1916010190565b9035601e198236030181121561018257016020813591019167ffffffffffffffff8211610182578160061b3603831361018257565b9190808252602080920192915f905b828210611d88575050505090565b909192936001906001600160a01b03611da08761183f565b16815285830135838201526040908101950193920190611d7a565b90929192611dc881611a94565b91604091611dd960405194856119b0565b839581855260208095019160051b8301938185116101825783925b858410611e045750505050505050565b67ffffffffffffffff908435828111610182578601908382860312610182578351611e2e8161190f565b82358481116101825786611e43918501611a36565b81528983013593841161018257611e5e868b95869501611ce7565b83820152815201930192611df4565b903590601e1981360301821215610182570180359067ffffffffffffffff821161018257602001918160051b3603831361018257565b60405190611eb0826118f3565b60606040835f81525f60208201520152565b60405190611ecf826118c3565b5f608083828152611ede611ea3565b6020820152606060408201526060808201520152565b9015610e1b57803590607e1981360301821215610182570190565b903590609e1981360301821215610182570190565b903590601e1981360301821215610182570180359067ffffffffffffffff821161018257602001918160061b3603831361018257565b9190811015610e1b5760061b0190565b805115610e1b5760200190565b805160011015610e1b5760400190565b805160021015610e1b5760600190565b805160031015610e1b5760800190565b805160041015610e1b5760a00190565b805160051015610e1b5760c00190565b8051821015610e1b5760209160051b010190565b3580151581036101825790565b9081518082526020808093019301915f5b828110612007575050505090565b835180516001600160a01b031686528201518583015260409094019392810192600101611ff9565b906080806120a561209361208160406001600160a01b0380895116885260208901519060a060208a01528082511660a08a015260208201511660c08901520151606060e088015261010087019061189f565b60408701518682036040880152611fe8565b60608601518582036060870152611fe8565b93015191015290565b9081518082526020808093019301915f5b8281106120cd575050505090565b8351855293810193928101926001016120bf565b903590601e1981360301821215610182570180359067ffffffffffffffff82116101825760200191813603831361018257565b903590605e1981360301821215610182570190565b6121406115da6121398380611f0f565b3690611b41565b5f525f602052600160405f2054036121dc5780612160816121cc93611f0f565b6121c461217f6121846020850135938460408701359384923690611b41565b612e36565b61219c6121918580611f0f565b946060810190611e6d565b92906121bc604051966121ae88611994565b5f88525f3681373690611b41565b933691611bd4565b923392613079565b6040810151606090910151600192565b505f905f905f90565b5f5b60e081106121f3575050565b6060828201526020016121e7565b5f5b82811061220f57505050565b606082820152602001612203565b9291926001600160a01b039081815116828451161461262b57606081018051908361224b6064358094611fc7565b515116906040968787015192866122656084358096611fc7565b515116148015906125fa575b6125e9578785015192866122886044358096611fc7565b51511687612297878651611fc7565b515116146125d8576122a88661267f565b805f525f602052895f20541561258557506122c28861267f565b998a5f525f602052895f20541561252f57899a5087899a51958c6101203389528060208a015288016122f4908b61202f565b888103828a0152612305908d61202f565b958260608a01528960808a01528560a08a01528360a4359d8e60c08c015260c4359a8b60e08201528060e4359a8b610100830152037f6fa7f4c28634b0a9d6831401c45ae468195fb63aed07308935c35374ff5d9e3991a1511691519161236b83611994565b8a5f8452612379948d613079565b975116908b519161238983611994565b8a5f8452612397948d613079565b958951976123a48961192b565b5f895260208901995f8b528b8a01965f885260608b01965f88526123c88b8b614754565b8d5289528c6123d78b8d614754565b9091528089528c51906123e9916134a3565b918d518a516123f7916134a3565b97612401846133b5565b8015612520575b61250e5789958f8f966124d59f9e9c8f976124d09f9b96978f7fd9fa84dd790c969daa5c33d8050dc06b4a9b59d5b42e2be5f5e8ae20447f618d9f9a60a09f9a8f996124916124a99f9361248c868f976124979f6124a09c60609f83879361248685612486946124979f61248c9961248091516134f7565b516134f7565b51613555565b613881565b51611fc7565b51511633612832565b50500151611fc7565b50508a5191338352895160208401528a518c840152516060830152516080820152a16136a8565b6136a8565b6001600160e01b0380915116159182612502575b50506124f25750565b516321badf1f60e01b8152600490fd5b51161590505f806124e9565b508e51630d86822160e01b8152600490fd5b5061252a896133b5565b612408565b505095519651338152949096166001600160a01b031660208501525050506040810193909352507fb70c12fa453793fa6818ec07c91e74363a47aa6a6829dcd9533937fdf30314f391905080606081015b0390a1565b95519851338152969098166001600160a01b031660208701525050505060408201527fb70c12fa453793fa6818ec07c91e74363a47aa6a6829dcd9533937fdf30314f39350915081905060608101612580565b8851631cd2f1c760e21b8152600490fd5b875163936bb5ad60e01b8152600490fd5b508561260d606089015160a43590611fc7565b515116866126218a88015160443590611fc7565b5151161415612271565b604051630a98f1f360e21b8152600490fd5b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00600281541461266d5760029055565b604051633ee5aeb560e01b8152600490fd5b6040516126aa8161269c602082019460208652604083019061202f565b03601f1981018352826119b0565b51902090565b61270c92916126db61028f923390919060405192600284526020840152604083015260608201604052565b92604051936126e985611977565b600785526126f9602086016121e5565b61270285611f6a565b526111f084611f6a565b565b909115612719575050565b6040516305dbdfd960e41b81526001600160a01b03918216600482015291166024820152604490fd5b612761905f60e01d906001600160e01b038160e01d9116601b0b6147b7565b1290565b90612761916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b614838565b92919261279882613a7c565b936127a2816133b5565b6128205784816001600160e01b036127c19360e01d9116601b0b6148b7565b92908093156127f7575b508290816127db575b5050509190565b6127ef926001600160a01b03309216612d09565b5f81816127d4565b9092505f19811461280c57600101915f6127cb565b634e487b7160e01b5f52601160045260245ffd5b604051632eaefac360e21b8152600490fd5b9392919361283f836133b5565b6128dd578461285b57612853939450612dcd565b50505f905f90565b6001600160a01b039392919380911694855f52602060018152604092835f20961695865f528152825f20825f528152612898835f205494856134cd565b956128a2876133b5565b6128c5575f97885260018252838820908852815282872091875252909320829055565b835163c5e12af560e01b815260048101889052602490fd5b60405163793a8f5560e01b815260048101849052602490fd5b60408051929361290584611977565b6007845260206129168186016121e5565b5f5b845181101561294b578061292e60019287611fc7565b516129398289611fc7565b526129448188611fc7565b5001612918565b50925092939093335f52308352845f20928551916129688361190f565b612970611ea3565b83526060828194015286519361298585611994565b5f855287519061299482611994565b5f82525f3681375f5b8151811015612af4576129b08183611fc7565b51908a82510151516129c7575b600191500161299d565b8a89875f6129d8828701518a613bb7565b938651946001600160a01b0394828680895116968901511697015190835197612a008961195b565b88528d88015282870152828d87015260808601528c60a08601528860c086015251809263d04dfe2360e01b82528180612a3d600498898301612fc1565b03915afa948515612aea5789915f96612ac4575b508551612a62575b505050506129bd565b5101511692833b1561018257612a90935f92838f5180978195829463012c676d60e21b845233908401613667565b03925af1918215612aba57600192612aab575b808781612a59565b612ab490611947565b5f612aa3565b8b513d5f823e3d90fd5b612ae19196503d805f833e612ad981836119b0565b810190612e7d565b9050945f612a51565b8e513d5f823e3d90fd5b50505050505050509050565b8215612b35576001600160a01b038091165f52600160205260405f2091165f5260205260405f20905f5260205260405f205490565b909150612b4182613b5b565b6001600160a01b03809316906040918251946370a0823160e01b86528416938460048701526020928387602481865afa968715612c57575f97612c61575b5083612b98612b9183612bc89a6149e3565b50906141f7565b508651636eb1769f60e11b81526001600160a01b0390941660048501523060248501529297889081906044820190565b0381865afa968715612c57575f97612c26575b50612b91612bec91611a33986149e3565b50612bf781836133d8565b15612c1e5750935b5f5260018252825f20905f528152815f20905f8052525f2054906134cd565b905093612bff565b96508387813d8311612c50575b612c3d81836119b0565b8101031261018257955195612b91612bdb565b503d612c33565b85513d5f823e3d90fd5b96508387813d8311612c89575b612c7881836119b0565b810103126101825795519583612b7f565b503d612c6e565b6040519263a9059cbb60e01b5f526001600160a01b0380931660045260245260205f60448180855af160015f5114811615612cea575b8360405215612cd457505050565b635274afe760e01b835216600482015260249150fd5b6001811516612d0057813b15153d151616612cc6565b833d5f823e3d90fd5b9092604051936323b872dd60e01b5f526001600160a01b0393848092166004521660245260445260205f60648180855af160015f5114811615612d59575b836040525f60605215612cd457505050565b6001811516612d0057813b15153d151616612d47565b93929193612d7c836133b5565b6128dd5784612d905761285393945061278c565b6001600160a01b039392919380911694855f52602060018152604092835f20961695865f528152825f20825f528152612898835f205494856134a3565b90929192612dda81613a7c565b93612de4816133b5565b612e245784816001600160e01b03612e039360e01d9116601b0b6148b7565b50809281612e12575050509190565b6001600160a01b036127ef9316612c90565b604051632d1671a360e11b8152600490fd5b91612e61906060612e56936001600160a01b039485916040880151611fc7565b515116940151611fc7565b51511614612e6b57565b604051631cd2f1c760e21b8152600490fd5b919060408382031261018257825167ffffffffffffffff908181116101825784019082601f83011215610182578151602092612eb882611a94565b91612ec660405193846119b0565b808352848084019160051b830101918683116101825785809101915b838310612f555750505050948281015191821161018257019180601f84011215610182578251612f1181611a94565b93612f1f60405195866119b0565b818552838086019260051b820101928311610182578301905b828210612f46575050505090565b81518152908301908301612f38565b8251815291810191869101612ee2565b90808251908181526020809101926020808460051b8301019501935f915b848310612f935750505050505090565b9091929394958480612fb1600193601f198682030187528a516120ae565b9801930193019194939290612f83565b91906020928381526001600160a01b0382511684820152838201516040820152612ffb604083015160e0606084015261010083019061189f565b9060608301516080820152613022608084015192601f1993848483030160a0850152612f65565b9260a081015193838382030160c08401528680865192838152019501905f5b81811061306557505050611a3394955060c060e091015192828503019101526120ae565b825187529588019591880191600101613041565b9491936132be919360c0915f6132456040928351946130978661195b565b61309f611ec2565b86526020958487820152848682015260609781868a809401528260808201528660a082015201526131f58551916130d583611977565b600783526130e48884016121e5565b8d6130ee8161267f565b9c896001600160a01b039e8f94859182865116908d5194600486528501528c840152168c82015233608082015260a081018a5261312a86611f6a565b5261313485611f6a565b508851613140816118f3565b6002815289368c83013761315386611f77565b5261315d85611f77565b5060ff8a6131c08b8501936131aa876131838161317b858a51611fc7565b515116613b5b565b97511688613192848951611fc7565b515116856131a1858a51611fc7565b51015191612b00565b966131b6828751611fc7565b5151169451611fc7565b51015192169093929190604051946005865260208601526040850152606084015260808301525f60a083015260c08201604052565b6131fe82611f87565b5261320881611f87565b5061322c8a8d8d60ff8a6131c08d8501936131aa876131838161317b858a51611fc7565b61323582611f97565b5261323f81611f97565b50613bb7565b95878a511697848b0191825191868184511693015116928a8552308752858086209151015186519161327683611994565b8683528751956132858761195b565b86528886015286850152848885015289608085015260a084015260c08301528351808098819463d04dfe2360e01b835260048301612fc1565b03915afa9687156133ab575f945f98613389575b50845160028110613372575081838601519501516132f86132f288611fa7565b51611f97565b5161330381836133d8565b1561336a5750925b61332d8685919060405192600284526020840152604083015260608201604052565b61333688611f87565b5261334087611f87565b5082519961334d8b61195b565b8a52890152870152850152608084015260a083015260c082015290565b90509261330b565b602490835190630fbb8e5560e21b82526004820152fd5b9097506133a19194503d805f833e612ad981836119b0565b939093965f6132d2565b50513d5f823e3d90fd5b6133d4905f60e01d906001600160e01b038160e01d9116601b0b6147b7565b1390565b906133d4916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b614838565b6134266001600160e01b0392838316601b0b9260e01d938160e01d9116601b0b8484613fae565b90637ffffff58213613476575b9061343d916141f7565b929092158061346e575b61345057505090565b6044925060405191638eba4d0760e01b835260048301526024820152fd5b508215613447565b6134808282614e97565b1561343357604483856040519163d556b11160e01b835260048301526024820152fd5b611a3391610bcf916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b6143fd565b611a3391610bcf916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b6145c1565b61355191608081018261351361350d8351611fa7565b51611fa7565b5261354a6135446001600160a01b0380945151169361353b6135358551611fa7565b51611f6a565b51169251611fa7565b51611f87565b5191612d6f565b5050565b9060808101918061356961350d8551611f97565b526001600160a01b038092515116916135856135358551611f97565b51166135946135448551611f97565b51908161362f576135a4836133b5565b6128dd579183917f4cb6e22a3e7e651d7cf0376cff48f20f5007a54147777865be7f5f6c38c50f4a9593612580955f52602090600182526135fa604094855f20835f528452855f20855f528452855f20546134cd565b945f5260018252835f20905f528152825f20915f52525f20555b51604051918291338352604060208401526040830190612f65565b91613660917f4cb6e22a3e7e651d7cf0376cff48f20f5007a54147777865be7f5f6c38c50f4a959361258095612832565b5050613614565b90604082019082526020606081936040838201528551809452019301915f5b828110613694575050505090565b835185529381019392810192600101613686565b60c0810151908151915f9261381c575b5061375d6020918281510151926001600160a01b039081818187511696015116928660a082019485518252308452604097888320898686510151015160808601518b519161370583611994565b8683528c519361371485611994565b8785528d51966137238861195b565b8752898701528c86015260016060860152608085015260a084015260c08301528851808099819463d04dfe2360e01b835260048301612fc1565b03915afa9485156138125787956137f4575b508451613780575b50505050505050565b81905101510151169051813b156137f0579184918493836137b5965180978195829463012c676d60e21b845260048401613667565b03925af19081156137e757506137d0575b8080808080613777565b6137da8291611947565b6137e457806137c6565b80fd5b513d84823e3d90fd5b8480fd5b6138099195503d8089833e612ad981836119b0565b9050935f61376f565b86513d89823e3d90fd5b6001600160a01b03602080845101510151169060a083015190823b156101825761385f925f928360405180968195829463012c676d60e21b845260048401613667565b03925af1801561022c57156136b857613879919250611947565b5f905f6136b8565b608081016138926135448251611f97565b5191821561389f57505050565b6138b96135356001600160a01b0380935151169351611f97565b5116815f5260209160018352604092835f20835f528152835f20855f528152835f2054936001600160e01b0385166138f4575b505050505050565b613918955f9284845260018152828420868552815282842091845252812055612dcd565b5f8080806138ec565b811561392b570490565b634e487b7160e01b5f52601260045260245ffd5b6040815110613987576020810151908051603f19810190811161280c5760051c82116139735760016020920160051b010190565b505060405161398181611994565b5f815290565b5060405161398181611994565b8051156139a457602001515f1a90565b505f90565b905f8091602081519101845af48080613a27575b156139dd5750506040513d81523d5f602083013e60203d82010160405290565b15613a0457604051639996b31560e01b81526001600160a01b039091166004820152602490fd5b3d15613a15576040513d5f823e3d90fd5b60405163d6bda27560e01b8152600490fd5b503d1515806139bd5750813b15156139bd565b60041115613a4457565b634e487b7160e01b5f52602160045260245ffd5b602090939291936001600160a01b036040820195168152613a7883613a3a565b0152565b613a84614f85565b6040805163b7bad1b160e01b81526001600160a01b0383166004820152909182826024815f73200e12d10bb0c5e4a17e7018f0f1161919bb93895af1928315613b52575f925f94613b1d575b50613ada83613a3a565b600183141580613b0b575b613aef5750505090565b5163ee07877f60e01b81529182916106df919060048401613a58565b50613b1583613a3a565b821515613ae5565b90809450613b419293503d8511613b4b575b613b3981836119b0565b81019061488d565b919091925f613ad0565b503d613b2f565b513d5f823e3d90fd5b613b63614f85565b60408051630782d7e160e01b81526001600160a01b03831660048201529091828260248173200e12d10bb0c5e4a17e7018f0f1161919bb93895afa928315613b52575f925f94613b1d5750613ada83613a3a565b90805191613bc483611a94565b91613bdf604094613bd7865195866119b0565b808552611a94565b601f199460209186013686840137835183519095908015613dde576001613c359101965b6001978891010197613c2c613c178a611a94565b99613c2486519b8c6119b0565b808b52611a94565b01848901612201565b85805f9684516002815233878201523086820152606081018652613c588b611f6a565b52613c628a611f6a565b505f925b613d9a575b5050508351613c7e575b50505050505090565b85809598979692980181613c928289611fc7565b52613c9d8188611fc7565b505f925b613cb0575b5085969750613c75565b8451831015613d95576001600160a01b03613d2781613ccf8689611fc7565b51511686613cdd878a611fc7565b51015187815160051b9101207f19457468657265756d205369676e6564204d6573736167653a0a3332000000005f52601c52603c5f208c613d1e888b611fc7565b51015191614a11565b15613d7d57868098999a928192613d3e878a611fc7565b515116613d4b8787611fc7565b52019385613d598289611fc7565b510151613d66868c611fc7565b52613d71858b611fc7565b50019290989796613ca1565b8951630a57f30960e31b815260048101859052602490fd5b613ca6565b9091968151881015613dd5578280910197613db58184611fc7565b51613dc08a8d611fc7565b52613dcb898c611fc7565b5001919081613c66565b96829150613c6b565b50613c355f96613c03565b9091939284158215175f14613e035750505090505f905f90565b82810192600160fd1b8082019083011760fe1c613f3a575b5050613e2681614b5c565b93613e3081614b5c565b94613e3b8682614b7c565b90918215613f2b575f9083986f0785ee10d5da46d900f436a000000000808611613f1d575b50670de0b6b3a7640000808b11613f0e575b50633b9aca00808b11613eff575b50612710808b11613ef1575b5098805b613ee05750819061189b989982600a0a9109960195817fcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccd0a93838211900382610100031b9203901c170291614b8f565b60019290920191600a900480613e90565b60049a04998a930192613e8c565b600991939a049901915f613e80565b601291939a049901915f613e72565b85049950602592505f613e60565b5092905061189b949550614b8f565b5f821215613f8e57808413613f80575b7f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb2841315613e1b5790925061189b939491614a9a565b90925061189b939491614b01565b80841215613f4a5790925061189b939491614a9a565b61343d82826141f7565b92909180613fd4576044848460405191637a97930f60e01b835260048301526024820152fd5b90919280155f14613fe957505050505f905f90565b61400293613ff691614c49565b92919490938492614c49565b909391928461401088614b5c565b9161401a86614b5c565b947f161bcca7119915b50764b4abe86529797775a5f171951000000000000000000094604c918688106141c1575b030191600160ff1b98838a018112155f1461418e575050035b5f955f821280614185575b614167575b5f811280614155575b6141375786820103966001600160ff1b038814908161412d575b5080614124575b8061411b575b6140fd5750906140b19291614df5565b915f81136140c4575b5061189b93614b8f565b9091604c82136140f2576140db91600a0a90613921565b9081156140e8575f6140ba565b505050505f905f90565b50505050505f905f90565b876044916040519163d556b11160e01b835260048301526024820152fd5b505f85126140a1565b5082841461409b565b905088145f614094565b604489836040519163d556b11160e01b835260048301526024820152fd5b50806001600160ff1b0301821361407a565b955080870186131561417f5786818703015b95614071565b5f614179565b505f811361406c565b89985090920390506001600160ff1b03819003870182136141b25701860194614061565b5050505050505050505f905f90565b7f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee80000000000000000009650604b9250614048565b811561392b570590565b8082601b82810b83146143ec577d90e40fbeea1d3a4abc8955e946fe31cdcf66f634e10000000000000000008405614398575b8380820b0361438757507b199999999999999999999999999999999999999999999999999999987b0ccccccccccccccccccccccccccccccccccccccccccccccccccccccc84011115614338575b838060030b036142bc575b8084136142a05750506001600160e01b036001925b60e01b91161791565b8303600a0a801561392b576001600160e01b0391071592614297565b92915f84131561430c5750906142d28383614e97565b6142ee57637ffffffe1901600a0a810290637fffffff92614282565b506044916040519163d556b11160e01b835260048301526024820152fd5b637fffffff1992830390604382136140f25761432b91600a0a906141ed565b9182156140e85792614282565b5f198401808060030b1461434c5750614277565b90506001600160e01b039293507b7fffffffffffffffffffffffffffffffffffffffffffffffffffffff915060e01b9260ff1d181617905f90565b600190940193600a9093059261422a565b937f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee80000000000000000008405156143d9576305f5e100600894058094819201955b91505061422a565b620186a0600594058094819201956143d1565b508261427757505050505f90600190565b919291600160ff1b84016144155761189b9350614eb0565b9061189b935f03916145c1565b919291600160ff1b91908015806145af57509061443e91614c49565b9490929091905f8685858582821380156145a6575b614589575b505050508682841860ff1c94860391039081604c03811161456e5701600a0a808205919084614554575b505081019182821860ff1c111561454c57826001600160ff1b031461452e57905f600192135f146144ff57600a9004915b01925b811581176144c357509190565b806144dc575b5080156144d4579190565b505f91508190565b91926144f29203600160ff1b01600a0a906141ed565b600160ff1b91905f6144c9565b600a60037fe66666666666666666666666666666666666666666666666666666666666666792010401916144b3565b604490836040519163d556b11160e01b835260048301526024820152fd5b5090926144b6565b8107614561575b80614482565b60ff1d600117015f61455b565b50505091935061457c579190565b60018160ff1d1790039190565b5f9a50909750909550600160ff1b94509250905086808080614458565b50835f12614453565b156145ba5750509190565b9350919050565b9392919384158115818117614712575050906145dc91614c49565b91949082956145ed82958294614c49565b8096929491969387868482138015614709575b6146f0575b5050505050508682841860ff1c94860391039081604c03811161456e5701600a0a8082059190846146d6575b505081019182821860ff1c11156146ce57826001600160ff1b031461452e57905f600192135f1461469f57600a9004915b01925b8115811761467257509190565b80614682575080156144d4579190565b600160ff1b936146999291038401600a0a906141ed565b5f6144c9565b600a60037fe6666666666666666666666666666666666666666666666666666666666666679201040191614662565b509092614665565b81076146e3575b80614631565b60ff1d600117015f6146dd565b929b5098509196509450925090505f8080808080614605565b50858412614600565b93959390929190156147285750506144d4579190565b945092915050565b60088151106139a4576008015167ffffffffffffffff1667ff0a89c674ee78741490565b916040830192604061478e610bcf606087519401938451906001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b613de9565b9451930161479d815186612765565b6147a5575050565b909350611a33919250519251836133ff565b92915f9060018184145f87128715171717614831575f92808213614823575b03604c81135f82121761481757600a0a90846147f583820293846141ed565b1461480a57505015614806575f9190565b5f90565b9093509015611a33579190565b505015614806575f9190565b5f95600194509250906147d6565b5050505f90565b93929190918083145f83125f87121883158715171717614887575f9280821361487a5703604c81135f82121761481757600a0a90846147f583820293846141ed565b91946001935091906147d6565b50919050565b919082604091031261018257815160048110156101825760209092015160ff811681036101825790565b91925f8312156148df576044838360405191634a7d166b60e01b835260048301526024820152fd5b9192836148f157505090505f90600190565b60ff81168201918083126149b9575f831215614929575050604c1981126144d4575f03600a0a916149228382613921565b9283021490565b909293915f81135f146149af57604d811361498457600a0a92831561392b57835f1904831161495b5750500290600190565b60405163c849483b60e01b815260048101849052602481019290925260ff166044820152606490fd5b5060405163c849483b60e01b81526004810192909252602482015260ff919091166044820152606490fd5b5050905090600190565b60405163c849483b60e01b815260048101869052602481019190915260ff82166044820152606490fd5b9060ff165f03916001600160ff1b0382115f14614a0957600a6001818404940192061590565b909190600190565b9091813b614a4c57614a239192614fee565b50614a2d81613a3a565b159182614a3957505090565b6001600160a01b03918216911614919050565b6020918160645f935160405192630b135d3f60e11b9788855260048501526040602485015286820190604485015e8281018201859052601f01601f191601915afa905f5114601f3d11161690565b909392915f614aaa918184613de9565b9490945f8483019182019412159081614af7575b8115614aed575b50614acf57505090565b604492506040519163d556b11160e01b835260048301526024820152fd5b905083125f614ac5565b8281129150614abe565b614b1693600160fe1b90810193920190613de9565b9081815f821215614b4d575050604b19821261285357614b3b915f03600a0a906141ed565b9081614b45575f90565b600160ff1b90565b93600160ff1b90910192509050565b5f811215611a3357600160ff1b90808203614b75575090565b90505f0390565b905f198183099102908180821091030391565b92939291905f8184181215614c24576001600160ff1b039283831115614c0e57600160ff1b93838503614bc457505050509190565b90919293508514614bde575050600a600191045f03920190565b604051630ed8062160e21b8152600481019190915260248101919091526044810182905260648101849052608490fd5b5090915050600160ff1b811461280c575f039190565b90916001600160ff1b03808411156127d4578514614bde575050600a60019104920190565b9190918015614deb57827f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee800000000000000000080830515614cf9575b507f19999999999999999999999999999999999999999999999999999999999999997f0ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc830110614cea575b8313614cd45791905f90565b919060018060ff1b926001600160ff1b03030190565b9290600a02905f190192614cc8565b6f4b3b4ca85a86c47a098a22400000000080840515614dd9575b507728c87cb5c89a2571ebfdcb54864ada834a00000000000000830515614dc2575b7b097edd871cfda3a5697758bf0e3cbb5ac5741c640000000000000000830515614dae575b7e3899162693736ac531a5a58f1fbb4b746504382ca7e4000000000000000000830515614d9e57820515614d8f575b5f614c7d565b9290600a02905f190192614d89565b9391606402916001190193614d5a565b93916402540be40002916009190193614d5a565b9391678ac7230489e8000002916012190193614d35565b6025198301955092909202915f614d13565b505f915081908190565b90915f198383099280830292838086109503948086039584871015614e735714614e6b579082910960018219018216809204600280826003021880830282030280830282030280830282030280830282030280830282030280920290030293600183805f03040190848311900302920304170290565b505091500490565b60648386866040519263362ced0960e11b8452600484015260248301526044820152fd5b611a3391905f811215614eab575f03615028565b615028565b909291600160ff1b91828101614f425750808414614f3857808413918215614f30578185035b604c811115614f1f5750505f915b15614f1057507f8000000000000000000000000000000000000000000000000000000000000001019190565b92506001600160ff1b03039190565b600a0a90811561392b570491614ee4565b848203614ed6565b505090505f905f90565b93614f4f92945f03614422565b80939180928114614f63575b50505f039190565b915092506001600160ff1b03831461452e57600a600191059201915f80614f5b565b73200e12d10bb0c5e4a17e7018f0f1161919bb9389803b158015614fc3575b614fab5750565b602490604051906373e6d7b360e01b82526004820152fd5b507f1de7d717526cba131d684e312dedbf0852adef9cced9e36798ae4937f7145d41813f1415614fa4565b815191906041830361501e576150179250602082015190606060408401519301515f1a906150b7565b9192909190565b50505f9160029190565b90637ffffff58113156150b157637ffffffe19810190604382136150aa575f82121561507e57637fffffff91505f0301600a0a7b8000000000000000000000000000000000000000000000000000000202111590565b50600a0a801561392b577b80000000000000000000000000000000000000000000000000000001041090565b5050151590565b50505f90565b91907f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0841161512e579160209360809260ff5f9560405194855216868401526040830152606082015282805260015afa1561022c575f516001600160a01b0381161561512457905f905f90565b505f906001905f90565b5050505f916003919056", "linkReferences": {} } } diff --git a/crates/test_fixtures/abis/RaindexV6SubParser.json b/crates/test_fixtures/abis/RaindexV6SubParser.json index 8ab9fcd5ae..6f79b6a5b6 100644 --- a/crates/test_fixtures/abis/RaindexV6SubParser.json +++ b/crates/test_fixtures/abis/RaindexV6SubParser.json @@ -242,7 +242,7 @@ } ], "bytecode": { - "object": "0x6080604052348015600e575f80fd5b506126378061001c5f395ff3fe608060405234801561000f575f80fd5b506004361061007a575f3560e01c80636f5aa28d116100585780636f5aa28d146100dd578063c6c0cbb61461010b578063ccf4477514610135578063d6d8c9a814610148575f80fd5b806301ffc9a71461007e578063336284d4146100a6578063570c7a63146100bb575b5f80fd5b61009161008c3660046122f2565b610150565b60405190151581526020015b60405180910390f35b6100ae6101d7565b60405161009d919061234e565b6100ce6100c9366004612374565b610bc5565b60405161009d9392919061241e565b6040517ff2d0eca454c544ab10f9991c019349475a416e38494f112a50807174c3000d0b815260200161009d565b61011e610119366004612374565b610d09565b60408051921515835260208301919091520161009d565b60408051602081019091525f81526100ae565b6100ae610d41565b5f6001600160e01b031982166391ccb1d560e01b148061018057506001600160e01b03198216636f5aa28d60e01b145b8061019b57506001600160e01b03198216631a2c8edd60e01b145b806101b657506001600160e01b03198216630cd8a13560e21b145b806101d157506301ffc9a760e01b6001600160e01b03198316145b92915050565b60605f6101e66004600161248f565b6101f190600261248f565b6101fc90600161248f565b61020790600161248f565b6001600160401b0381111561021e5761021e612360565b60405190808252806020026020018201604052801561025157816020015b606081526020019060019003908161023c5790505b50604080516002808252606082019092529192505f9190816020015b6122e881526020019060019003908161026d5790505090506116cc815f8151811061029a5761029a6124a2565b60200260200101906001600160401b031690816001600160401b0316815250506116e9816001815181106102d0576102d06124a2565b6001600160401b039290921660209283029190910190910152604080516003808252608082019092525f91816020015b6122e88152602001906001900390816103005790505090506116f8815f8151811061032d5761032d6124a2565b60200260200101906001600160401b031690816001600160401b03168152505061170781600181518110610363576103636124a2565b60200260200101906001600160401b031690816001600160401b03168152505061171681600281518110610399576103996124a2565b6001600160401b039290921660209283029190910190910152604080516002808252606082019092525f91816020015b6122e88152602001906001900390816103c9579050509050611726815f815181106103f6576103f66124a2565b60200260200101906001600160401b031690816001600160401b0316815250506117358160018151811061042c5761042c6124a2565b6001600160401b03929092166020928302919091019091015260408051600580825260c082019092525f91816020015b6122e881526020019060019003908161045c579050509050611745815f81518110610489576104896124a2565b60200260200101906001600160401b031690816001600160401b031681525050611754816001815181106104bf576104bf6124a2565b60200260200101906001600160401b031690816001600160401b031681525050611764816002815181106104f5576104f56124a2565b60200260200101906001600160401b031690816001600160401b0316815250506117748160038151811061052b5761052b6124a2565b60200260200101906001600160401b031690816001600160401b03168152505061178381600481518110610561576105616124a2565b6001600160401b03929092166020928302919091019091015260408051600580825260c082019092525f91816020015b6122e8815260200190600190039081610591579050509050611793815f815181106105be576105be6124a2565b60200260200101906001600160401b031690816001600160401b0316815250506117a2816001815181106105f4576105f46124a2565b60200260200101906001600160401b031690816001600160401b0316815250506117b28160028151811061062a5761062a6124a2565b60200260200101906001600160401b031690816001600160401b0316815250506117c281600381518110610660576106606124a2565b60200260200101906001600160401b031690816001600160401b0316815250506117d281600481518110610696576106966124a2565b6001600160401b0392909216602092830291909101909101526040805160018082528183019092525f91816020015b6122e88152602001906001900390816106c55790505090506117e1815f815181106106f2576106f26124a2565b6001600160401b0392909216602092830291909101909101526040805160018082528183019092525f91816020015b6122e88152602001906001900390816107215790505090506117f0815f8151811061074e5761074e6124a2565b60200260200101906001600160401b031690816001600160401b03168152505086885f81518110610781576107816124a2565b602002602001018190525085886001815181106107a0576107a06124a2565b602002602001018190525084886002815181106107bf576107bf6124a2565b602002602001018190525083886003815181106107de576107de6124a2565b602002602001018190525082886004815181106107fd576107fd6124a2565b6020026020010181905250818860058151811061081c5761081c6124a2565b6020026020010181905250808860068151811061083b5761083b6124a2565b602090810291909101015260408051600680825260e082019092525f91816020015b6122e881526020019060019003908161085d5790505090506116cc815f8151811061088a5761088a6124a2565b60200260200101906001600160401b031690816001600160401b0316815250506116f8816001815181106108c0576108c06124a2565b60200260200101906001600160401b031690816001600160401b031681525050611707816002815181106108f6576108f66124a2565b60200260200101906001600160401b031690816001600160401b0316815250506117168160038151811061092c5761092c6124a2565b60200260200101906001600160401b031690816001600160401b03168152505061182581600481518110610962576109626124a2565b60200260200101906001600160401b031690816001600160401b03168152505061183581600581518110610998576109986124a2565b6001600160401b039092166020928302919091019091015280896109be6006600161248f565b815181106109ce576109ce6124a2565b602090810291909101015260408051600780825261010082019092525f91816020015b6122e88152602001906001900390816109f15790505090506116cc815f81518110610a1e57610a1e6124a2565b60200260200101906001600160401b031690816001600160401b0316815250506116f881600181518110610a5457610a546124a2565b60200260200101906001600160401b031690816001600160401b03168152505061170781600281518110610a8a57610a8a6124a2565b60200260200101906001600160401b031690816001600160401b03168152505061171681600381518110610ac057610ac06124a2565b60200260200101906001600160401b031690816001600160401b03168152505061182581600481518110610af657610af66124a2565b60200260200101906001600160401b031690816001600160401b03168152505061183581600581518110610b2c57610b2c6124a2565b60200260200101906001600160401b031690816001600160401b03168152505061184581600681518110610b6257610b626124a2565b6001600160401b0390921660209283029190910190910152808a610b886006600261248f565b81518110610b9857610b986124a2565b602090810291909101015289610bb5610bb082611855565b61186a565b9b50505050505050505050505090565b5f6060805f805f610be587610bd86118f9565b610be0611919565b611939565b9250925092505f610bfb82610220015160200190565b90505f8261022001515182610c10919061248f565b90505f610c2e83836f07fffffe0000000003ff200000000000611a2a565b80925081945050505f80610c4786610240015184611ac6565b915091508115610cdc575f610c5c8783611b9d565b90506122e85f610c6a611bcc565b90505f60028251610c7b91906124ca565b9050808510610cac576040516303bdd1b160e51b815260048101869052602481018290526044015b60405180910390fd5b6001850160020282015161ffff169250610cc58c8c8686565b9e509e509e50505050505050505050505050610d02565b5050604080515f80825281830190925260208101828152919a5090985096505050505050505b9193909250565b5f805f805f610d31866002810151815160228084019461ffff93909316840101920160200190565b505f988998509650505050505050565b60605f610d506004600161248f565b610d5b90600261248f565b610d6690600161248f565b610d7190600161248f565b6001600160401b03811115610d8857610d88612360565b604051908082528060200260200182016040528015610dbb57816020015b6060815260200190600190039081610da65790505b50604080516002808252606082019092529192505f9190816020015b6122e8815260200190600190039081610dd7579050509050611bec815f81518110610e0457610e046124a2565b60200260200101906001600160401b031690816001600160401b031681525050611bec81600181518110610e3a57610e3a6124a2565b6001600160401b039290921660209283029190910190910152604080516003808252608082019092525f91816020015b6122e8815260200190600190039081610e6a579050509050611bec815f81518110610e9757610e976124a2565b60200260200101906001600160401b031690816001600160401b031681525050611bec81600181518110610ecd57610ecd6124a2565b60200260200101906001600160401b031690816001600160401b031681525050611bec81600281518110610f0357610f036124a2565b6001600160401b039290921660209283029190910190910152604080516002808252606082019092525f91816020015b6122e8815260200190600190039081610f33579050509050611bec815f81518110610f6057610f606124a2565b60200260200101906001600160401b031690816001600160401b031681525050611bec81600181518110610f9657610f966124a2565b6001600160401b03929092166020928302919091019091015260408051600580825260c082019092525f91816020015b6122e8815260200190600190039081610fc6579050509050611bec815f81518110610ff357610ff36124a2565b60200260200101906001600160401b031690816001600160401b031681525050611bec81600181518110611029576110296124a2565b60200260200101906001600160401b031690816001600160401b031681525050611bec8160028151811061105f5761105f6124a2565b60200260200101906001600160401b031690816001600160401b031681525050611bec81600381518110611095576110956124a2565b60200260200101906001600160401b031690816001600160401b031681525050611bec816004815181106110cb576110cb6124a2565b6001600160401b03929092166020928302919091019091015260408051600580825260c082019092525f91816020015b6122e88152602001906001900390816110fb579050509050611bec815f81518110611128576111286124a2565b60200260200101906001600160401b031690816001600160401b031681525050611bec8160018151811061115e5761115e6124a2565b60200260200101906001600160401b031690816001600160401b031681525050611bec81600281518110611194576111946124a2565b60200260200101906001600160401b031690816001600160401b031681525050611bec816003815181106111ca576111ca6124a2565b60200260200101906001600160401b031690816001600160401b031681525050611bec81600481518110611200576112006124a2565b6001600160401b0392909216602092830291909101909101526040805160018082528183019092525f91816020015b6122e881526020019060019003908161122f579050509050611c15815f8151811061125c5761125c6124a2565b6001600160401b0392909216602092830291909101909101526040805160018082528183019092525f91816020015b6122e881526020019060019003908161128b579050509050611cb1815f815181106112b8576112b86124a2565b60200260200101906001600160401b031690816001600160401b03168152505086885f815181106112eb576112eb6124a2565b6020026020010181905250858860018151811061130a5761130a6124a2565b60200260200101819052508488600281518110611329576113296124a2565b60200260200101819052508388600381518110611348576113486124a2565b60200260200101819052508288600481518110611367576113676124a2565b60200260200101819052508188600581518110611386576113866124a2565b602002602001018190525080886006815181106113a5576113a56124a2565b602090810291909101015260408051600680825260e082019092525f91816020015b6122e88152602001906001900390816113c7579050509050611bec815f815181106113f4576113f46124a2565b60200260200101906001600160401b031690816001600160401b031681525050611bec8160018151811061142a5761142a6124a2565b60200260200101906001600160401b031690816001600160401b031681525050611bec81600281518110611460576114606124a2565b60200260200101906001600160401b031690816001600160401b031681525050611bec81600381518110611496576114966124a2565b60200260200101906001600160401b031690816001600160401b031681525050611bec816004815181106114cc576114cc6124a2565b60200260200101906001600160401b031690816001600160401b031681525050611bec81600581518110611502576115026124a2565b6001600160401b039092166020928302919091019091015280896115286006600161248f565b81518110611538576115386124a2565b602090810291909101015260408051600780825261010082019092525f91816020015b6122e881526020019060019003908161155b579050509050611bec815f81518110611588576115886124a2565b60200260200101906001600160401b031690816001600160401b031681525050611bec816001815181106115be576115be6124a2565b60200260200101906001600160401b031690816001600160401b031681525050611bec816002815181106115f4576115f46124a2565b60200260200101906001600160401b031690816001600160401b031681525050611bec8160038151811061162a5761162a6124a2565b60200260200101906001600160401b031690816001600160401b031681525050611bec81600481518110611660576116606124a2565b60200260200101906001600160401b031690816001600160401b031681525050611bec81600581518110611696576116966124a2565b60200260200101906001600160401b031690816001600160401b031681525050611bec81600681518110610b6257610b626124a2565b5f6060806116da5f80611d69565b92509250925093509350939050565b5f6060806116da5f6001611d69565b5f6060806116da60015f611d69565b5f6060806116da600180611d69565b5f6060806116da60016002611d69565b5f6060806116da60025f611d69565b5f6060806116da60026001611d69565b5f6060806116da60035f611d69565b5f6060806116da60036001611d69565b5f6060806116da60036002611d69565b5f6060806116da600380611d69565b5f6060806116da60036004611d69565b5f6060806116da60045f611d69565b5f6060806116da60046001611d69565b5f6060806116da60046002611d69565b5f6060806116da60046003611d69565b5f6060806116da600480611d69565b5f6060806116da600585611d69565b5f60608060ff80851690600886901c1661181461180e83600661248f565b82611d69565b945094509450505093509350939050565b5f6060806116da60016003611d69565b5f6060806116da60016004611d69565b5f6060806116da60016005611d69565b6060815f61186282611deb565b949350505050565b60605f82516002026001600160401b0381111561188957611889612360565b6040519080825280601f01601f1916602001820160405280156118b3576020820181803683370190505b50905061ffff80196020850160208651028101600285015b818310156118ed578051835186169085161781526020909201916002016118cb565b50939695505050505050565b60606040518060e0016040528060a2815260200161259560a29139905090565b606060405180606001604052806040815260200161251560409139905090565b5f806119c86040518061026001604052805f81526020015f81526020015f81526020015f81526020015f81526020015f81526020015f80191681526020015f81526020015f81526020015f81526020015f81526020015f81526020015f80191681526020016060815260200160608152602001606081526020015f815260200160608152602001606081525090565b606061ffff600288015116935060ff600388015116925061ffff600588015116600588019750808852602081018801915050611a1487878760405180602001604052805f815250611e59565b915080826101e001819052505093509350939050565b5f808060018187870360208111611a415780611a44565b60205b915050875192505b8519600184841a1b16158183101615611a6a57600182019150611a4c565b9681019660208290036008810293841c90931b92611ab55760408051602081018590520160408051601f198184030181529082905263e47fe8b760e01b8252610ca39160040161234e565b50869350909150505b935093915050565b600182810180515f928392600560ff93909316602102870192830192909101835b81831015611b8b5760018301516021909301805190935f90819060ff168180611b10838e61200a565b915091508186165f03611b32575f809b509b5050505050505050505050611b96565b5f87611b42600185038916612035565b016004028b015195505062ffffff9081169350841683039150611b769050575060019750601c1a9550611b96945050505050565b611b7f83612035565b84019350505050611ae7565b5f8095509550505050505b9250929050565b6101c08201516002828102820101516101e08401515f9261ffff9092169190611bc39083565b95945050505050565b606060405180606001604052806040815260200161255560409139905090565b5f81515f14611c0e576040516304f8b58160e51b815260040160405180910390fd5b505f919050565b5f8151600103611c72575060208101516001600160e01b038116601b0b60e082901d5f611c438383836120ee565b905061ffff811115611c6857604051631e4e01d760e21b815260040160405180910390fd5b9250611cac915050565b81515f03611c9357604051630f16066b60e41b815260040160405180910390fd5b604051630358cd2160e31b815260040160405180910390fd5b919050565b5f8151600203611d4657602082015160408301516001600160e01b038216601b0b60e083901d5f611ce38383836120ee565b6001600160e01b038516601b0b935060e085901d925090505f611d078484836120ee565b905060ff821180611d18575060ff81115b15611d3657604051631e4e01d760e21b815260040160405180910390fd5b60081b179450611cac9350505050565b600282511015611c9357604051630f16066b60e41b815260040160405180910390fd5b5f60608060ff851180611d7c575060ff84115b15611da457604051639b0f326160e01b81526004810186905260248101859052604401610ca3565b6040805160248101909152600386602383015385602283015360106021830153806020830153506004815260408051602081019091525f8152600197919650945092505050565b60605f611df783612130565b90505f611e058260206124e9565b9050606060405190508160200181016040528281526020850160208651028101602083015b81831015611e4d57602083515102806020855101835e6020939093019201611e2a565b50919695505050505050565b611ee66040518061026001604052805f81526020015f81526020015f81526020015f81526020015f81526020015f81526020015f80191681526020015f81526020015f81526020015f81526020015f81526020015f81526020015f80191681526020016060815260200160608152602001606081526020015f815260200160608152602001606081525090565b5f6040518061026001604052805f81526020015f81526020015f81526020015f81526020015f81526020015f81526020015f801b81526020015f8152602001600481526020015f81526020015f81526020015f81526020015f801b815260200184815260200185815260200160046001600160401b03811115611f6b57611f6b612360565b604051908082528060200260200182016040528015611f94578160200160208202803683370190505b5081525f602080830182905260408084018b905260609384018a90528051601f01601f19168281528083018252835161ffff191681178452855290840182905283018190529082018190526080820181905260a08201819052610120820181905261014082018190526102008201529050611bc3565b5f80825f528360205360215f2090506001815f1a1b915062ffffff8116611b96575060019250929050565b5f5f1982036120475750610100919050565b507f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f7f5555555555555555555555555555555555555555555555555555555555555555600183901c16909103600281901c7f3333333333333333333333333333333333333333333333333333333333333333908116911601600481901c01167f01010101010101010101010101010101010101010101010101010101010101010260f81c90565b5f805f6120fc868686612179565b91509150806121275760405162bc8ecf60e31b81526004810187905260248101869052604401610ca3565b50949350505050565b5f60208201602083510281015b8082101561217257815151928301928084101561216657634e487b715f5260116020526024601cfd5b5060208201915061213d565b5050919050565b5f805f8512156121a657604051634a7d166b60e01b81526004810186905260248101859052604401610ca3565b845f036121b857505f90506001611abe565b8460ff84168501858112156121f35760405163c849483b60e01b8152600481018890526024810187905260ff86166044820152606401610ca3565b5f805f83121561223f57604c19831215612216575f809550955050505050611abe565b825f03600a0a915081848161222d5761222d6124b6565b0495505084029091149150611abe9050565b5f8313156122d857604d83131561227c5760405163c849483b60e01b8152600481018a90526024810189905260ff88166044820152606401610ca3565b82600a0a9150815f1981612292576122926124b6565b048411156122c65760405163c849483b60e01b8152600481018a90526024810189905260ff88166044820152606401610ca3565b5091909102925060019150611abe9050565b8360019550955050505050611abe565b6122f0612500565b565b5f60208284031215612302575f80fd5b81356001600160e01b031981168114612319575f80fd5b9392505050565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f6123196020830184612320565b634e487b7160e01b5f52604160045260245ffd5b5f60208284031215612384575f80fd5b81356001600160401b038082111561239a575f80fd5b818401915084601f8301126123ad575f80fd5b8135818111156123bf576123bf612360565b604051601f8201601f19908116603f011681019083821181831017156123e7576123e7612360565b816040528281528760208487010111156123ff575f80fd5b826020860160208301375f928101602001929092525095945050505050565b83151581525f60206060602084015261243a6060840186612320565b8381036040850152845180825260208087019201905f5b8181101561246d57835183529284019291840191600101612451565b509098975050505050505050565b634e487b7160e01b5f52601160045260245ffd5b808201808211156101d1576101d161247b565b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52601260045260245ffd5b5f826124e457634e487b7160e01b5f52601260045260245ffd5b500490565b80820281158282048414176101d1576101d161247b565b634e487b7160e01b5f52605160045260245ffdfe1bec1bec1bec1bec1bec1bec1bec1bec1bec1bec1bec1bec1bec1bec1bec1bec1bec1c151cb11bec1bec1bec1bec1bec1bec1bec1bec1bec1bec1bec1bec1bec16cc16e916f8170717161726173517451754176417741783179317a217b217c217d217e117f016cc16f8170717161825183516cc16f8170717161825183518450101180010800082000100010480300038412a001810000010020004200004002038038ff54900cc66c61ff3dcab0616592209895f0b16fec9301b02e0920c5bfe561d21609201e959460b1974270f844db208bcd3bf1e989376111049db13b934301a0ae9a00af82a7805c138f40d28083f0742ef2104d561fd1415a13317716a6119d260cc107b9bfc0eec7ade15cba2891c6b14a512792bdb02e0f14718565589", + "object": "0x6080604052348015600e575f80fd5b506126888061001c5f395ff3fe608060405234801561000f575f80fd5b506004361061007a575f3560e01c80636f5aa28d116100585780636f5aa28d146100dd578063c6c0cbb61461010b578063ccf4477514610135578063d6d8c9a814610148575f80fd5b806301ffc9a71461007e578063336284d4146100a6578063570c7a63146100bb575b5f80fd5b61009161008c366004612343565b610150565b60405190151581526020015b60405180910390f35b6100ae6101d7565b60405161009d919061239f565b6100ce6100c93660046123c5565b610b9f565b60405161009d9392919061246f565b6040517fe43208b51e17b3d887e8f3535d75526c0744eee6a200dac603462c6b3ca46511815260200161009d565b61011e6101193660046123c5565b610ce3565b60408051921515835260208301919091520161009d565b60408051602081019091525f81526100ae565b6100ae610d1b565b5f6001600160e01b031982166391ccb1d560e01b148061018057506001600160e01b03198216636f5aa28d60e01b145b8061019b57506001600160e01b03198216631a2c8edd60e01b145b806101b657506001600160e01b03198216630cd8a13560e21b145b806101d157506301ffc9a760e01b6001600160e01b03198316145b92915050565b60605f6101e6600960016124e0565b6001600160401b038111156101fd576101fd6123b1565b60405190808252806020026020018201604052801561023057816020015b606081526020019060019003908161021b5790505b506040805160018082528183019092529192505f9190816020015b61233981526020019060019003908161024b579050509050611682815f81518110610278576102786124f3565b6001600160401b03929092166020928302919091019091015260408051600480825260a082019092525f91816020015b6123398152602001906001900390816102a85790505090506116a0815f815181106102d5576102d56124f3565b60200260200101906001600160401b031690816001600160401b0316815250506116af8160018151811061030b5761030b6124f3565b60200260200101906001600160401b031690816001600160401b0316815250506116be81600281518110610341576103416124f3565b60200260200101906001600160401b031690816001600160401b0316815250506116ce81600381518110610377576103776124f3565b6001600160401b039290921660209283029190910190910152604080516002808252606082019092525f91816020015b6123398152602001906001900390816103a75790505090506116de815f815181106103d4576103d46124f3565b60200260200101906001600160401b031690816001600160401b0316815250506116ed8160018151811061040a5761040a6124f3565b6001600160401b03929092166020928302919091019091015260408051600580825260c082019092525f91816020015b61233981526020019060019003908161043a5790505090506116fd815f81518110610467576104676124f3565b60200260200101906001600160401b031690816001600160401b03168152505061170c8160018151811061049d5761049d6124f3565b60200260200101906001600160401b031690816001600160401b03168152505061171c816002815181106104d3576104d36124f3565b60200260200101906001600160401b031690816001600160401b03168152505061172c81600381518110610509576105096124f3565b60200260200101906001600160401b031690816001600160401b03168152505061173b8160048151811061053f5761053f6124f3565b6001600160401b03929092166020928302919091019091015260408051600580825260c082019092525f91816020015b61233981526020019060019003908161056f57905050905061174b815f8151811061059c5761059c6124f3565b60200260200101906001600160401b031690816001600160401b03168152505061175a816001815181106105d2576105d26124f3565b60200260200101906001600160401b031690816001600160401b03168152505061176a81600281518110610608576106086124f3565b60200260200101906001600160401b031690816001600160401b03168152505061177a8160038151811061063e5761063e6124f3565b60200260200101906001600160401b031690816001600160401b03168152505061178a81600481518110610674576106746124f3565b6001600160401b0392909216602092830291909101909101526040805160018082528183019092525f91816020015b6123398152602001906001900390816106a3579050509050611799815f815181106106d0576106d06124f3565b6001600160401b0392909216602092830291909101909101526040805160018082528183019092525f91816020015b6123398152602001906001900390816106ff5790505090506117a8815f8151811061072c5761072c6124f3565b60200260200101906001600160401b031690816001600160401b03168152505086885f8151811061075f5761075f6124f3565b6020026020010181905250858860018151811061077e5761077e6124f3565b6020026020010181905250848860028151811061079d5761079d6124f3565b602002602001018190525083886003815181106107bc576107bc6124f3565b602002602001018190525082886004815181106107db576107db6124f3565b602002602001018190525081886008815181106107fa576107fa6124f3565b60200260200101819052508088600981518110610819576108196124f3565b602090810291909101015260408051600680825260e082019092525f91816020015b61233981526020019060019003908161083b5790505090506117da815f81518110610868576108686124f3565b60200260200101906001600160401b031690816001600160401b0316815250506117e98160018151811061089e5761089e6124f3565b60200260200101906001600160401b031690816001600160401b0316815250506117f8816002815181106108d4576108d46124f3565b60200260200101906001600160401b031690816001600160401b0316815250506118088160038151811061090a5761090a6124f3565b60200260200101906001600160401b031690816001600160401b03168152505061181881600481518110610940576109406124f3565b60200260200101906001600160401b031690816001600160401b03168152505061182881600581518110610976576109766124f3565b60200260200101906001600160401b031690816001600160401b03168152505080896005815181106109aa576109aa6124f3565b602090810291909101015260408051600780825261010082019092525f91816020015b6123398152602001906001900390816109cd579050509050611838815f815181106109fa576109fa6124f3565b60200260200101906001600160401b031690816001600160401b03168152505061184781600181518110610a3057610a306124f3565b60200260200101906001600160401b031690816001600160401b03168152505061185681600281518110610a6657610a666124f3565b60200260200101906001600160401b031690816001600160401b03168152505061186681600381518110610a9c57610a9c6124f3565b60200260200101906001600160401b031690816001600160401b03168152505061187681600481518110610ad257610ad26124f3565b60200260200101906001600160401b031690816001600160401b03168152505061188681600581518110610b0857610b086124f3565b60200260200101906001600160401b031690816001600160401b03168152505061189681600681518110610b3e57610b3e6124f3565b60200260200101906001600160401b031690816001600160401b031681525050808a600681518110610b7257610b726124f3565b602090810291909101015289610b8f610b8a826118a6565b6118bb565b9b50505050505050505050505090565b5f6060805f805f610bbf87610bb261194a565b610bba61196a565b61198a565b9250925092505f610bd582610220015160200190565b90505f8261022001515182610bea91906124e0565b90505f610c0883836f07fffffe0000000003ff200000000000611a7b565b80925081945050505f80610c2186610240015184611b17565b915091508115610cb6575f610c368783611bee565b90506123395f610c44611c1d565b90505f60028251610c55919061251b565b9050808510610c86576040516303bdd1b160e51b815260048101869052602481018290526044015b60405180910390fd5b6001850160020282015161ffff169250610c9f8c8c8686565b9e509e509e50505050505050505050505050610cdc565b5050604080515f80825281830190925260208101828152919a5090985096505050505050505b9193909250565b5f805f805f610d0b866002810151815160228084019461ffff93909316840101920160200190565b505f988998509650505050505050565b60605f610d2a600960016124e0565b6001600160401b03811115610d4157610d416123b1565b604051908082528060200260200182016040528015610d7457816020015b6060815260200190600190039081610d5f5790505b506040805160018082528183019092529192505f9190816020015b612339815260200190600190039081610d8f579050509050611c3d815f81518110610dbc57610dbc6124f3565b6001600160401b03929092166020928302919091019091015260408051600480825260a082019092525f91816020015b612339815260200190600190039081610dec579050509050611c3d815f81518110610e1957610e196124f3565b60200260200101906001600160401b031690816001600160401b031681525050611c3d81600181518110610e4f57610e4f6124f3565b60200260200101906001600160401b031690816001600160401b031681525050611c3d81600281518110610e8557610e856124f3565b60200260200101906001600160401b031690816001600160401b031681525050611c3d81600381518110610ebb57610ebb6124f3565b6001600160401b039290921660209283029190910190910152604080516002808252606082019092525f91816020015b612339815260200190600190039081610eeb579050509050611c3d815f81518110610f1857610f186124f3565b60200260200101906001600160401b031690816001600160401b031681525050611c3d81600181518110610f4e57610f4e6124f3565b6001600160401b03929092166020928302919091019091015260408051600580825260c082019092525f91816020015b612339815260200190600190039081610f7e579050509050611c3d815f81518110610fab57610fab6124f3565b60200260200101906001600160401b031690816001600160401b031681525050611c3d81600181518110610fe157610fe16124f3565b60200260200101906001600160401b031690816001600160401b031681525050611c3d81600281518110611017576110176124f3565b60200260200101906001600160401b031690816001600160401b031681525050611c3d8160038151811061104d5761104d6124f3565b60200260200101906001600160401b031690816001600160401b031681525050611c3d81600481518110611083576110836124f3565b6001600160401b03929092166020928302919091019091015260408051600580825260c082019092525f91816020015b6123398152602001906001900390816110b3579050509050611c3d815f815181106110e0576110e06124f3565b60200260200101906001600160401b031690816001600160401b031681525050611c3d81600181518110611116576111166124f3565b60200260200101906001600160401b031690816001600160401b031681525050611c3d8160028151811061114c5761114c6124f3565b60200260200101906001600160401b031690816001600160401b031681525050611c3d81600381518110611182576111826124f3565b60200260200101906001600160401b031690816001600160401b031681525050611c3d816004815181106111b8576111b86124f3565b6001600160401b0392909216602092830291909101909101526040805160018082528183019092525f91816020015b6123398152602001906001900390816111e7579050509050611c66815f81518110611214576112146124f3565b6001600160401b0392909216602092830291909101909101526040805160018082528183019092525f91816020015b612339815260200190600190039081611243579050509050611d02815f81518110611270576112706124f3565b60200260200101906001600160401b031690816001600160401b03168152505086885f815181106112a3576112a36124f3565b602002602001018190525085886001815181106112c2576112c26124f3565b602002602001018190525084886002815181106112e1576112e16124f3565b60200260200101819052508388600381518110611300576113006124f3565b6020026020010181905250828860048151811061131f5761131f6124f3565b6020026020010181905250818860088151811061133e5761133e6124f3565b6020026020010181905250808860098151811061135d5761135d6124f3565b602090810291909101015260408051600680825260e082019092525f91816020015b61233981526020019060019003908161137f579050509050611c3d815f815181106113ac576113ac6124f3565b60200260200101906001600160401b031690816001600160401b031681525050611c3d816001815181106113e2576113e26124f3565b60200260200101906001600160401b031690816001600160401b031681525050611c3d81600281518110611418576114186124f3565b60200260200101906001600160401b031690816001600160401b031681525050611c3d8160038151811061144e5761144e6124f3565b60200260200101906001600160401b031690816001600160401b031681525050611c3d81600481518110611484576114846124f3565b60200260200101906001600160401b031690816001600160401b031681525050611c3d816005815181106114ba576114ba6124f3565b60200260200101906001600160401b031690816001600160401b03168152505080896005815181106114ee576114ee6124f3565b602090810291909101015260408051600780825261010082019092525f91816020015b612339815260200190600190039081611511579050509050611c3d815f8151811061153e5761153e6124f3565b60200260200101906001600160401b031690816001600160401b031681525050611c3d81600181518110611574576115746124f3565b60200260200101906001600160401b031690816001600160401b031681525050611c3d816002815181106115aa576115aa6124f3565b60200260200101906001600160401b031690816001600160401b031681525050611c3d816003815181106115e0576115e06124f3565b60200260200101906001600160401b031690816001600160401b031681525050611c3d81600481518110611616576116166124f3565b60200260200101906001600160401b031690816001600160401b031681525050611c3d8160058151811061164c5761164c6124f3565b60200260200101906001600160401b031690816001600160401b031681525050611c3d81600681518110610b3e57610b3e6124f3565b5f6060806116915f6001611dba565b92509250925093509350939050565b5f60608061169160015f611dba565b5f606080611691600180611dba565b5f60608061169160016002611dba565b5f60608061169160016003611dba565b5f60608061169160025f611dba565b5f60608061169160026001611dba565b5f60608061169160035f611dba565b5f60608061169160036001611dba565b5f60608061169160036002611dba565b5f606080611691600380611dba565b5f60608061169160036004611dba565b5f60608061169160045f611dba565b5f60608061169160046001611dba565b5f60608061169160046002611dba565b5f60608061169160046003611dba565b5f606080611691600480611dba565b5f606080611691600885611dba565b5f60608060ff8416600885901c6117c96117c38360096124e0565b82611dba565b945094509450505093509350939050565b5f606080611691600580611dba565b5f60608061169160055f611dba565b5f60608061169160056001611dba565b5f60608061169160056002611dba565b5f60608061169160056003611dba565b5f60608061169160056004611dba565b5f606080611691600680611dba565b5f60608061169160065f611dba565b5f60608061169160066001611dba565b5f60608061169160066002611dba565b5f60608061169160066003611dba565b5f60608061169160066004611dba565b5f60608061169160066005611dba565b6060815f6118b382611e3c565b949350505050565b60605f82516002026001600160401b038111156118da576118da6123b1565b6040519080825280601f01601f191660200182016040528015611904576020820181803683370190505b50905061ffff80196020850160208651028101600285015b8183101561193e5780518351861690851617815260209092019160020161191c565b50939695505050505050565b60606040518060e0016040528060a2815260200161256660a29139905090565b606060405180606001604052806040815260200161260860409139905090565b5f80611a196040518061026001604052805f81526020015f81526020015f81526020015f81526020015f81526020015f81526020015f80191681526020015f81526020015f81526020015f81526020015f81526020015f81526020015f80191681526020016060815260200160608152602001606081526020015f815260200160608152602001606081525090565b606061ffff600288015116935060ff600388015116925061ffff600588015116600588019750808852602081018801915050611a6587878760405180602001604052805f815250611eaa565b915080826101e001819052505093509350939050565b5f808060018187870360208111611a925780611a95565b60205b915050875192505b8519600184841a1b16158183101615611abb57600182019150611a9d565b9681019660208290036008810293841c90931b92611b065760408051602081018590520160408051601f198184030181529082905263e47fe8b760e01b8252610c7d9160040161239f565b50869350909150505b935093915050565b600182810180515f928392600560ff93909316602102870192830192909101835b81831015611bdc5760018301516021909301805190935f90819060ff168180611b61838e61205b565b915091508186165f03611b83575f809b509b5050505050505050505050611be7565b5f87611b93600185038916612086565b016004028b015195505062ffffff9081169350841683039150611bc79050575060019750601c1a9550611be7945050505050565b611bd083612086565b84019350505050611b38565b5f8095509550505050505b9250929050565b6101c08201516002828102820101516101e08401515f9261ffff9092169190611c149083565b95945050505050565b606060405180606001604052806040815260200161264860409139905090565b5f81515f14611c5f576040516304f8b58160e51b815260040160405180910390fd5b505f919050565b5f8151600103611cc3575060208101516001600160e01b038116601b0b60e082901d5f611c9483838361213f565b905061ffff811115611cb957604051631e4e01d760e21b815260040160405180910390fd5b9250611cfd915050565b81515f03611ce457604051630f16066b60e41b815260040160405180910390fd5b604051630358cd2160e31b815260040160405180910390fd5b919050565b5f8151600203611d9757602082015160408301516001600160e01b038216601b0b60e083901d5f611d3483838361213f565b6001600160e01b038516601b0b935060e085901d925090505f611d5884848361213f565b905060ff821180611d69575060ff81115b15611d8757604051631e4e01d760e21b815260040160405180910390fd5b60081b179450611cfd9350505050565b600282511015611ce457604051630f16066b60e41b815260040160405180910390fd5b5f60608060ff851180611dcd575060ff84115b15611df557604051639b0f326160e01b81526004810186905260248101859052604401610c7d565b6040805160248101909152600386602383015385602283015360106021830153806020830153506004815260408051602081019091525f8152600197919650945092505050565b60605f611e4883612181565b90505f611e5682602061253a565b9050606060405190508160200181016040528281526020850160208651028101602083015b81831015611e9e57602083515102806020855101835e6020939093019201611e7b565b50919695505050505050565b611f376040518061026001604052805f81526020015f81526020015f81526020015f81526020015f81526020015f81526020015f80191681526020015f81526020015f81526020015f81526020015f81526020015f81526020015f80191681526020016060815260200160608152602001606081526020015f815260200160608152602001606081525090565b5f6040518061026001604052805f81526020015f81526020015f81526020015f81526020015f81526020015f81526020015f801b81526020015f8152602001600481526020015f81526020015f81526020015f81526020015f801b815260200184815260200185815260200160046001600160401b03811115611fbc57611fbc6123b1565b604051908082528060200260200182016040528015611fe5578160200160208202803683370190505b5081525f602080830182905260408084018b905260609384018a90528051601f01601f19168281528083018252835161ffff191681178452855290840182905283018190529082018190526080820181905260a08201819052610120820181905261014082018190526102008201529050611c14565b5f80825f528360205360215f2090506001815f1a1b915062ffffff8116611be7575060019250929050565b5f5f1982036120985750610100919050565b507f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f7f5555555555555555555555555555555555555555555555555555555555555555600183901c16909103600281901c7f3333333333333333333333333333333333333333333333333333333333333333908116911601600481901c01167f01010101010101010101010101010101010101010101010101010101010101010260f81c90565b5f805f61214d8686866121ca565b91509150806121785760405162bc8ecf60e31b81526004810187905260248101869052604401610c7d565b50949350505050565b5f60208201602083510281015b808210156121c35781515192830192808410156121b757634e487b715f5260116020526024601cfd5b5060208201915061218e565b5050919050565b5f805f8512156121f757604051634a7d166b60e01b81526004810186905260248101859052604401610c7d565b845f0361220957505f90506001611b0f565b8460ff84168501858112156122445760405163c849483b60e01b8152600481018890526024810187905260ff86166044820152606401610c7d565b5f805f83121561229057604c19831215612267575f809550955050505050611b0f565b825f03600a0a915081848161227e5761227e612507565b0495505084029091149150611b0f9050565b5f83131561232957604d8313156122cd5760405163c849483b60e01b8152600481018a90526024810189905260ff88166044820152606401610c7d565b82600a0a9150815f19816122e3576122e3612507565b048411156123175760405163c849483b60e01b8152600481018a90526024810189905260ff88166044820152606401610c7d565b5091909102925060019150611b0f9050565b8360019550955050505050611b0f565b612341612551565b565b5f60208284031215612353575f80fd5b81356001600160e01b03198116811461236a575f80fd5b9392505050565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f61236a6020830184612371565b634e487b7160e01b5f52604160045260245ffd5b5f602082840312156123d5575f80fd5b81356001600160401b03808211156123eb575f80fd5b818401915084601f8301126123fe575f80fd5b813581811115612410576124106123b1565b604051601f8201601f19908116603f01168101908382118183101715612438576124386123b1565b81604052828152876020848701011115612450575f80fd5b826020860160208301375f928101602001929092525095945050505050565b83151581525f60206060602084015261248b6060840186612371565b8381036040850152845180825260208087019201905f5b818110156124be578351835292840192918401916001016124a2565b509098975050505050505050565b634e487b7160e01b5f52601160045260245ffd5b808201808211156101d1576101d16124cc565b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52601260045260245ffd5b5f8261253557634e487b7160e01b5f52601260045260245ffd5b500490565b80820281158282048414176101d1576101d16124cc565b634e487b7160e01b5f52605160045260245ffdfe0101180010800082000100010480300038412a001810000010020004200004002038028ff54904cc66c61df3dcab0616592209895f0b14fec9301902e0920c5bfe561b21609200e959460b1974270f844db208bcd3bf1c9893761e1049db11b93430180ae9a00af82a7805c138f40d28083f0742ef2103d561fd1215a13315716a6117d260cc107b9bfc0eec7ade13cba2891a6b14a51f792bdb01e0f147165655891c3d1c3d1c3d1c3d1c3d1c3d1c3d1c3d1c3d1c3d1c3d1c3d1c3d1c3d1c3d1c3d1c3d1c3d1c3d1c3d1c3d1c3d1c3d1c3d1c3d1c3d1c3d1c3d1c3d1c3d1c661d02168216a016af16be16ce16de16ed16fd170c171c172c173b174b175a176a177a178a17da17e917f81808181818281838184718561866187618861896179917a8", "linkReferences": {} } } diff --git a/meta/RaindexV6SubParser.rain.meta b/meta/RaindexV6SubParser.rain.meta index 12aea4a7007c37f6b1cf5bedb3a81a78c7feb5dd..34cfe498a8370e31d45a1262010ea2f923728e13 100644 GIT binary patch delta 1354 zcmV-Q1-1I*3fu~R{|br5bnbX`qySk3DtMf=naz$PH4uP<+Wf#n}0d|L@kdSPMr z00_-WTsW{R!AOYPINeTSO}8D{?n%OFuAF&+c?!;R;Kobv5L}Tc|Mj?&j-BqwL~}^G z?DALTs&chw6#t-`$?qhl-?@y-Up!98uj2BT68c|8arrBM3Hht1artYbg#0ote?6i9 z4HTE(y@<>2CFb9|ip$?TjmzIk=zsenF2A3cfBz~jf9EtVe|MCSU&iI{9Vg`f#O3c_ z#N{8Lg#0Ql|L`;}|L8I<|M)mA|KwO;$_la?4g4hZkG?*c6NHOG5GfI#A_YI)lJFfX z^MH$j2t*}+nh?rnNYo5*mRSWxHlAZSzZJeC&8M|{ILl(t8lb!+Sdb#?QegS`k`Zwm ze4lps&mx*7Gq--uYo>@;V4>CrU7vNWuUGaz!j&yqhJK-C39bwMiO=*7n<;{5&obUM zbsNChXLewKhZFX_aQCEPbZclh6&P(oLDrLsDn$x^BT@o0iE~9cYa%7bwbZc^*vt`G zk-SzULnm_>^5fHAy;nlhj}Xab8CuQ>LzrzQgZ3Ol1r;P$C5)Zau$(fwo;^S5(x=^w z;VBgbau1|6&gffmyM#n|28k#YA~=We*E`eU{~VWjU1BhOT;bK2*J@F#gZY2-hxR`x zrd3^kA*;L<=0}KT;6D|N!j(3*8D-}vuHCdzQI9_X+E!a z2%zON(lIT1knP9!RP+7teVfd(*nnU;uT0(0v`{l35?o9bAXGd{ED-YBNIEG0GtEE2 zC1yG4GQtIKtIKf5Il^ELs=O&tu$2YV+rFU;hG-;(Oka|1HRy7JwFiKWtRb0+8bWZ?F7sS#&D}02*BAYIEJ;>WvFm zz1>1k5JSWVy*&+k|7@0Qns@ia_wOc@T_`xw&;pg>`=Wy{?8p3TfWz2+3H5vf3qXqR zn|A&OiGNMH4HZNAfDZbAV`5QxP^C>Lg+#K82_k;2Mt@*6#jhlgu zJAoi+^aYn#+n%j?etmEUmkfJ<&)#(}710CDMvcpI?O!Klmhj)80+{mO-t})+0!um@ zc=fv%-|s~3!#+M8y~Uxv2LM)2N}8iHvJRZ} MKi+U7hLb-9C8AlVx&QzG delta 1362 zcmV-Y1+Dtr3gilZ{|br5bnbX`qySk3GI*S|n9Xh*HxPhTpiTdi{{I8zEkI#y+O)}` zEeZ$drH3X!E1>Aj)Gj3v-X#T+Ye_x%+H+sPPtmgvz4ayX5V;1(@MqUcX+`d?Wy1%X zL(Y6NoEefk3jd(%$zP5vf8{(ZzZKDc>oP2V^*AhlEu#N_^@#k9ld$~FQABNYS7n-}CW!EUK%XllJS2_-ou*@|G`28Bq6BH7~W-vDBKPg?4K--Env1Mv7^qk1-g82|H5_3wFfBMkr^VDRcn z^$SdIT+`~!HUdfK1F!C#;`?`_{z+Y6)~Nq)2KQmO4zHDVL2m>+k#<)USfvXh-PJoU z3$tIFN`>1#Um=TNZW>wSUg!7hO93-~SOSmb zY3&P4#%#kG?C@{y{b(+j5RLS-b{eZv5c`PMLu9?wf!FVNT&e|hGLvuiZ~7N$g!V3g zmD8N2=#*?4!ODoqSUxaCV)1EvAJ-=9XQ&&gzCV~&mw0?b53m^DH!Xb4`+D_6b{M;l z=IHbFJ|JRzM=j^W&cWaqT1(XDGrhM5UX<_dUOwCA zLuek~zza%@?|$3;q)!5_s9IzKuLkz`7~hXA^>JmgW~_#GE4Y#jEZ`Vl*ZQq6b{^9; z->?FX@%5_T8nU|F?eg_4;27V%F7;b6;C#1Ew)pxMaE$M(Nd1P;d_ILq1>CE~_Vdoc z`2N>?R`u4Gqpfd7jiS*X=*7m~>Fe>Ui(TU*ROi+EzN-iHz-6?=dA_MWH^?Lszd;Q! U7QfE@Z(jkw06hF86O%UuC9e>!X#fBK diff --git a/meta/RaindexV6SubParserAuthoringMeta.rain.meta b/meta/RaindexV6SubParserAuthoringMeta.rain.meta index d628e1b5658a539cd6899cd24cd5ac1759c24ac6..5f7bc33bd5e72aeb5a044b6b4678802424b3fa2f 100644 GIT binary patch delta 155 zcmW;A%MHRn41{6X%7%p_Nq7skk4Vv;QpeH;2b2OglQ|Ba!x`@72l&}c$2p|^l4qm{cWCb>W=bxjitE;ZBCvW6U zSMGD@a9d!Cvx9c02a(_&6dp_1;3@u?(WAq2{Y%s5+ue9loJ$ECoCPj!trxP=DO*i- LFqt!(?>+qhW7;Kq diff --git a/src/concrete/parser/RaindexV6SubParser.sol b/src/concrete/parser/RaindexV6SubParser.sol index 9c532e8ecc..c85fd5f06c 100644 --- a/src/concrete/parser/RaindexV6SubParser.sol +++ b/src/concrete/parser/RaindexV6SubParser.sol @@ -14,6 +14,8 @@ import {LibUint256Matrix} from "rain-solmem-0.1.28/src/lib/LibUint256Matrix.sol" import { LibRaindexSubParser, SUB_PARSER_WORD_PARSERS_LENGTH, + BASE_WORD_RAINDEX, + BASE_WORDS_LENGTH, DEPOSIT_WORD_VAULT_ID, DEPOSIT_WORD_TOKEN, DEPOSIT_WORD_DEPOSITOR, @@ -30,12 +32,7 @@ import { WITHDRAW_WORD_TOKEN_DECIMALS, WITHDRAW_WORDS_LENGTH } from "../../lib/LibRaindexSubParser.sol"; -import { - CONTEXT_BASE_COLUMN, - CONTEXT_BASE_ROW_SENDER, - CONTEXT_BASE_ROW_CALLING_CONTRACT, - CONTEXT_BASE_ROWS -} from "rainlang-interface-0.2.13/src/lib/caller/LibContext.sol"; +import {CONTEXT_BASE_COLUMN} from "rainlang-interface-0.2.13/src/lib/caller/LibContext.sol"; import { CONTEXT_COLUMNS_EXTENDED, CONTEXT_VAULT_OUTPUTS_COLUMN, @@ -51,6 +48,9 @@ import { CONTEXT_CALCULATIONS_ROW_MAX_OUTPUT, CONTEXT_CALCULATIONS_ROWS, CONTEXT_CALLING_CONTEXT_ROW_ORDER_COUNTERPARTY, + CONTEXT_CALLING_CONTEXT_ROW_ORDER_CLEARER, + CONTEXT_DEPOSIT_COLUMN, + CONTEXT_WITHDRAW_COLUMN, CONTEXT_CALLING_CONTEXT_ROW_ORDER_OWNER, CONTEXT_CALLING_CONTEXT_ROW_ORDER_HASH, CONTEXT_CALLING_CONTEXT_ROWS, @@ -72,8 +72,8 @@ import {IDescribedByMetaV1} from "rain-metadata-0.1.43/src/interface/IDescribedB import {ISubParserToolingV1} from "rain-sol-codegen-0.1.39/src/interface/ISubParserToolingV1.sol"; /// @title RaindexV6SubParser -/// @notice Sub-parser that provides raindex-specific context words (sender, -/// order hash, vault IO, deposit/withdraw, signed context, etc.) to the +/// @notice Sub-parser that provides raindex-specific context words (raindex, +/// order hash, clearer, vault IO, deposit/withdraw, signed context, etc.) to the /// Rain interpreter. contract RaindexV6SubParser is BaseRainlangSubParser { using LibUint256Matrix for uint256[][]; @@ -109,9 +109,8 @@ contract RaindexV6SubParser is BaseRainlangSubParser { new function(bytes32[] memory) internal pure returns (OperandV2)[][](CONTEXT_COLUMNS_EXTENDED); function(bytes32[] memory) internal pure returns (OperandV2)[] memory contextBaseHandlers = - new function(bytes32[] memory) internal pure returns (OperandV2)[](CONTEXT_BASE_ROWS); - contextBaseHandlers[CONTEXT_BASE_ROW_SENDER] = LibParseOperand.handleOperandDisallowed; - contextBaseHandlers[CONTEXT_BASE_ROW_CALLING_CONTRACT] = LibParseOperand.handleOperandDisallowed; + new function(bytes32[] memory) internal pure returns (OperandV2)[](BASE_WORDS_LENGTH); + contextBaseHandlers[BASE_WORD_RAINDEX] = LibParseOperand.handleOperandDisallowed; function(bytes32[] memory) internal pure returns (OperandV2)[] memory contextCallingContextHandlers = new function(bytes32[] memory) internal pure returns (OperandV2)[](CONTEXT_CALLING_CONTEXT_ROWS); @@ -119,6 +118,8 @@ contract RaindexV6SubParser is BaseRainlangSubParser { contextCallingContextHandlers[CONTEXT_CALLING_CONTEXT_ROW_ORDER_OWNER] = LibParseOperand.handleOperandDisallowed; contextCallingContextHandlers[CONTEXT_CALLING_CONTEXT_ROW_ORDER_COUNTERPARTY] = LibParseOperand.handleOperandDisallowed; + contextCallingContextHandlers[CONTEXT_CALLING_CONTEXT_ROW_ORDER_CLEARER] = + LibParseOperand.handleOperandDisallowed; function(bytes32[] memory) internal pure returns (OperandV2)[] memory contextCalculationsHandlers = new function(bytes32[] memory) internal pure returns (OperandV2)[](CONTEXT_CALCULATIONS_ROWS); @@ -167,7 +168,7 @@ contract RaindexV6SubParser is BaseRainlangSubParser { contextDepositContextHandlers[DEPOSIT_WORD_VAULT_AFTER] = LibParseOperand.handleOperandDisallowed; contextDepositContextHandlers[DEPOSIT_WORD_TOKEN_DECIMALS] = LibParseOperand.handleOperandDisallowed; - handlers[CONTEXT_SIGNED_CONTEXT_START_COLUMN + 1] = contextDepositContextHandlers; + handlers[CONTEXT_DEPOSIT_COLUMN] = contextDepositContextHandlers; function(bytes32[] memory) internal pure returns (OperandV2)[] memory contextWithdrawContextHandlers = new function(bytes32[] memory) internal pure returns (OperandV2)[](WITHDRAW_WORDS_LENGTH); @@ -179,7 +180,7 @@ contract RaindexV6SubParser is BaseRainlangSubParser { contextWithdrawContextHandlers[WITHDRAW_WORD_TARGET_AMOUNT] = LibParseOperand.handleOperandDisallowed; contextWithdrawContextHandlers[WITHDRAW_WORD_TOKEN_DECIMALS] = LibParseOperand.handleOperandDisallowed; - handlers[CONTEXT_SIGNED_CONTEXT_START_COLUMN + 2] = contextWithdrawContextHandlers; + handlers[CONTEXT_WITHDRAW_COLUMN] = contextWithdrawContextHandlers; uint256[][] memory handlersUint256; assembly ("memory-safe") { @@ -201,9 +202,8 @@ contract RaindexV6SubParser is BaseRainlangSubParser { contextBaseParsers = new function(uint256, uint256, OperandV2) internal - view returns (bool, bytes memory, bytes32[] memory)[](CONTEXT_BASE_ROWS); - contextBaseParsers[CONTEXT_BASE_ROW_SENDER] = LibRaindexSubParser.subParserSender; - contextBaseParsers[CONTEXT_BASE_ROW_CALLING_CONTRACT] = LibRaindexSubParser.subParserCallingContract; + view returns (bool, bytes memory, bytes32[] memory)[](BASE_WORDS_LENGTH); + contextBaseParsers[BASE_WORD_RAINDEX] = LibRaindexSubParser.subParserCallingContract; function(uint256, uint256, OperandV2) internal view returns (bool, bytes memory, bytes32[] memory)[] memory contextCallingContextParsers = @@ -214,6 +214,8 @@ contract RaindexV6SubParser is BaseRainlangSubParser { contextCallingContextParsers[CONTEXT_CALLING_CONTEXT_ROW_ORDER_OWNER] = LibRaindexSubParser.subParserOrderOwner; contextCallingContextParsers[CONTEXT_CALLING_CONTEXT_ROW_ORDER_COUNTERPARTY] = LibRaindexSubParser.subParserOrderCounterparty; + contextCallingContextParsers[CONTEXT_CALLING_CONTEXT_ROW_ORDER_CLEARER] = + LibRaindexSubParser.subParserOrderClearer; function(uint256, uint256, OperandV2) internal view returns (bool, bytes memory, bytes32[] memory)[] memory contextCalculationsParsers = @@ -275,14 +277,14 @@ contract RaindexV6SubParser is BaseRainlangSubParser { internal view returns (bool, bytes memory, bytes32[] memory)[](DEPOSIT_WORDS_LENGTH); - depositParsers[DEPOSIT_WORD_DEPOSITOR] = LibRaindexSubParser.subParserSender; + depositParsers[DEPOSIT_WORD_DEPOSITOR] = LibRaindexSubParser.subParserDepositor; depositParsers[DEPOSIT_WORD_TOKEN] = LibRaindexSubParser.subParserDepositToken; depositParsers[DEPOSIT_WORD_VAULT_ID] = LibRaindexSubParser.subParserDepositVaultId; depositParsers[DEPOSIT_WORD_VAULT_BEFORE] = LibRaindexSubParser.subParserDepositVaultBalanceBefore; depositParsers[DEPOSIT_WORD_VAULT_AFTER] = LibRaindexSubParser.subParserDepositVaultBalanceAfter; depositParsers[DEPOSIT_WORD_TOKEN_DECIMALS] = LibRaindexSubParser.subParserDepositTokenDecimals; - parsers[CONTEXT_SIGNED_CONTEXT_START_COLUMN + 1] = depositParsers; + parsers[CONTEXT_DEPOSIT_COLUMN] = depositParsers; // Withdraws @@ -292,7 +294,7 @@ contract RaindexV6SubParser is BaseRainlangSubParser { internal view returns (bool, bytes memory, bytes32[] memory)[](WITHDRAW_WORDS_LENGTH); - withdrawParsers[WITHDRAW_WORD_WITHDRAWER] = LibRaindexSubParser.subParserSender; + withdrawParsers[WITHDRAW_WORD_WITHDRAWER] = LibRaindexSubParser.subParserWithdrawer; withdrawParsers[WITHDRAW_WORD_TOKEN] = LibRaindexSubParser.subParserWithdrawToken; withdrawParsers[WITHDRAW_WORD_VAULT_ID] = LibRaindexSubParser.subParserWithdrawVaultId; withdrawParsers[WITHDRAW_WORD_VAULT_BEFORE] = LibRaindexSubParser.subParserWithdrawVaultBalanceBefore; @@ -300,7 +302,7 @@ contract RaindexV6SubParser is BaseRainlangSubParser { withdrawParsers[WITHDRAW_WORD_TARGET_AMOUNT] = LibRaindexSubParser.subParserWithdrawTargetAmount; withdrawParsers[WITHDRAW_WORD_TOKEN_DECIMALS] = LibRaindexSubParser.subParserWithdrawTokenDecimals; - parsers[CONTEXT_SIGNED_CONTEXT_START_COLUMN + 2] = withdrawParsers; + parsers[CONTEXT_WITHDRAW_COLUMN] = withdrawParsers; uint256[][] memory parsersUint256; assembly ("memory-safe") { diff --git a/src/concrete/raindex/RaindexV6.sol b/src/concrete/raindex/RaindexV6.sol index ae2f178490..5475023110 100644 --- a/src/concrete/raindex/RaindexV6.sol +++ b/src/concrete/raindex/RaindexV6.sol @@ -314,7 +314,8 @@ contract RaindexV6 is IRaindexV6, IMetaV1_2, ReentrancyGuard, Multicall, Raindex function _doOrderPost(bytes32 orderHash, TaskV2[] calldata post) internal { LibRaindex.doPost( LibRaindex.callingContextColumn( - CONTEXT_CALLING_CONTEXT_COLUMN, LibBytes32Array.arrayFrom(orderHash, bytes32(uint256(uint160(msg.sender)))) + CONTEXT_CALLING_CONTEXT_COLUMN, + LibBytes32Array.arrayFrom(orderHash, bytes32(uint256(uint160(msg.sender)))) ), post ); diff --git a/src/generated/RaindexV6SubParserPointers.sol b/src/generated/RaindexV6SubParserPointers.sol index 9a7b389e4b..7de264f929 100644 --- a/src/generated/RaindexV6SubParserPointers.sol +++ b/src/generated/RaindexV6SubParserPointers.sol @@ -5,10 +5,10 @@ pragma solidity ^0.8.25; // THIS FILE IS AUTOGENERATED BY THE BUILD SCRIPT. DO NOT EDIT BY HAND. /// @dev Hash of the known bytecode. -bytes32 constant BYTECODE_HASH = bytes32(0xb5f18596862c369ecb1bc3cf69399785a578427214d9372d94d0fde2ed0ecaeb); +bytes32 constant BYTECODE_HASH = bytes32(0xb1b4649132a7ad03265562c1a423ea9c47c1c19d24882c98827e8f5c9b3fd439); /// @dev The hash of the meta that describes the contract. -bytes32 constant DESCRIBED_BY_META_HASH = bytes32(0xf2d0eca454c544ab10f9991c019349475a416e38494f112a50807174c3000d0b); +bytes32 constant DESCRIBED_BY_META_HASH = bytes32(0xe43208b51e17b3d887e8f3535d75526c0744eee6a200dac603462c6b3ca46511); /// @dev The parse meta that is used to lookup word definitions. /// The structure of the parse meta is: @@ -27,7 +27,7 @@ bytes32 constant DESCRIBED_BY_META_HASH = bytes32(0xf2d0eca454c544ab10f9991c0193 /// bit count of the previous bloom filter. If we reach the end of the bloom /// filters then we have a miss. bytes constant PARSE_META = - hex"0101180010800082000100010480300038412a001810000010020004200004002038038ff54900cc66c61ff3dcab0616592209895f0b16fec9301b02e0920c5bfe561d21609201e959460b1974270f844db208bcd3bf1e989376111049db13b934301a0ae9a00af82a7805c138f40d28083f0742ef2104d561fd1415a13317716a6119d260cc107b9bfc0eec7ade15cba2891c6b14a512792bdb02e0f14718565589"; + hex"0101180010800082000100010480300038412a001810000010020004200004002038028ff54904cc66c61df3dcab0616592209895f0b14fec9301902e0920c5bfe561b21609200e959460b1974270f844db208bcd3bf1c9893761e1049db11b93430180ae9a00af82a7805c138f40d28083f0742ef2103d561fd1215a13315716a6117d260cc107b9bfc0eec7ade13cba2891a6b14a51f792bdb01e0f14716565589"; /// @dev The build depth of the parser meta. @@ -39,13 +39,13 @@ uint8 constant PARSE_META_BUILD_DEPTH = 1; /// to things that happen entirely on the interpreter such as well known /// constants and references to the context grid. bytes constant SUB_PARSER_WORD_PARSERS = - hex"16cc16e916f8170717161726173517451754176417741783179317a217b217c217d217e117f016cc16f8170717161825183516cc16f817071716182518351845"; + hex"168216a016af16be16ce16de16ed16fd170c171c172c173b174b175a176a177a178a17da17e917f81808181818281838184718561866187618861896179917a8"; /// @dev Every two bytes is a function pointer for an operand handler. /// These positional indexes all map to the same indexes looked up in the parse /// meta. bytes constant OPERAND_HANDLER_FUNCTION_POINTERS = - hex"1bec1bec1bec1bec1bec1bec1bec1bec1bec1bec1bec1bec1bec1bec1bec1bec1bec1c151cb11bec1bec1bec1bec1bec1bec1bec1bec1bec1bec1bec1bec1bec"; + hex"1c3d1c3d1c3d1c3d1c3d1c3d1c3d1c3d1c3d1c3d1c3d1c3d1c3d1c3d1c3d1c3d1c3d1c3d1c3d1c3d1c3d1c3d1c3d1c3d1c3d1c3d1c3d1c3d1c3d1c3d1c661d02"; /// @dev Every two bytes is a function pointer for a literal parser. /// Literal dispatches are determined by the first byte(s) of the literal diff --git a/src/generated/candidate/GenericPoolRaindexV6ArbOrderTaker.sol b/src/generated/candidate/GenericPoolRaindexV6ArbOrderTaker.sol index a4f0bda43c..ad90489006 100644 --- a/src/generated/candidate/GenericPoolRaindexV6ArbOrderTaker.sol +++ b/src/generated/candidate/GenericPoolRaindexV6ArbOrderTaker.sol @@ -5,19 +5,19 @@ pragma solidity ^0.8.25; // THIS FILE IS AUTOGENERATED BY THE BUILD SCRIPT. DO NOT EDIT BY HAND. /// @dev Hash of the known bytecode. -bytes32 constant BYTECODE_HASH = bytes32(0x03aa2ae03c9cc0dd739d981383f64576be92d34a8670781c2c09232102e87d57); +bytes32 constant BYTECODE_HASH = bytes32(0x2ac82a8a73cce8eb60900494c057b230dbee65e0cd7f15686e85b479884e27ed); /// @dev The deterministic deploy address of the contract when deployed via /// the Zoltu factory. -address constant DEPLOYED_ADDRESS = address(0xb9B5eaeA3588De6e7A547fa152De86DF6BE85508); +address constant DEPLOYED_ADDRESS = address(0xC65A751b5882C62f08FD8229a99d26f7431C7d91); /// @dev The creation bytecode of the contract. bytes constant CREATION_CODE = - hex"6080604052348015600e575f80fd5b5060017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00556123a0806100405f395ff3fe608060405260043610610034575f3560e01c806301ffc9a71461003d578063691f9ed714610070578063b17c83c11461008f57005b3661003b57005b005b348015610048575f80fd5b5061005c61005736600461163a565b6100a2565b604051901515815260200160405180910390f35b34801561007b575f80fd5b5061003b61008a366004611675565b6100f3565b61003b61009d366004611717565b61013a565b5f6001600160e01b0319821663691f9ed760e01b14806100d257506001600160e01b0319821663b17c83c160e01b145b806100ed57506301ffc9a760e01b6001600160e01b03198316145b92915050565b6101328683838080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152506103fc92505050565b505050505050565b6101426104ad565b61015161014e82611a06565b50565b61015e6080830183611ac2565b90505f0361017f57604051639c95219f60e01b815260040160405180910390fd5b6001600160a01b03831673834e1da0d2e04ab48f9efa6a7b9bbdb6ff62839e146101cc5760405163516e822d60e01b81526001600160a01b03841660048201526024015b60405180910390fd5b5f6101da6080840184611ac2565b5f8181106101ea576101ea611b08565b90506020028101906101fc9190611b1c565b6102069080611b3a565b610214906040810190611b4e565b6102216080860186611ac2565b5f81811061023157610231611b08565b90506020028101906102439190611b1c565b6020013581811061025657610256611b08565b61026c9260206040909202019081019150611b94565b90505f61027c6080850185611ac2565b5f81811061028c5761028c611b08565b905060200281019061029e9190611b1c565b6102a89080611b3a565b6102b6906060810190611b4e565b6102c36080870187611ac2565b5f8181106102d3576102d3611b08565b90506020028101906102e59190611b1c565b604001358181106102f8576102f8611b08565b61030e9260206040909202019081019150611b94565b90506103256001600160a01b038316865f196104db565b6040516334e3942b60e11b81526001600160a01b038616906369c7285690610351908790600401611df8565b60408051808303815f875af115801561036c573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906103909190611ff8565b506103a790506001600160a01b038316865f6104db565b6103cc6103b384611a06565b836103bd85610555565b846103c786610555565b6105d9565b50506103f760017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b505050565b5f805f83806020019051810190610413919061201a565b919450925090506001600160a01b038316610441576040516398521dc560e01b815260040160405180910390fd5b6001600160a01b0382166104685760405163456ac4c360e11b815260040160405180910390fd5b61047d6001600160a01b038616845f196104db565b6104916001600160a01b0383168247610878565b506104a66001600160a01b038616845f6104db565b5050505050565b6104b5610945565b60027f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b6104e78383835f610989565b6103f7576104f883835f6001610989565b61052057604051635274afe760e01b81526001600160a01b03841660048201526024016101c3565b61052d8383836001610989565b6103f757604051635274afe760e01b81526001600160a01b03841660048201526024016101c3565b5f61055e6109eb565b6040516354636d2b60e01b81526001600160a01b038316600482015273200e12d10bb0c5e4a17e7018f0f1161919bb9389906354636d2b906024016020604051808303815f875af11580156105b5573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906100ed91906120b5565b6040805160018082528183019092525f91816020015b60608152602001906001900390816105ef575050604080516003808252608082019092529192505f919060208201606080368337019050506040516370a0823160e01b81523060048201529091505f906001600160a01b038816906370a0823190602401602060405180830381865afa15801561066e573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061069291906120d5565b905080156106ae576106ae6001600160a01b0388163383610a76565b5f6106b98288610a83565b50905080835f815181106106cf576106cf611b08565b602090810291909101015250506040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa158015610720573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061074491906120d5565b90508015610760576107606001600160a01b0386163383610a76565b5f61076b8286610a83565b509050808360018151811061078257610782611b08565b60209081029190910101525047905080156107a1576107a13382610ac4565b5f6107ad826012610a83565b50905080836002815181106107c4576107c4611b08565b602002602001018181525050505080825f815181106107e5576107e5611b08565b60209081029190910101526040805160018082528183019092525f91816020015b6040805160a0810182525f918101828152606080830193909352608082018390528152602081019190915281526020019060019003908161080657905050905087815f8151811061085957610859611b08565b602002602001018190525061086e8382610b22565b5050505050505050565b6060814710156108a45760405163cf47918160e01b8152476004820152602481018390526044016101c3565b5f6108b0858486610d6a565b90508080156108d157505f3d11806108d157505f856001600160a01b03163b115b156108e6576108de610d7f565b91505061093e565b801561091057604051639996b31560e01b81526001600160a01b03861660048201526024016101c3565b3d156109235761091e610d98565b61093c565b60405163d6bda27560e01b815260040160405180910390fd5b505b9392505050565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f005460020361098757604051633ee5aeb560e01b815260040160405180910390fd5b565b60405163095ea7b360e01b5f8181526001600160a01b038616600452602485905291602083604481808b5af1925060015f511483166109df5783831516156109d3573d5f823e3d81fd5b5f873b113d1516831692505b60405250949350505050565b73200e12d10bb0c5e4a17e7018f0f1161919bb93893b1580610a42575073200e12d10bb0c5e4a17e7018f0f1161919bb93893f7f1de7d717526cba131d684e312dedbf0852adef9cced9e36798ae4937f7145d4114155b15610987576040516373e6d7b360e01b815273200e12d10bb0c5e4a17e7018f0f1161919bb938960048201526024016101c3565b61052d8383836001610da3565b5f805f805f610a928787610ded565b9250925092505f80610aa48585610e49565b9150915081838015610ab35750815b9650965050505050505b9250929050565b80471015610aee5760405163cf47918160e01b8152476004820152602481018290526044016101c3565b610b07828260405180602001604052805f815250610d6a565b15610b10575050565b3d1561092357610b1e610d98565b5050565b60408051600480825260a082019092525f91816020015b6060815260200190600190039081610b395790505090505f5b8351811015610b9a57838181518110610b6d57610b6d611b08565b6020026020010151828281518110610b8757610b87611b08565b6020908102919091010152600101610b52565b50335f8181523060209081526040808320815160a0810183528083018581526060808301879052608083018190529082528185015282518581529384018581528484019093529093909291905b8751811015610d5f57878181518110610c0257610c02611b08565b602002602001015193505f845f015160400151511115610d57575f845f01515f01516001600160a01b031663d04dfe236040518060e00160405280885f0151602001516001600160a01b03168152602001898152602001885f01516040015181526020015f8152602001610c7a8c8a602001516110bc565b8152602001878152602001868152506040518263ffffffff1660e01b8152600401610ca591906121a1565b5f60405180830381865afa158015610cbf573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610ce691908101906122a2565b9150505f81511115610d555784516020015160405163012c676d60e21b81526001600160a01b03909116906304b19db490610d27908a908590600401612358565b5f604051808303815f87803b158015610d3e575f80fd5b505af1158015610d50573d5f803e3d5ffd5b505050505b505b600101610be7565b505050505050505050565b5f805f83516020850186885af1949350505050565b6040513d81523d5f602083013e3d602001810160405290565b6040513d5f823e3d81fd5b60405163a9059cbb60e01b5f8181526001600160a01b038616600452602485905291602083604481808b5af1925060015f511483166109df5783831516156109d3573d5f823e3d81fd5b5f808060ff841681037f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff861115610e3857600a860460018201600a88065f1493509350935050610e42565b8593509150600190505b9250925092565b5f808383601b82900b821480610f94577d90e40fbeea1d3a4abc8955e946fe31cdcf66f634e1000000000000000000870515610eca577f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee8000000000000000000870515610ebb576305f5e10087059650600886019550610eca565b620186a0870596506005860195505b8687601b0b14610ee557600a87059650856001019550610eca565b7b0ccccccccccccccccccccccccccccccccccccccccccccccccccccccc7b1999999999999999999999999999999999999999999999999999999888820111610f8e575f600188039050808160030b03610f8c5760e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff7b7fffffffffffffffffffffffffffffffffffffffffffffffffffffff60ff8b901d18161795505f9450610abd9350505050565b505b50610fab565b865f03610fab57505f935060019250610abd915050565b858660030b14611062575f82131561100a57610fc7838361139e565b15610fef5760405163d556b11160e01b815260048101849052602481018390526044016101c3565b637ffffffe19909501600a0a82029550637fffffff94611062565b637fffffff19869003604381131561102c57505f9450849350610abd92505050565b80600a0a888161103e5761103e612378565b059750875f0361105857505f9450849350610abd92505050565b50637fffffff1995505b818613611072576001935061108b565b818603600a0a838161108657611086612378565b071593505b5050507bffffffffffffffffffffffffffffffffffffffffffffffffffffffff841660e084901b1791509250929050565b60605f825167ffffffffffffffff8111156110d9576110d9611795565b604051908082528060200260200182016040528015611102578160200160208202803683370190505b5090505f80845111611114575f61111a565b83516001015b85516001010190505f8167ffffffffffffffff81111561113c5761113c611795565b60405190808252806020026020018201604052801561116f57816020015b606081526020019060019003908161115a5790505b5090505f611193604080516002815233602082015230818301526060810190915290565b8282815181106111a5576111a5611b08565b60200260200101819052505f5b87518110156112025781806001019250508781815181106111d5576111d5611b08565b60200260200101518383815181106111ef576111ef611b08565b60209081029190910101526001016111b2565b508551156113945780806001019150508382828151811061122557611225611b08565b60200260200101819052505f5b8651811015611392576112e187828151811061125057611250611b08565b60200260200101515f01516112be61128c8a858151811061127357611273611b08565b6020026020010151602001518051602090810291012090565b7f19457468657265756d205369676e6564204d6573736167653a0a3332000000005f908152601c91909152603c902090565b8984815181106112d0576112d0611b08565b6020026020010151604001516113b9565b61130157604051630a57f30960e31b8152600481018290526024016101c3565b86818151811061131357611313611b08565b60200260200101515f01516001600160a01b03165f1b85828151811061133b5761133b611b08565b602002602001018181525050818060010192505086818151811061136157611361611b08565b60200260200101516020015183838151811061137f5761137f611b08565b6020908102919091010152600101611232565b505b5095945050505050565b5f61093e5f84126113af57836113b3565b835f035b83611429565b5f836001600160a01b03163b5f03611417575f806113d785856114c7565b5090925090505f8160038111156113f0576113f061238c565b14801561140e5750856001600160a01b0316826001600160a01b0316145b9250505061093e565b61142284848461150d565b905061093e565b5f637ffffff5821361143c57505f6100ed565b637ffffffe19820160438113156114575750508115156100ed565b5f81126114975780600a0a7b800000000000000000000000000000000000000000000000000000018161148c5761148c612378565b0484119150506100ed565b805f03600a0a7b800000000000000000000000000000000000000000000000000000020284101591505092915050565b5f805f83516041036114fe576020840151604085015160608601515f1a6114f088828585611572565b955095509550505050610e42565b505081515f9150600290610e42565b805160408051630b135d3f60e11b8082526004820186905260248201929092525f92906020820185604483015e5f82606483010152601f820160051c60051b915060205f60648401838a5afa9050825f5114601f3d1116811693505050509392505050565b5f80807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08411156115ab57505f91506003905082611630565b604080515f808252602082018084528a905260ff891692820192909252606081018790526080810186905260019060a0016020604051602081039080840390855afa1580156115fc573d5f803e3d5ffd5b5050604051601f1901519150506001600160a01b03811661162757505f925060019150829050611630565b92505f91508190505b9450945094915050565b5f6020828403121561164a575f80fd5b81356001600160e01b03198116811461093e575f80fd5b6001600160a01b038116811461014e575f80fd5b5f805f805f8060a0878903121561168a575f80fd5b863561169581611661565b955060208701356116a581611661565b94506040870135935060608701359250608087013567ffffffffffffffff808211156116cf575f80fd5b818901915089601f8301126116e2575f80fd5b8135818111156116f0575f80fd5b8a6020828501011115611701575f80fd5b6020830194508093505050509295509295509295565b5f805f60608486031215611729575f80fd5b833561173481611661565b9250602084013567ffffffffffffffff80821115611750575f80fd5b9085019060c08288031215611763575f80fd5b90925060408501359080821115611778575f80fd5b5084016040818703121561178a575f80fd5b809150509250925092565b634e487b7160e01b5f52604160045260245ffd5b6040516060810167ffffffffffffffff811182821017156117cc576117cc611795565b60405290565b6040805190810167ffffffffffffffff811182821017156117cc576117cc611795565b604051601f8201601f1916810167ffffffffffffffff8111828210171561181e5761181e611795565b604052919050565b5f67ffffffffffffffff82111561183f5761183f611795565b50601f01601f191660200190565b5f82601f83011261185c575f80fd5b813561186f61186a82611826565b6117f5565b818152846020838601011115611883575f80fd5b816020850160208301375f918101602001919091529392505050565b5f67ffffffffffffffff8211156118b8576118b8611795565b5060051b60200190565b5f82601f8301126118d1575f80fd5b813560206118e161186a8361189f565b82815260059290921b840181019181810190868411156118ff575f80fd5b8286015b848110156119fb57803567ffffffffffffffff80821115611922575f80fd5b908801906060828b03601f19011215611939575f80fd5b6119416117a9565b8683013561194e81611661565b815260408381013583811115611962575f80fd5b8401603f81018d13611972575f80fd5b8881013561198261186a8261189f565b81815260059190911b82018301908a8101908f8311156119a0575f80fd5b928401925b828410156119be5783358252928b0192908b01906119a5565b858c01525050506060840135838111156119d6575f80fd5b6119e48d8a8388010161184d565b918301919091525085525050918301918301611903565b509695505050505050565b5f60408236031215611a16575f80fd5b611a1e6117d2565b823567ffffffffffffffff80821115611a35575f80fd5b818501915060608236031215611a49575f80fd5b611a516117a9565b8235611a5c81611661565b81526020830135611a6c81611661565b6020820152604083013582811115611a82575f80fd5b611a8e3682860161184d565b60408301525083526020850135915080821115611aa9575f80fd5b50611ab6368286016118c2565b60208301525092915050565b5f808335601e19843603018112611ad7575f80fd5b83018035915067ffffffffffffffff821115611af1575f80fd5b6020019150600581901b3603821315610abd575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235607e19833603018112611b30575f80fd5b9190910192915050565b5f8235609e19833603018112611b30575f80fd5b5f808335601e19843603018112611b63575f80fd5b83018035915067ffffffffffffffff821115611b7d575f80fd5b6020019150600681901b3603821315610abd575f80fd5b5f60208284031215611ba4575f80fd5b813561093e81611661565b5f808335601e19843603018112611bc4575f80fd5b830160208101925035905067ffffffffffffffff811115611be3575f80fd5b8060051b3603821315610abd575f80fd5b5f8235605e19833603018112611c08575f80fd5b90910192915050565b5f808335601e19843603018112611c26575f80fd5b830160208101925035905067ffffffffffffffff811115611c45575f80fd5b803603821315610abd575f80fd5b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b5f808335601e19843603018112611c90575f80fd5b830160208101925035905067ffffffffffffffff811115611caf575f80fd5b8060061b3603821315610abd575f80fd5b8183525f60208085019450825f5b85811015611d06578135611ce181611661565b6001600160a01b03168752818301358388015260409687019690910190600101611cce565b509495945050505050565b8183526020808401935f91600585811b8301820185855b88811015611dea57858303601f19018a52611d438289611bf4565b60608135611d5081611661565b6001600160a01b03168552611d6782880183611baf565b82898801528083880152608092507f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811115611da1575f80fd5b871b808288850137860190506040611dbb84820185611c11565b9450838884030182890152611dd38484018683611c53565b9e8a019e9750505093870193505050600101611d28565b509098975050505050505050565b5f602080835260e08301843582850152604082860135818601526060818701358187015280870135801515808214611e2e575f80fd5b8060808901525050611e436080880188611baf565b60c060a08901529384905261010093848801600582901b89018601835f5b84811015611fbf578b830360ff19018452813536879003607e19018112611e86575f80fd5b8601803536829003609e19018112611e9c575f80fd5b6080855281018035611ead81611661565b6001600160a01b038082166080880152611ec98e840184611bf4565b915060a0808801528135611edc81611661565b8116610120880152818e0135611ef181611661565b16610140870152611f04818c0182611c11565b91508a610160880152611f1c61018088018383611c53565b915050611f2b8b830183611c7b565b607f19808985030160c08a0152611f43848385611cc0565b9350611f518d860186611c7b565b93509150808985030160e08a015250611f6b838383611cc0565b9250505060808201358c8701528c8301358d8701528a8301358b870152611f948a840184611baf565b935091508581038a870152611faa818484611d11565b968d019695505050918a019150600101611e61565b5050611fce60a08c018c611c11565b8b8303601f190160c08d015298509650611fe9818989611c53565b9b9a5050505050505050505050565b5f8060408385031215612009575f80fd5b505080516020909101519092909150565b5f805f6060848603121561202c575f80fd5b835161203781611661565b602085015190935061204881611661565b604085015190925067ffffffffffffffff811115612064575f80fd5b8401601f81018613612074575f80fd5b805161208261186a82611826565b818152876020838501011115612096575f80fd5b8160208401602083015e5f602083830101528093505050509250925092565b5f602082840312156120c5575f80fd5b815160ff8116811461093e575f80fd5b5f602082840312156120e5575f80fd5b5051919050565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b5f815180845260208085019450602084015f5b83811015611d065781518752958201959082019060010161212d565b5f8282518085526020808601955060208260051b840101602086015f5b8481101561219457601f1986840301895261218283835161211a565b98840198925090830190600101612166565b5090979650505050505050565b602081526001600160a01b038251166020820152602082015160408201525f604083015160e060608401526121da6101008401826120ec565b9050606084015160808401526080840151601f19808584030160a08601526122028383612149565b925060a08601519150808584030160c086015261221f838361211a565b925060c08601519150808584030160e08601525061223d828261211a565b95945050505050565b5f82601f830112612255575f80fd5b8151602061226561186a8361189f565b8083825260208201915060208460051b870101935086841115612286575f80fd5b602086015b848110156119fb578051835291830191830161228b565b5f80604083850312156122b3575f80fd5b825167ffffffffffffffff808211156122ca575f80fd5b818501915085601f8301126122dd575f80fd5b815160206122ed61186a8361189f565b82815260059290921b8401810191818101908984111561230b575f80fd5b948201945b8386101561232957855182529482019490820190612310565b91880151919650909350505080821115612341575f80fd5b5061234e85828601612246565b9150509250929050565b828152604060208201525f612370604083018461211a565b949350505050565b634e487b7160e01b5f52601260045260245ffd5b634e487b7160e01b5f52602160045260245ffd"; + hex"6080604052348015600e575f80fd5b5060017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055612454806100405f395ff3fe608060405260043610610034575f3560e01c806301ffc9a71461003d578063691f9ed714610070578063b17c83c11461008f57005b3661003b57005b005b348015610048575f80fd5b5061005c6100573660046116cf565b6100a2565b604051901515815260200160405180910390f35b34801561007b575f80fd5b5061003b61008a36600461170a565b6100f3565b61003b61009d3660046117ac565b61013a565b5f6001600160e01b0319821663691f9ed760e01b14806100d257506001600160e01b0319821663b17c83c160e01b145b806100ed57506301ffc9a760e01b6001600160e01b03198316145b92915050565b6101328683838080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152506103fc92505050565b505050505050565b6101426104ad565b61015161014e82611a9b565b50565b61015e6080830183611b57565b90505f0361017f57604051639c95219f60e01b815260040160405180910390fd5b6001600160a01b03831673d31af42aafee144967be4b5688ecf09592258d7b146101cc5760405163516e822d60e01b81526001600160a01b03841660048201526024015b60405180910390fd5b5f6101da6080840184611b57565b5f8181106101ea576101ea611b9d565b90506020028101906101fc9190611bb1565b6102069080611bcf565b610214906040810190611be3565b6102216080860186611b57565b5f81811061023157610231611b9d565b90506020028101906102439190611bb1565b6020013581811061025657610256611b9d565b61026c9260206040909202019081019150611c29565b90505f61027c6080850185611b57565b5f81811061028c5761028c611b9d565b905060200281019061029e9190611bb1565b6102a89080611bcf565b6102b6906060810190611be3565b6102c36080870187611b57565b5f8181106102d3576102d3611b9d565b90506020028101906102e59190611bb1565b604001358181106102f8576102f8611b9d565b61030e9260206040909202019081019150611c29565b90506103256001600160a01b038316865f196104db565b6040516334e3942b60e11b81526001600160a01b038616906369c7285690610351908790600401611e8d565b60408051808303815f875af115801561036c573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610390919061208d565b506103a790506001600160a01b038316865f6104db565b6103cc6103b384611a9b565b836103bd85610555565b846103c786610555565b6105d9565b50506103f760017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b505050565b5f805f8380602001905181019061041391906120af565b919450925090506001600160a01b038316610441576040516398521dc560e01b815260040160405180910390fd5b6001600160a01b0382166104685760405163456ac4c360e11b815260040160405180910390fd5b61047d6001600160a01b038616845f196104db565b6104916001600160a01b038316824761082a565b506104a66001600160a01b038616845f6104db565b5050505050565b6104b56108f7565b60027f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b6104e78383835f61093b565b6103f7576104f883835f600161093b565b61052057604051635274afe760e01b81526001600160a01b03841660048201526024016101c3565b61052d838383600161093b565b6103f757604051635274afe760e01b81526001600160a01b03841660048201526024016101c3565b5f61055e61099d565b6040516354636d2b60e01b81526001600160a01b038316600482015273200e12d10bb0c5e4a17e7018f0f1161919bb9389906354636d2b906024016020604051808303815f875af11580156105b5573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906100ed919061214a565b604080516003808252608082019092525f9160208201606080368337019050506040516370a0823160e01b81523060048201529091505f906001600160a01b038716906370a0823190602401602060405180830381865afa158015610640573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610664919061216a565b90508015610680576106806001600160a01b0387163383610a28565b5f61068b8287610a35565b50905080835f815181106106a1576106a1611b9d565b602090810291909101015250506040516370a0823160e01b81523060048201525f906001600160a01b038516906370a0823190602401602060405180830381865afa1580156106f2573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610716919061216a565b90508015610732576107326001600160a01b0385163383610a28565b5f61073d8285610a35565b509050808360018151811061075457610754611b9d565b6020908102919091010152504790508015610773576107733382610a76565b5f61077f826012610a35565b509050808360028151811061079657610796611b9d565b602090810291909101015250506040805160018082528183019092525f91816020015b6040805160a0810182525f91810182815260608083019390935260808201839052815260208101919091528152602001906001900390816107b957905050905086815f8151811061080c5761080c611b9d565b60200260200101819052506108218282610ad4565b50505050505050565b6060814710156108565760405163cf47918160e01b8152476004820152602481018390526044016101c3565b5f610862858486610ae9565b905080801561088357505f3d118061088357505f856001600160a01b03163b115b1561089857610890610afe565b9150506108f0565b80156108c257604051639996b31560e01b81526001600160a01b03861660048201526024016101c3565b3d156108d5576108d0610b17565b6108ee565b60405163d6bda27560e01b815260040160405180910390fd5b505b9392505050565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f005460020361093957604051633ee5aeb560e01b815260040160405180910390fd5b565b60405163095ea7b360e01b5f8181526001600160a01b038616600452602485905291602083604481808b5af1925060015f51148316610991578383151615610985573d5f823e3d81fd5b5f873b113d1516831692505b60405250949350505050565b73200e12d10bb0c5e4a17e7018f0f1161919bb93893b15806109f4575073200e12d10bb0c5e4a17e7018f0f1161919bb93893f7f1de7d717526cba131d684e312dedbf0852adef9cced9e36798ae4937f7145d4114155b15610939576040516373e6d7b360e01b815273200e12d10bb0c5e4a17e7018f0f1161919bb938960048201526024016101c3565b61052d8383836001610b22565b5f805f805f610a448787610b6c565b9250925092505f80610a568585610bc8565b9150915081838015610a655750815b9650965050505050505b9250929050565b80471015610aa05760405163cf47918160e01b8152476004820152602481018290526044016101c3565b610ab9828260405180602001604052805f815250610ae9565b15610ac2575050565b3d156108d557610ad0610b17565b5050565b610ad0610ae2600784610e3b565b825f610e9d565b5f805f83516020850186885af1949350505050565b6040513d81523d5f602083013e3d602001810160405290565b6040513d5f823e3d81fd5b60405163a9059cbb60e01b5f8181526001600160a01b038616600452602485905291602083604481808b5af1925060015f51148316610991578383151615610985573d5f823e3d81fd5b5f808060ff841681037f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff861115610bb757600a860460018201600a88065f1493509350935050610bc1565b8593509150600190505b9250925092565b5f808383601b82900b821480610d13577d90e40fbeea1d3a4abc8955e946fe31cdcf66f634e1000000000000000000870515610c49577f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee8000000000000000000870515610c3a576305f5e10087059650600886019550610c49565b620186a0870596506005860195505b8687601b0b14610c6457600a87059650856001019550610c49565b7b0ccccccccccccccccccccccccccccccccccccccccccccccccccccccc7b1999999999999999999999999999999999999999999999999999999888820111610d0d575f600188039050808160030b03610d0b5760e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff7b7fffffffffffffffffffffffffffffffffffffffffffffffffffffff60ff8b901d18161795505f9450610a6f9350505050565b505b50610d2a565b865f03610d2a57505f935060019250610a6f915050565b858660030b14610de1575f821315610d8957610d468383611151565b15610d6e5760405163d556b11160e01b815260048101849052602481018390526044016101c3565b637ffffffe19909501600a0a82029550637fffffff94610de1565b637fffffff198690036043811315610dab57505f9450849350610a6f92505050565b80600a0a8881610dbd57610dbd612181565b059750875f03610dd757505f9450849350610a6f92505050565b50637fffffff1995505b818613610df15760019350610e0a565b818603600a0a8381610e0557610e05612181565b071593505b5050507bffffffffffffffffffffffffffffffffffffffffffffffffffffffff841660e084901b1791509250929050565b60408051600780825261010082019092526060915f9190816020015b6060815260200190600190039081610e575790505090508281610e7b600187612195565b81518110610e8b57610e8b611b9d565b60209081029190910101529392505050565b60408051600780825261010082019092525f91816020015b6060815260200190600190039081610eb55790505090505f5b8451811015610f1657848181518110610ee957610ee9611b9d565b6020026020010151828281518110610f0357610f03611b9d565b6020908102919091010152600101610ece565b50335f8181523060209081526040808320815160a0810183528083018581526060808301879052608083018190529082528185015282518581529384018581528484019093529093909291905b885181101561114557888181518110610f7e57610f7e611b9d565b602002602001015193505f845f01516040015151111561113d575f610fa788866020015161116c565b90508861101a57610ffc815f81518110610fc357610fc3611b9d565b60200260200101515f81518110610fdc57610fdc611b9d565b602002602001015160408051600181526020810192909252818101905290565b815f8151811061100e5761100e611b9d565b60200260200101819052505b8451516040805160e08101825287516020908101516001600160a01b0390811683529082018a90528851830151828401525f606083018190526080830186905260a0830189905260c08301889052925163d04dfe2360e01b81529293169163d04dfe239161108a91600401612269565b5f60405180830381865afa1580156110a4573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526110cb919081019061236a565b9150505f8151111561113a5785516020015160405163012c676d60e21b81526001600160a01b03909116906304b19db49061110c908b908590600401612420565b5f604051808303815f87803b158015611123575f80fd5b505af1158015611135573d5f803e3d5ffd5b505050505b50505b600101610f63565b50505050505050505050565b5f6108f05f84126111625783611166565b835f035b8361144e565b60605f825167ffffffffffffffff8111156111895761118961182a565b6040519080825280602002602001820160405280156111b2578160200160208202803683370190505b5090505f808451116111c4575f6111ca565b83516001015b85516001010190505f8167ffffffffffffffff8111156111ec576111ec61182a565b60405190808252806020026020018201604052801561121f57816020015b606081526020019060019003908161120a5790505b5090505f611243604080516002815233602082015230818301526060810190915290565b82828151811061125557611255611b9d565b60200260200101819052505f5b87518110156112b257818060010192505087818151811061128557611285611b9d565b602002602001015183838151811061129f5761129f611b9d565b6020908102919091010152600101611262565b50855115611444578080600101915050838282815181106112d5576112d5611b9d565b60200260200101819052505f5b86518110156114425761139187828151811061130057611300611b9d565b60200260200101515f015161136e61133c8a858151811061132357611323611b9d565b6020026020010151602001518051602090810291012090565b7f19457468657265756d205369676e6564204d6573736167653a0a3332000000005f908152601c91909152603c902090565b89848151811061138057611380611b9d565b6020026020010151604001516114ec565b6113b157604051630a57f30960e31b8152600481018290526024016101c3565b8681815181106113c3576113c3611b9d565b60200260200101515f01516001600160a01b03165f1b8582815181106113eb576113eb611b9d565b602002602001018181525050818060010192505086818151811061141157611411611b9d565b60200260200101516020015183838151811061142f5761142f611b9d565b60209081029190910101526001016112e2565b505b5095945050505050565b5f637ffffff5821361146157505f6100ed565b637ffffffe198201604381131561147c5750508115156100ed565b5f81126114bc5780600a0a7b80000000000000000000000000000000000000000000000000000001816114b1576114b1612181565b0484119150506100ed565b805f03600a0a7b800000000000000000000000000000000000000000000000000000020284101591505092915050565b5f836001600160a01b03163b5f0361154a575f8061150a858561155c565b5090925090505f81600381111561152357611523612440565b1480156115415750856001600160a01b0316826001600160a01b0316145b925050506108f0565b6115558484846115a2565b90506108f0565b5f805f8351604103611593576020840151604085015160608601515f1a61158588828585611607565b955095509550505050610bc1565b505081515f9150600290610bc1565b805160408051630b135d3f60e11b8082526004820186905260248201929092525f92906020820185604483015e5f82606483010152601f820160051c60051b915060205f60648401838a5afa9050825f5114601f3d1116811693505050509392505050565b5f80807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a084111561164057505f915060039050826116c5565b604080515f808252602082018084528a905260ff891692820192909252606081018790526080810186905260019060a0016020604051602081039080840390855afa158015611691573d5f803e3d5ffd5b5050604051601f1901519150506001600160a01b0381166116bc57505f9250600191508290506116c5565b92505f91508190505b9450945094915050565b5f602082840312156116df575f80fd5b81356001600160e01b0319811681146108f0575f80fd5b6001600160a01b038116811461014e575f80fd5b5f805f805f8060a0878903121561171f575f80fd5b863561172a816116f6565b9550602087013561173a816116f6565b94506040870135935060608701359250608087013567ffffffffffffffff80821115611764575f80fd5b818901915089601f830112611777575f80fd5b813581811115611785575f80fd5b8a6020828501011115611796575f80fd5b6020830194508093505050509295509295509295565b5f805f606084860312156117be575f80fd5b83356117c9816116f6565b9250602084013567ffffffffffffffff808211156117e5575f80fd5b9085019060c082880312156117f8575f80fd5b9092506040850135908082111561180d575f80fd5b5084016040818703121561181f575f80fd5b809150509250925092565b634e487b7160e01b5f52604160045260245ffd5b6040516060810167ffffffffffffffff811182821017156118615761186161182a565b60405290565b6040805190810167ffffffffffffffff811182821017156118615761186161182a565b604051601f8201601f1916810167ffffffffffffffff811182821017156118b3576118b361182a565b604052919050565b5f67ffffffffffffffff8211156118d4576118d461182a565b50601f01601f191660200190565b5f82601f8301126118f1575f80fd5b81356119046118ff826118bb565b61188a565b818152846020838601011115611918575f80fd5b816020850160208301375f918101602001919091529392505050565b5f67ffffffffffffffff82111561194d5761194d61182a565b5060051b60200190565b5f82601f830112611966575f80fd5b813560206119766118ff83611934565b82815260059290921b84018101918181019086841115611994575f80fd5b8286015b84811015611a9057803567ffffffffffffffff808211156119b7575f80fd5b908801906060828b03601f190112156119ce575f80fd5b6119d661183e565b868301356119e3816116f6565b8152604083810135838111156119f7575f80fd5b8401603f81018d13611a07575f80fd5b88810135611a176118ff82611934565b81815260059190911b82018301908a8101908f831115611a35575f80fd5b928401925b82841015611a535783358252928b0192908b0190611a3a565b858c0152505050606084013583811115611a6b575f80fd5b611a798d8a838801016118e2565b918301919091525085525050918301918301611998565b509695505050505050565b5f60408236031215611aab575f80fd5b611ab3611867565b823567ffffffffffffffff80821115611aca575f80fd5b818501915060608236031215611ade575f80fd5b611ae661183e565b8235611af1816116f6565b81526020830135611b01816116f6565b6020820152604083013582811115611b17575f80fd5b611b23368286016118e2565b60408301525083526020850135915080821115611b3e575f80fd5b50611b4b36828601611957565b60208301525092915050565b5f808335601e19843603018112611b6c575f80fd5b83018035915067ffffffffffffffff821115611b86575f80fd5b6020019150600581901b3603821315610a6f575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235607e19833603018112611bc5575f80fd5b9190910192915050565b5f8235609e19833603018112611bc5575f80fd5b5f808335601e19843603018112611bf8575f80fd5b83018035915067ffffffffffffffff821115611c12575f80fd5b6020019150600681901b3603821315610a6f575f80fd5b5f60208284031215611c39575f80fd5b81356108f0816116f6565b5f808335601e19843603018112611c59575f80fd5b830160208101925035905067ffffffffffffffff811115611c78575f80fd5b8060051b3603821315610a6f575f80fd5b5f8235605e19833603018112611c9d575f80fd5b90910192915050565b5f808335601e19843603018112611cbb575f80fd5b830160208101925035905067ffffffffffffffff811115611cda575f80fd5b803603821315610a6f575f80fd5b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b5f808335601e19843603018112611d25575f80fd5b830160208101925035905067ffffffffffffffff811115611d44575f80fd5b8060061b3603821315610a6f575f80fd5b8183525f60208085019450825f5b85811015611d9b578135611d76816116f6565b6001600160a01b03168752818301358388015260409687019690910190600101611d63565b509495945050505050565b8183526020808401935f91600585811b8301820185855b88811015611e7f57858303601f19018a52611dd88289611c89565b60608135611de5816116f6565b6001600160a01b03168552611dfc82880183611c44565b82898801528083880152608092507f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811115611e36575f80fd5b871b808288850137860190506040611e5084820185611ca6565b9450838884030182890152611e688484018683611ce8565b9e8a019e9750505093870193505050600101611dbd565b509098975050505050505050565b5f602080835260e08301843582850152604082860135818601526060818701358187015280870135801515808214611ec3575f80fd5b8060808901525050611ed86080880188611c44565b60c060a08901529384905261010093848801600582901b89018601835f5b84811015612054578b830360ff19018452813536879003607e19018112611f1b575f80fd5b8601803536829003609e19018112611f31575f80fd5b6080855281018035611f42816116f6565b6001600160a01b038082166080880152611f5e8e840184611c89565b915060a0808801528135611f71816116f6565b8116610120880152818e0135611f86816116f6565b16610140870152611f99818c0182611ca6565b91508a610160880152611fb161018088018383611ce8565b915050611fc08b830183611d10565b607f19808985030160c08a0152611fd8848385611d55565b9350611fe68d860186611d10565b93509150808985030160e08a015250612000838383611d55565b9250505060808201358c8701528c8301358d8701528a8301358b8701526120298a840184611c44565b935091508581038a87015261203f818484611da6565b968d019695505050918a019150600101611ef6565b505061206360a08c018c611ca6565b8b8303601f190160c08d01529850965061207e818989611ce8565b9b9a5050505050505050505050565b5f806040838503121561209e575f80fd5b505080516020909101519092909150565b5f805f606084860312156120c1575f80fd5b83516120cc816116f6565b60208501519093506120dd816116f6565b604085015190925067ffffffffffffffff8111156120f9575f80fd5b8401601f81018613612109575f80fd5b80516121176118ff826118bb565b81815287602083850101111561212b575f80fd5b8160208401602083015e5f602083830101528093505050509250925092565b5f6020828403121561215a575f80fd5b815160ff811681146108f0575f80fd5b5f6020828403121561217a575f80fd5b5051919050565b634e487b7160e01b5f52601260045260245ffd5b818103818111156100ed57634e487b7160e01b5f52601160045260245ffd5b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b5f815180845260208085019450602084015f5b83811015611d9b578151875295820195908201906001016121f5565b5f8282518085526020808601955060208260051b840101602086015f5b8481101561225c57601f1986840301895261224a8383516121e2565b9884019892509083019060010161222e565b5090979650505050505050565b602081526001600160a01b038251166020820152602082015160408201525f604083015160e060608401526122a26101008401826121b4565b9050606084015160808401526080840151601f19808584030160a08601526122ca8383612211565b925060a08601519150808584030160c08601526122e783836121e2565b925060c08601519150808584030160e08601525061230582826121e2565b95945050505050565b5f82601f83011261231d575f80fd5b8151602061232d6118ff83611934565b8083825260208201915060208460051b87010193508684111561234e575f80fd5b602086015b84811015611a905780518352918301918301612353565b5f806040838503121561237b575f80fd5b825167ffffffffffffffff80821115612392575f80fd5b818501915085601f8301126123a5575f80fd5b815160206123b56118ff83611934565b82815260059290921b840181019181810190898411156123d3575f80fd5b948201945b838610156123f1578551825294820194908201906123d8565b91880151919650909350505080821115612409575f80fd5b506124168582860161230e565b9150509250929050565b828152604060208201525f61243860408301846121e2565b949350505050565b634e487b7160e01b5f52602160045260245ffd"; /// @dev The runtime bytecode of the contract. bytes constant RUNTIME_CODE = - hex"608060405260043610610034575f3560e01c806301ffc9a71461003d578063691f9ed714610070578063b17c83c11461008f57005b3661003b57005b005b348015610048575f80fd5b5061005c61005736600461163a565b6100a2565b604051901515815260200160405180910390f35b34801561007b575f80fd5b5061003b61008a366004611675565b6100f3565b61003b61009d366004611717565b61013a565b5f6001600160e01b0319821663691f9ed760e01b14806100d257506001600160e01b0319821663b17c83c160e01b145b806100ed57506301ffc9a760e01b6001600160e01b03198316145b92915050565b6101328683838080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152506103fc92505050565b505050505050565b6101426104ad565b61015161014e82611a06565b50565b61015e6080830183611ac2565b90505f0361017f57604051639c95219f60e01b815260040160405180910390fd5b6001600160a01b03831673834e1da0d2e04ab48f9efa6a7b9bbdb6ff62839e146101cc5760405163516e822d60e01b81526001600160a01b03841660048201526024015b60405180910390fd5b5f6101da6080840184611ac2565b5f8181106101ea576101ea611b08565b90506020028101906101fc9190611b1c565b6102069080611b3a565b610214906040810190611b4e565b6102216080860186611ac2565b5f81811061023157610231611b08565b90506020028101906102439190611b1c565b6020013581811061025657610256611b08565b61026c9260206040909202019081019150611b94565b90505f61027c6080850185611ac2565b5f81811061028c5761028c611b08565b905060200281019061029e9190611b1c565b6102a89080611b3a565b6102b6906060810190611b4e565b6102c36080870187611ac2565b5f8181106102d3576102d3611b08565b90506020028101906102e59190611b1c565b604001358181106102f8576102f8611b08565b61030e9260206040909202019081019150611b94565b90506103256001600160a01b038316865f196104db565b6040516334e3942b60e11b81526001600160a01b038616906369c7285690610351908790600401611df8565b60408051808303815f875af115801561036c573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906103909190611ff8565b506103a790506001600160a01b038316865f6104db565b6103cc6103b384611a06565b836103bd85610555565b846103c786610555565b6105d9565b50506103f760017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b505050565b5f805f83806020019051810190610413919061201a565b919450925090506001600160a01b038316610441576040516398521dc560e01b815260040160405180910390fd5b6001600160a01b0382166104685760405163456ac4c360e11b815260040160405180910390fd5b61047d6001600160a01b038616845f196104db565b6104916001600160a01b0383168247610878565b506104a66001600160a01b038616845f6104db565b5050505050565b6104b5610945565b60027f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b6104e78383835f610989565b6103f7576104f883835f6001610989565b61052057604051635274afe760e01b81526001600160a01b03841660048201526024016101c3565b61052d8383836001610989565b6103f757604051635274afe760e01b81526001600160a01b03841660048201526024016101c3565b5f61055e6109eb565b6040516354636d2b60e01b81526001600160a01b038316600482015273200e12d10bb0c5e4a17e7018f0f1161919bb9389906354636d2b906024016020604051808303815f875af11580156105b5573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906100ed91906120b5565b6040805160018082528183019092525f91816020015b60608152602001906001900390816105ef575050604080516003808252608082019092529192505f919060208201606080368337019050506040516370a0823160e01b81523060048201529091505f906001600160a01b038816906370a0823190602401602060405180830381865afa15801561066e573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061069291906120d5565b905080156106ae576106ae6001600160a01b0388163383610a76565b5f6106b98288610a83565b50905080835f815181106106cf576106cf611b08565b602090810291909101015250506040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa158015610720573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061074491906120d5565b90508015610760576107606001600160a01b0386163383610a76565b5f61076b8286610a83565b509050808360018151811061078257610782611b08565b60209081029190910101525047905080156107a1576107a13382610ac4565b5f6107ad826012610a83565b50905080836002815181106107c4576107c4611b08565b602002602001018181525050505080825f815181106107e5576107e5611b08565b60209081029190910101526040805160018082528183019092525f91816020015b6040805160a0810182525f918101828152606080830193909352608082018390528152602081019190915281526020019060019003908161080657905050905087815f8151811061085957610859611b08565b602002602001018190525061086e8382610b22565b5050505050505050565b6060814710156108a45760405163cf47918160e01b8152476004820152602481018390526044016101c3565b5f6108b0858486610d6a565b90508080156108d157505f3d11806108d157505f856001600160a01b03163b115b156108e6576108de610d7f565b91505061093e565b801561091057604051639996b31560e01b81526001600160a01b03861660048201526024016101c3565b3d156109235761091e610d98565b61093c565b60405163d6bda27560e01b815260040160405180910390fd5b505b9392505050565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f005460020361098757604051633ee5aeb560e01b815260040160405180910390fd5b565b60405163095ea7b360e01b5f8181526001600160a01b038616600452602485905291602083604481808b5af1925060015f511483166109df5783831516156109d3573d5f823e3d81fd5b5f873b113d1516831692505b60405250949350505050565b73200e12d10bb0c5e4a17e7018f0f1161919bb93893b1580610a42575073200e12d10bb0c5e4a17e7018f0f1161919bb93893f7f1de7d717526cba131d684e312dedbf0852adef9cced9e36798ae4937f7145d4114155b15610987576040516373e6d7b360e01b815273200e12d10bb0c5e4a17e7018f0f1161919bb938960048201526024016101c3565b61052d8383836001610da3565b5f805f805f610a928787610ded565b9250925092505f80610aa48585610e49565b9150915081838015610ab35750815b9650965050505050505b9250929050565b80471015610aee5760405163cf47918160e01b8152476004820152602481018290526044016101c3565b610b07828260405180602001604052805f815250610d6a565b15610b10575050565b3d1561092357610b1e610d98565b5050565b60408051600480825260a082019092525f91816020015b6060815260200190600190039081610b395790505090505f5b8351811015610b9a57838181518110610b6d57610b6d611b08565b6020026020010151828281518110610b8757610b87611b08565b6020908102919091010152600101610b52565b50335f8181523060209081526040808320815160a0810183528083018581526060808301879052608083018190529082528185015282518581529384018581528484019093529093909291905b8751811015610d5f57878181518110610c0257610c02611b08565b602002602001015193505f845f015160400151511115610d57575f845f01515f01516001600160a01b031663d04dfe236040518060e00160405280885f0151602001516001600160a01b03168152602001898152602001885f01516040015181526020015f8152602001610c7a8c8a602001516110bc565b8152602001878152602001868152506040518263ffffffff1660e01b8152600401610ca591906121a1565b5f60405180830381865afa158015610cbf573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610ce691908101906122a2565b9150505f81511115610d555784516020015160405163012c676d60e21b81526001600160a01b03909116906304b19db490610d27908a908590600401612358565b5f604051808303815f87803b158015610d3e575f80fd5b505af1158015610d50573d5f803e3d5ffd5b505050505b505b600101610be7565b505050505050505050565b5f805f83516020850186885af1949350505050565b6040513d81523d5f602083013e3d602001810160405290565b6040513d5f823e3d81fd5b60405163a9059cbb60e01b5f8181526001600160a01b038616600452602485905291602083604481808b5af1925060015f511483166109df5783831516156109d3573d5f823e3d81fd5b5f808060ff841681037f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff861115610e3857600a860460018201600a88065f1493509350935050610e42565b8593509150600190505b9250925092565b5f808383601b82900b821480610f94577d90e40fbeea1d3a4abc8955e946fe31cdcf66f634e1000000000000000000870515610eca577f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee8000000000000000000870515610ebb576305f5e10087059650600886019550610eca565b620186a0870596506005860195505b8687601b0b14610ee557600a87059650856001019550610eca565b7b0ccccccccccccccccccccccccccccccccccccccccccccccccccccccc7b1999999999999999999999999999999999999999999999999999999888820111610f8e575f600188039050808160030b03610f8c5760e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff7b7fffffffffffffffffffffffffffffffffffffffffffffffffffffff60ff8b901d18161795505f9450610abd9350505050565b505b50610fab565b865f03610fab57505f935060019250610abd915050565b858660030b14611062575f82131561100a57610fc7838361139e565b15610fef5760405163d556b11160e01b815260048101849052602481018390526044016101c3565b637ffffffe19909501600a0a82029550637fffffff94611062565b637fffffff19869003604381131561102c57505f9450849350610abd92505050565b80600a0a888161103e5761103e612378565b059750875f0361105857505f9450849350610abd92505050565b50637fffffff1995505b818613611072576001935061108b565b818603600a0a838161108657611086612378565b071593505b5050507bffffffffffffffffffffffffffffffffffffffffffffffffffffffff841660e084901b1791509250929050565b60605f825167ffffffffffffffff8111156110d9576110d9611795565b604051908082528060200260200182016040528015611102578160200160208202803683370190505b5090505f80845111611114575f61111a565b83516001015b85516001010190505f8167ffffffffffffffff81111561113c5761113c611795565b60405190808252806020026020018201604052801561116f57816020015b606081526020019060019003908161115a5790505b5090505f611193604080516002815233602082015230818301526060810190915290565b8282815181106111a5576111a5611b08565b60200260200101819052505f5b87518110156112025781806001019250508781815181106111d5576111d5611b08565b60200260200101518383815181106111ef576111ef611b08565b60209081029190910101526001016111b2565b508551156113945780806001019150508382828151811061122557611225611b08565b60200260200101819052505f5b8651811015611392576112e187828151811061125057611250611b08565b60200260200101515f01516112be61128c8a858151811061127357611273611b08565b6020026020010151602001518051602090810291012090565b7f19457468657265756d205369676e6564204d6573736167653a0a3332000000005f908152601c91909152603c902090565b8984815181106112d0576112d0611b08565b6020026020010151604001516113b9565b61130157604051630a57f30960e31b8152600481018290526024016101c3565b86818151811061131357611313611b08565b60200260200101515f01516001600160a01b03165f1b85828151811061133b5761133b611b08565b602002602001018181525050818060010192505086818151811061136157611361611b08565b60200260200101516020015183838151811061137f5761137f611b08565b6020908102919091010152600101611232565b505b5095945050505050565b5f61093e5f84126113af57836113b3565b835f035b83611429565b5f836001600160a01b03163b5f03611417575f806113d785856114c7565b5090925090505f8160038111156113f0576113f061238c565b14801561140e5750856001600160a01b0316826001600160a01b0316145b9250505061093e565b61142284848461150d565b905061093e565b5f637ffffff5821361143c57505f6100ed565b637ffffffe19820160438113156114575750508115156100ed565b5f81126114975780600a0a7b800000000000000000000000000000000000000000000000000000018161148c5761148c612378565b0484119150506100ed565b805f03600a0a7b800000000000000000000000000000000000000000000000000000020284101591505092915050565b5f805f83516041036114fe576020840151604085015160608601515f1a6114f088828585611572565b955095509550505050610e42565b505081515f9150600290610e42565b805160408051630b135d3f60e11b8082526004820186905260248201929092525f92906020820185604483015e5f82606483010152601f820160051c60051b915060205f60648401838a5afa9050825f5114601f3d1116811693505050509392505050565b5f80807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08411156115ab57505f91506003905082611630565b604080515f808252602082018084528a905260ff891692820192909252606081018790526080810186905260019060a0016020604051602081039080840390855afa1580156115fc573d5f803e3d5ffd5b5050604051601f1901519150506001600160a01b03811661162757505f925060019150829050611630565b92505f91508190505b9450945094915050565b5f6020828403121561164a575f80fd5b81356001600160e01b03198116811461093e575f80fd5b6001600160a01b038116811461014e575f80fd5b5f805f805f8060a0878903121561168a575f80fd5b863561169581611661565b955060208701356116a581611661565b94506040870135935060608701359250608087013567ffffffffffffffff808211156116cf575f80fd5b818901915089601f8301126116e2575f80fd5b8135818111156116f0575f80fd5b8a6020828501011115611701575f80fd5b6020830194508093505050509295509295509295565b5f805f60608486031215611729575f80fd5b833561173481611661565b9250602084013567ffffffffffffffff80821115611750575f80fd5b9085019060c08288031215611763575f80fd5b90925060408501359080821115611778575f80fd5b5084016040818703121561178a575f80fd5b809150509250925092565b634e487b7160e01b5f52604160045260245ffd5b6040516060810167ffffffffffffffff811182821017156117cc576117cc611795565b60405290565b6040805190810167ffffffffffffffff811182821017156117cc576117cc611795565b604051601f8201601f1916810167ffffffffffffffff8111828210171561181e5761181e611795565b604052919050565b5f67ffffffffffffffff82111561183f5761183f611795565b50601f01601f191660200190565b5f82601f83011261185c575f80fd5b813561186f61186a82611826565b6117f5565b818152846020838601011115611883575f80fd5b816020850160208301375f918101602001919091529392505050565b5f67ffffffffffffffff8211156118b8576118b8611795565b5060051b60200190565b5f82601f8301126118d1575f80fd5b813560206118e161186a8361189f565b82815260059290921b840181019181810190868411156118ff575f80fd5b8286015b848110156119fb57803567ffffffffffffffff80821115611922575f80fd5b908801906060828b03601f19011215611939575f80fd5b6119416117a9565b8683013561194e81611661565b815260408381013583811115611962575f80fd5b8401603f81018d13611972575f80fd5b8881013561198261186a8261189f565b81815260059190911b82018301908a8101908f8311156119a0575f80fd5b928401925b828410156119be5783358252928b0192908b01906119a5565b858c01525050506060840135838111156119d6575f80fd5b6119e48d8a8388010161184d565b918301919091525085525050918301918301611903565b509695505050505050565b5f60408236031215611a16575f80fd5b611a1e6117d2565b823567ffffffffffffffff80821115611a35575f80fd5b818501915060608236031215611a49575f80fd5b611a516117a9565b8235611a5c81611661565b81526020830135611a6c81611661565b6020820152604083013582811115611a82575f80fd5b611a8e3682860161184d565b60408301525083526020850135915080821115611aa9575f80fd5b50611ab6368286016118c2565b60208301525092915050565b5f808335601e19843603018112611ad7575f80fd5b83018035915067ffffffffffffffff821115611af1575f80fd5b6020019150600581901b3603821315610abd575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235607e19833603018112611b30575f80fd5b9190910192915050565b5f8235609e19833603018112611b30575f80fd5b5f808335601e19843603018112611b63575f80fd5b83018035915067ffffffffffffffff821115611b7d575f80fd5b6020019150600681901b3603821315610abd575f80fd5b5f60208284031215611ba4575f80fd5b813561093e81611661565b5f808335601e19843603018112611bc4575f80fd5b830160208101925035905067ffffffffffffffff811115611be3575f80fd5b8060051b3603821315610abd575f80fd5b5f8235605e19833603018112611c08575f80fd5b90910192915050565b5f808335601e19843603018112611c26575f80fd5b830160208101925035905067ffffffffffffffff811115611c45575f80fd5b803603821315610abd575f80fd5b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b5f808335601e19843603018112611c90575f80fd5b830160208101925035905067ffffffffffffffff811115611caf575f80fd5b8060061b3603821315610abd575f80fd5b8183525f60208085019450825f5b85811015611d06578135611ce181611661565b6001600160a01b03168752818301358388015260409687019690910190600101611cce565b509495945050505050565b8183526020808401935f91600585811b8301820185855b88811015611dea57858303601f19018a52611d438289611bf4565b60608135611d5081611661565b6001600160a01b03168552611d6782880183611baf565b82898801528083880152608092507f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811115611da1575f80fd5b871b808288850137860190506040611dbb84820185611c11565b9450838884030182890152611dd38484018683611c53565b9e8a019e9750505093870193505050600101611d28565b509098975050505050505050565b5f602080835260e08301843582850152604082860135818601526060818701358187015280870135801515808214611e2e575f80fd5b8060808901525050611e436080880188611baf565b60c060a08901529384905261010093848801600582901b89018601835f5b84811015611fbf578b830360ff19018452813536879003607e19018112611e86575f80fd5b8601803536829003609e19018112611e9c575f80fd5b6080855281018035611ead81611661565b6001600160a01b038082166080880152611ec98e840184611bf4565b915060a0808801528135611edc81611661565b8116610120880152818e0135611ef181611661565b16610140870152611f04818c0182611c11565b91508a610160880152611f1c61018088018383611c53565b915050611f2b8b830183611c7b565b607f19808985030160c08a0152611f43848385611cc0565b9350611f518d860186611c7b565b93509150808985030160e08a015250611f6b838383611cc0565b9250505060808201358c8701528c8301358d8701528a8301358b870152611f948a840184611baf565b935091508581038a870152611faa818484611d11565b968d019695505050918a019150600101611e61565b5050611fce60a08c018c611c11565b8b8303601f190160c08d015298509650611fe9818989611c53565b9b9a5050505050505050505050565b5f8060408385031215612009575f80fd5b505080516020909101519092909150565b5f805f6060848603121561202c575f80fd5b835161203781611661565b602085015190935061204881611661565b604085015190925067ffffffffffffffff811115612064575f80fd5b8401601f81018613612074575f80fd5b805161208261186a82611826565b818152876020838501011115612096575f80fd5b8160208401602083015e5f602083830101528093505050509250925092565b5f602082840312156120c5575f80fd5b815160ff8116811461093e575f80fd5b5f602082840312156120e5575f80fd5b5051919050565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b5f815180845260208085019450602084015f5b83811015611d065781518752958201959082019060010161212d565b5f8282518085526020808601955060208260051b840101602086015f5b8481101561219457601f1986840301895261218283835161211a565b98840198925090830190600101612166565b5090979650505050505050565b602081526001600160a01b038251166020820152602082015160408201525f604083015160e060608401526121da6101008401826120ec565b9050606084015160808401526080840151601f19808584030160a08601526122028383612149565b925060a08601519150808584030160c086015261221f838361211a565b925060c08601519150808584030160e08601525061223d828261211a565b95945050505050565b5f82601f830112612255575f80fd5b8151602061226561186a8361189f565b8083825260208201915060208460051b870101935086841115612286575f80fd5b602086015b848110156119fb578051835291830191830161228b565b5f80604083850312156122b3575f80fd5b825167ffffffffffffffff808211156122ca575f80fd5b818501915085601f8301126122dd575f80fd5b815160206122ed61186a8361189f565b82815260059290921b8401810191818101908984111561230b575f80fd5b948201945b8386101561232957855182529482019490820190612310565b91880151919650909350505080821115612341575f80fd5b5061234e85828601612246565b9150509250929050565b828152604060208201525f612370604083018461211a565b949350505050565b634e487b7160e01b5f52601260045260245ffd5b634e487b7160e01b5f52602160045260245ffd"; + hex"608060405260043610610034575f3560e01c806301ffc9a71461003d578063691f9ed714610070578063b17c83c11461008f57005b3661003b57005b005b348015610048575f80fd5b5061005c6100573660046116cf565b6100a2565b604051901515815260200160405180910390f35b34801561007b575f80fd5b5061003b61008a36600461170a565b6100f3565b61003b61009d3660046117ac565b61013a565b5f6001600160e01b0319821663691f9ed760e01b14806100d257506001600160e01b0319821663b17c83c160e01b145b806100ed57506301ffc9a760e01b6001600160e01b03198316145b92915050565b6101328683838080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152506103fc92505050565b505050505050565b6101426104ad565b61015161014e82611a9b565b50565b61015e6080830183611b57565b90505f0361017f57604051639c95219f60e01b815260040160405180910390fd5b6001600160a01b03831673d31af42aafee144967be4b5688ecf09592258d7b146101cc5760405163516e822d60e01b81526001600160a01b03841660048201526024015b60405180910390fd5b5f6101da6080840184611b57565b5f8181106101ea576101ea611b9d565b90506020028101906101fc9190611bb1565b6102069080611bcf565b610214906040810190611be3565b6102216080860186611b57565b5f81811061023157610231611b9d565b90506020028101906102439190611bb1565b6020013581811061025657610256611b9d565b61026c9260206040909202019081019150611c29565b90505f61027c6080850185611b57565b5f81811061028c5761028c611b9d565b905060200281019061029e9190611bb1565b6102a89080611bcf565b6102b6906060810190611be3565b6102c36080870187611b57565b5f8181106102d3576102d3611b9d565b90506020028101906102e59190611bb1565b604001358181106102f8576102f8611b9d565b61030e9260206040909202019081019150611c29565b90506103256001600160a01b038316865f196104db565b6040516334e3942b60e11b81526001600160a01b038616906369c7285690610351908790600401611e8d565b60408051808303815f875af115801561036c573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610390919061208d565b506103a790506001600160a01b038316865f6104db565b6103cc6103b384611a9b565b836103bd85610555565b846103c786610555565b6105d9565b50506103f760017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b505050565b5f805f8380602001905181019061041391906120af565b919450925090506001600160a01b038316610441576040516398521dc560e01b815260040160405180910390fd5b6001600160a01b0382166104685760405163456ac4c360e11b815260040160405180910390fd5b61047d6001600160a01b038616845f196104db565b6104916001600160a01b038316824761082a565b506104a66001600160a01b038616845f6104db565b5050505050565b6104b56108f7565b60027f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b6104e78383835f61093b565b6103f7576104f883835f600161093b565b61052057604051635274afe760e01b81526001600160a01b03841660048201526024016101c3565b61052d838383600161093b565b6103f757604051635274afe760e01b81526001600160a01b03841660048201526024016101c3565b5f61055e61099d565b6040516354636d2b60e01b81526001600160a01b038316600482015273200e12d10bb0c5e4a17e7018f0f1161919bb9389906354636d2b906024016020604051808303815f875af11580156105b5573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906100ed919061214a565b604080516003808252608082019092525f9160208201606080368337019050506040516370a0823160e01b81523060048201529091505f906001600160a01b038716906370a0823190602401602060405180830381865afa158015610640573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610664919061216a565b90508015610680576106806001600160a01b0387163383610a28565b5f61068b8287610a35565b50905080835f815181106106a1576106a1611b9d565b602090810291909101015250506040516370a0823160e01b81523060048201525f906001600160a01b038516906370a0823190602401602060405180830381865afa1580156106f2573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610716919061216a565b90508015610732576107326001600160a01b0385163383610a28565b5f61073d8285610a35565b509050808360018151811061075457610754611b9d565b6020908102919091010152504790508015610773576107733382610a76565b5f61077f826012610a35565b509050808360028151811061079657610796611b9d565b602090810291909101015250506040805160018082528183019092525f91816020015b6040805160a0810182525f91810182815260608083019390935260808201839052815260208101919091528152602001906001900390816107b957905050905086815f8151811061080c5761080c611b9d565b60200260200101819052506108218282610ad4565b50505050505050565b6060814710156108565760405163cf47918160e01b8152476004820152602481018390526044016101c3565b5f610862858486610ae9565b905080801561088357505f3d118061088357505f856001600160a01b03163b115b1561089857610890610afe565b9150506108f0565b80156108c257604051639996b31560e01b81526001600160a01b03861660048201526024016101c3565b3d156108d5576108d0610b17565b6108ee565b60405163d6bda27560e01b815260040160405180910390fd5b505b9392505050565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f005460020361093957604051633ee5aeb560e01b815260040160405180910390fd5b565b60405163095ea7b360e01b5f8181526001600160a01b038616600452602485905291602083604481808b5af1925060015f51148316610991578383151615610985573d5f823e3d81fd5b5f873b113d1516831692505b60405250949350505050565b73200e12d10bb0c5e4a17e7018f0f1161919bb93893b15806109f4575073200e12d10bb0c5e4a17e7018f0f1161919bb93893f7f1de7d717526cba131d684e312dedbf0852adef9cced9e36798ae4937f7145d4114155b15610939576040516373e6d7b360e01b815273200e12d10bb0c5e4a17e7018f0f1161919bb938960048201526024016101c3565b61052d8383836001610b22565b5f805f805f610a448787610b6c565b9250925092505f80610a568585610bc8565b9150915081838015610a655750815b9650965050505050505b9250929050565b80471015610aa05760405163cf47918160e01b8152476004820152602481018290526044016101c3565b610ab9828260405180602001604052805f815250610ae9565b15610ac2575050565b3d156108d557610ad0610b17565b5050565b610ad0610ae2600784610e3b565b825f610e9d565b5f805f83516020850186885af1949350505050565b6040513d81523d5f602083013e3d602001810160405290565b6040513d5f823e3d81fd5b60405163a9059cbb60e01b5f8181526001600160a01b038616600452602485905291602083604481808b5af1925060015f51148316610991578383151615610985573d5f823e3d81fd5b5f808060ff841681037f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff861115610bb757600a860460018201600a88065f1493509350935050610bc1565b8593509150600190505b9250925092565b5f808383601b82900b821480610d13577d90e40fbeea1d3a4abc8955e946fe31cdcf66f634e1000000000000000000870515610c49577f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee8000000000000000000870515610c3a576305f5e10087059650600886019550610c49565b620186a0870596506005860195505b8687601b0b14610c6457600a87059650856001019550610c49565b7b0ccccccccccccccccccccccccccccccccccccccccccccccccccccccc7b1999999999999999999999999999999999999999999999999999999888820111610d0d575f600188039050808160030b03610d0b5760e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff7b7fffffffffffffffffffffffffffffffffffffffffffffffffffffff60ff8b901d18161795505f9450610a6f9350505050565b505b50610d2a565b865f03610d2a57505f935060019250610a6f915050565b858660030b14610de1575f821315610d8957610d468383611151565b15610d6e5760405163d556b11160e01b815260048101849052602481018390526044016101c3565b637ffffffe19909501600a0a82029550637fffffff94610de1565b637fffffff198690036043811315610dab57505f9450849350610a6f92505050565b80600a0a8881610dbd57610dbd612181565b059750875f03610dd757505f9450849350610a6f92505050565b50637fffffff1995505b818613610df15760019350610e0a565b818603600a0a8381610e0557610e05612181565b071593505b5050507bffffffffffffffffffffffffffffffffffffffffffffffffffffffff841660e084901b1791509250929050565b60408051600780825261010082019092526060915f9190816020015b6060815260200190600190039081610e575790505090508281610e7b600187612195565b81518110610e8b57610e8b611b9d565b60209081029190910101529392505050565b60408051600780825261010082019092525f91816020015b6060815260200190600190039081610eb55790505090505f5b8451811015610f1657848181518110610ee957610ee9611b9d565b6020026020010151828281518110610f0357610f03611b9d565b6020908102919091010152600101610ece565b50335f8181523060209081526040808320815160a0810183528083018581526060808301879052608083018190529082528185015282518581529384018581528484019093529093909291905b885181101561114557888181518110610f7e57610f7e611b9d565b602002602001015193505f845f01516040015151111561113d575f610fa788866020015161116c565b90508861101a57610ffc815f81518110610fc357610fc3611b9d565b60200260200101515f81518110610fdc57610fdc611b9d565b602002602001015160408051600181526020810192909252818101905290565b815f8151811061100e5761100e611b9d565b60200260200101819052505b8451516040805160e08101825287516020908101516001600160a01b0390811683529082018a90528851830151828401525f606083018190526080830186905260a0830189905260c08301889052925163d04dfe2360e01b81529293169163d04dfe239161108a91600401612269565b5f60405180830381865afa1580156110a4573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526110cb919081019061236a565b9150505f8151111561113a5785516020015160405163012c676d60e21b81526001600160a01b03909116906304b19db49061110c908b908590600401612420565b5f604051808303815f87803b158015611123575f80fd5b505af1158015611135573d5f803e3d5ffd5b505050505b50505b600101610f63565b50505050505050505050565b5f6108f05f84126111625783611166565b835f035b8361144e565b60605f825167ffffffffffffffff8111156111895761118961182a565b6040519080825280602002602001820160405280156111b2578160200160208202803683370190505b5090505f808451116111c4575f6111ca565b83516001015b85516001010190505f8167ffffffffffffffff8111156111ec576111ec61182a565b60405190808252806020026020018201604052801561121f57816020015b606081526020019060019003908161120a5790505b5090505f611243604080516002815233602082015230818301526060810190915290565b82828151811061125557611255611b9d565b60200260200101819052505f5b87518110156112b257818060010192505087818151811061128557611285611b9d565b602002602001015183838151811061129f5761129f611b9d565b6020908102919091010152600101611262565b50855115611444578080600101915050838282815181106112d5576112d5611b9d565b60200260200101819052505f5b86518110156114425761139187828151811061130057611300611b9d565b60200260200101515f015161136e61133c8a858151811061132357611323611b9d565b6020026020010151602001518051602090810291012090565b7f19457468657265756d205369676e6564204d6573736167653a0a3332000000005f908152601c91909152603c902090565b89848151811061138057611380611b9d565b6020026020010151604001516114ec565b6113b157604051630a57f30960e31b8152600481018290526024016101c3565b8681815181106113c3576113c3611b9d565b60200260200101515f01516001600160a01b03165f1b8582815181106113eb576113eb611b9d565b602002602001018181525050818060010192505086818151811061141157611411611b9d565b60200260200101516020015183838151811061142f5761142f611b9d565b60209081029190910101526001016112e2565b505b5095945050505050565b5f637ffffff5821361146157505f6100ed565b637ffffffe198201604381131561147c5750508115156100ed565b5f81126114bc5780600a0a7b80000000000000000000000000000000000000000000000000000001816114b1576114b1612181565b0484119150506100ed565b805f03600a0a7b800000000000000000000000000000000000000000000000000000020284101591505092915050565b5f836001600160a01b03163b5f0361154a575f8061150a858561155c565b5090925090505f81600381111561152357611523612440565b1480156115415750856001600160a01b0316826001600160a01b0316145b925050506108f0565b6115558484846115a2565b90506108f0565b5f805f8351604103611593576020840151604085015160608601515f1a61158588828585611607565b955095509550505050610bc1565b505081515f9150600290610bc1565b805160408051630b135d3f60e11b8082526004820186905260248201929092525f92906020820185604483015e5f82606483010152601f820160051c60051b915060205f60648401838a5afa9050825f5114601f3d1116811693505050509392505050565b5f80807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a084111561164057505f915060039050826116c5565b604080515f808252602082018084528a905260ff891692820192909252606081018790526080810186905260019060a0016020604051602081039080840390855afa158015611691573d5f803e3d5ffd5b5050604051601f1901519150506001600160a01b0381166116bc57505f9250600191508290506116c5565b92505f91508190505b9450945094915050565b5f602082840312156116df575f80fd5b81356001600160e01b0319811681146108f0575f80fd5b6001600160a01b038116811461014e575f80fd5b5f805f805f8060a0878903121561171f575f80fd5b863561172a816116f6565b9550602087013561173a816116f6565b94506040870135935060608701359250608087013567ffffffffffffffff80821115611764575f80fd5b818901915089601f830112611777575f80fd5b813581811115611785575f80fd5b8a6020828501011115611796575f80fd5b6020830194508093505050509295509295509295565b5f805f606084860312156117be575f80fd5b83356117c9816116f6565b9250602084013567ffffffffffffffff808211156117e5575f80fd5b9085019060c082880312156117f8575f80fd5b9092506040850135908082111561180d575f80fd5b5084016040818703121561181f575f80fd5b809150509250925092565b634e487b7160e01b5f52604160045260245ffd5b6040516060810167ffffffffffffffff811182821017156118615761186161182a565b60405290565b6040805190810167ffffffffffffffff811182821017156118615761186161182a565b604051601f8201601f1916810167ffffffffffffffff811182821017156118b3576118b361182a565b604052919050565b5f67ffffffffffffffff8211156118d4576118d461182a565b50601f01601f191660200190565b5f82601f8301126118f1575f80fd5b81356119046118ff826118bb565b61188a565b818152846020838601011115611918575f80fd5b816020850160208301375f918101602001919091529392505050565b5f67ffffffffffffffff82111561194d5761194d61182a565b5060051b60200190565b5f82601f830112611966575f80fd5b813560206119766118ff83611934565b82815260059290921b84018101918181019086841115611994575f80fd5b8286015b84811015611a9057803567ffffffffffffffff808211156119b7575f80fd5b908801906060828b03601f190112156119ce575f80fd5b6119d661183e565b868301356119e3816116f6565b8152604083810135838111156119f7575f80fd5b8401603f81018d13611a07575f80fd5b88810135611a176118ff82611934565b81815260059190911b82018301908a8101908f831115611a35575f80fd5b928401925b82841015611a535783358252928b0192908b0190611a3a565b858c0152505050606084013583811115611a6b575f80fd5b611a798d8a838801016118e2565b918301919091525085525050918301918301611998565b509695505050505050565b5f60408236031215611aab575f80fd5b611ab3611867565b823567ffffffffffffffff80821115611aca575f80fd5b818501915060608236031215611ade575f80fd5b611ae661183e565b8235611af1816116f6565b81526020830135611b01816116f6565b6020820152604083013582811115611b17575f80fd5b611b23368286016118e2565b60408301525083526020850135915080821115611b3e575f80fd5b50611b4b36828601611957565b60208301525092915050565b5f808335601e19843603018112611b6c575f80fd5b83018035915067ffffffffffffffff821115611b86575f80fd5b6020019150600581901b3603821315610a6f575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235607e19833603018112611bc5575f80fd5b9190910192915050565b5f8235609e19833603018112611bc5575f80fd5b5f808335601e19843603018112611bf8575f80fd5b83018035915067ffffffffffffffff821115611c12575f80fd5b6020019150600681901b3603821315610a6f575f80fd5b5f60208284031215611c39575f80fd5b81356108f0816116f6565b5f808335601e19843603018112611c59575f80fd5b830160208101925035905067ffffffffffffffff811115611c78575f80fd5b8060051b3603821315610a6f575f80fd5b5f8235605e19833603018112611c9d575f80fd5b90910192915050565b5f808335601e19843603018112611cbb575f80fd5b830160208101925035905067ffffffffffffffff811115611cda575f80fd5b803603821315610a6f575f80fd5b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b5f808335601e19843603018112611d25575f80fd5b830160208101925035905067ffffffffffffffff811115611d44575f80fd5b8060061b3603821315610a6f575f80fd5b8183525f60208085019450825f5b85811015611d9b578135611d76816116f6565b6001600160a01b03168752818301358388015260409687019690910190600101611d63565b509495945050505050565b8183526020808401935f91600585811b8301820185855b88811015611e7f57858303601f19018a52611dd88289611c89565b60608135611de5816116f6565b6001600160a01b03168552611dfc82880183611c44565b82898801528083880152608092507f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811115611e36575f80fd5b871b808288850137860190506040611e5084820185611ca6565b9450838884030182890152611e688484018683611ce8565b9e8a019e9750505093870193505050600101611dbd565b509098975050505050505050565b5f602080835260e08301843582850152604082860135818601526060818701358187015280870135801515808214611ec3575f80fd5b8060808901525050611ed86080880188611c44565b60c060a08901529384905261010093848801600582901b89018601835f5b84811015612054578b830360ff19018452813536879003607e19018112611f1b575f80fd5b8601803536829003609e19018112611f31575f80fd5b6080855281018035611f42816116f6565b6001600160a01b038082166080880152611f5e8e840184611c89565b915060a0808801528135611f71816116f6565b8116610120880152818e0135611f86816116f6565b16610140870152611f99818c0182611ca6565b91508a610160880152611fb161018088018383611ce8565b915050611fc08b830183611d10565b607f19808985030160c08a0152611fd8848385611d55565b9350611fe68d860186611d10565b93509150808985030160e08a015250612000838383611d55565b9250505060808201358c8701528c8301358d8701528a8301358b8701526120298a840184611c44565b935091508581038a87015261203f818484611da6565b968d019695505050918a019150600101611ef6565b505061206360a08c018c611ca6565b8b8303601f190160c08d01529850965061207e818989611ce8565b9b9a5050505050505050505050565b5f806040838503121561209e575f80fd5b505080516020909101519092909150565b5f805f606084860312156120c1575f80fd5b83516120cc816116f6565b60208501519093506120dd816116f6565b604085015190925067ffffffffffffffff8111156120f9575f80fd5b8401601f81018613612109575f80fd5b80516121176118ff826118bb565b81815287602083850101111561212b575f80fd5b8160208401602083015e5f602083830101528093505050509250925092565b5f6020828403121561215a575f80fd5b815160ff811681146108f0575f80fd5b5f6020828403121561217a575f80fd5b5051919050565b634e487b7160e01b5f52601260045260245ffd5b818103818111156100ed57634e487b7160e01b5f52601160045260245ffd5b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b5f815180845260208085019450602084015f5b83811015611d9b578151875295820195908201906001016121f5565b5f8282518085526020808601955060208260051b840101602086015f5b8481101561225c57601f1986840301895261224a8383516121e2565b9884019892509083019060010161222e565b5090979650505050505050565b602081526001600160a01b038251166020820152602082015160408201525f604083015160e060608401526122a26101008401826121b4565b9050606084015160808401526080840151601f19808584030160a08601526122ca8383612211565b925060a08601519150808584030160c08601526122e783836121e2565b925060c08601519150808584030160e08601525061230582826121e2565b95945050505050565b5f82601f83011261231d575f80fd5b8151602061232d6118ff83611934565b8083825260208201915060208460051b87010193508684111561234e575f80fd5b602086015b84811015611a905780518352918301918301612353565b5f806040838503121561237b575f80fd5b825167ffffffffffffffff80821115612392575f80fd5b818501915085601f8301126123a5575f80fd5b815160206123b56118ff83611934565b82815260059290921b840181019181810190898411156123d3575f80fd5b948201945b838610156123f1578551825294820194908201906123d8565b91880151919650909350505080821115612409575f80fd5b506124168582860161230e565b9150509250929050565b828152604060208201525f61243860408301846121e2565b949350505050565b634e487b7160e01b5f52602160045260245ffd"; /// @dev What MUST already be on a network before this release can be /// broadcast there: an address, and the runtime code that belongs at it. diff --git a/src/generated/candidate/GenericPoolRaindexV6FlashBorrower.sol b/src/generated/candidate/GenericPoolRaindexV6FlashBorrower.sol index 9566555ef0..4a85b4fcbb 100644 --- a/src/generated/candidate/GenericPoolRaindexV6FlashBorrower.sol +++ b/src/generated/candidate/GenericPoolRaindexV6FlashBorrower.sol @@ -5,19 +5,19 @@ pragma solidity ^0.8.25; // THIS FILE IS AUTOGENERATED BY THE BUILD SCRIPT. DO NOT EDIT BY HAND. /// @dev Hash of the known bytecode. -bytes32 constant BYTECODE_HASH = bytes32(0x45506821351bb4af169443fad85b7b59493f806fe6e747a650cf6935df36a994); +bytes32 constant BYTECODE_HASH = bytes32(0xaffb4a336faa38f5251d4082f8a9521a9cd98f0a02412c2507096e5d8b5f9af7); /// @dev The deterministic deploy address of the contract when deployed via /// the Zoltu factory. -address constant DEPLOYED_ADDRESS = address(0xC81501244F6D943B3fB0ED9775C44c6314586F4c); +address constant DEPLOYED_ADDRESS = address(0xa3FC25117BCFb69597ec700e6c9F91f042C15b7F); /// @dev The creation bytecode of the contract. bytes constant CREATION_CODE = - hex"6080604052348015600e575f80fd5b5060017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055612d5f806100405f395ff3fe608060405260043610610034575f3560e01c806301ffc9a71461003d57806323e30c8b146100715780638c18e4ba1461009e57005b3661003b57005b005b348015610048575f80fd5b5061005c61005736600461198c565b6100b1565b60405190151581526020015b60405180910390f35b34801561007c575f80fd5b5061009061008b366004611a15565b6100e7565b604051908152602001610068565b61003b6100ac366004611a8c565b610204565b5f6001600160e01b031982166323e30c8b60e01b14806100e157506301ffc9a760e01b6001600160e01b03198316145b92915050565b5f3373834e1da0d2e04ab48f9efa6a7b9bbdb6ff62839e1461012257604051625e1e6f60e51b81523360048201526024015b60405180910390fd5b6001600160a01b0387163014610156576040516322c7df1960e21b81526001600160a01b0388166004820152602401610119565b5f8061016484860186612090565b915091506101728282610534565b6040516334e3942b60e11b815233906369c72856906101959085906004016122a9565b60408051808303815f875af11580156101b0573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906101d49190612427565b507f439148f0bbc682ca079e46d6e2c2f0c1e3b820f1a291b069d8882abf8cf18dd99a9950505050505050505050565b61020c6105a8565b61021b61021882612449565b50565b61022860808501856124b2565b90505f0361024957604051639c95219f60e01b815260040160405180910390fd5b61025960808501606086016124f8565b61027657604051636d3a9fe560e01b815260040160405180910390fd5b5f84848460405160200161028c93929190612751565b60408051601f1981840301815291905290505f6102ac60808701876124b2565b5f8181106102bc576102bc612963565b90506020028101906102ce9190612977565b6102d89080612995565b6102e69060608101906129a9565b6102f360808901896124b2565b5f81811061030357610303612963565b90506020028101906103159190612977565b6040013581811061032857610328612963565b61033e92602060409092020190810191506129ef565b90505f61034e60808801886124b2565b5f81811061035e5761035e612963565b90506020028101906103709190612977565b61037a9080612995565b6103889060408101906129a9565b61039560808a018a6124b2565b5f8181106103a5576103a5612963565b90506020028101906103b79190612977565b602001358181106103ca576103ca612963565b6103e092602060409092020190810191506129ef565b90505f6103ec826105d6565b90505f6103f8846105d6565b90505f6104068a358361065a565b905061041d6001600160a01b0385168c5f19610681565b6104326001600160a01b0386168c5f19610681565b604051632e7ff4ef60e11b81526001600160a01b038c1690635cffe9de90610464903090899086908c90600401612a0a565b6020604051808303815f875af1158015610480573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104a49190612a3b565b6104c1576040516349088f5960e11b815260040160405180910390fd5b6104d56001600160a01b0386168c5f610681565b6104e96001600160a01b0385168c5f610681565b6104fe6104f588612449565b858588866106fb565b50505050505061052d60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b5050505050565b5f82608001515f8151811061054b5761054b612963565b60200260200101515f01516060015183608001515f8151811061057057610570612963565b6020026020010151604001518151811061058c5761058c612963565b60200260200101515f015190506105a3818361099a565b505050565b6105b0610a44565b60027f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b5f6105df610a88565b6040516354636d2b60e01b81526001600160a01b038316600482015273200e12d10bb0c5e4a17e7018f0f1161919bb9389906354636d2b906024016020604051808303815f875af1158015610636573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906100e19190612a56565b5f6001600160e01b038316601b0b60e084901d610678828286610b13565b95945050505050565b61068d8383835f610b57565b6105a35761069e83835f6001610b57565b6106c657604051635274afe760e01b81526001600160a01b0384166004820152602401610119565b6106d38383836001610b57565b6105a357604051635274afe760e01b81526001600160a01b0384166004820152602401610119565b6040805160018082528183019092525f91816020015b6060815260200190600190039081610711575050604080516003808252608082019092529192505f919060208201606080368337019050506040516370a0823160e01b81523060048201529091505f906001600160a01b038816906370a0823190602401602060405180830381865afa158015610790573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107b49190612a76565b905080156107d0576107d06001600160a01b0388163383610bb9565b5f6107db8288610bc6565b50905080835f815181106107f1576107f1612963565b602090810291909101015250506040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa158015610842573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108669190612a76565b90508015610882576108826001600160a01b0386163383610bb9565b5f61088d8286610bc6565b50905080836001815181106108a4576108a4612963565b60209081029190910101525047905080156108c3576108c33382610c07565b5f6108cf826012610bc6565b50905080836002815181106108e6576108e6612963565b602002602001018181525050505080825f8151811061090757610907612963565b60209081029190910101526040805160018082528183019092525f91816020015b6040805160a0810182525f918101828152606080830193909352608082018390528152602081019190915281526020019060019003908161092857905050905087815f8151811061097b5761097b612963565b60200260200101819052506109908382610c7e565b5050505050505050565b5f805f838060200190518101906109b19190612a8d565b919450925090506001600160a01b0383166109df576040516398521dc560e01b815260040160405180910390fd5b6001600160a01b038216610a065760405163456ac4c360e11b815260040160405180910390fd5b610a1b6001600160a01b038616845f19610681565b610a2f6001600160a01b0383168247610ec6565b5061052d6001600160a01b038616845f610681565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0054600203610a8657604051633ee5aeb560e01b815260040160405180910390fd5b565b73200e12d10bb0c5e4a17e7018f0f1161919bb93893b1580610adf575073200e12d10bb0c5e4a17e7018f0f1161919bb93893f7f1de7d717526cba131d684e312dedbf0852adef9cced9e36798ae4937f7145d4114155b15610a86576040516373e6d7b360e01b815273200e12d10bb0c5e4a17e7018f0f1161919bb93896004820152602401610119565b5f805f610b21868686610f74565b9150915080610b4c5760405162bc8ecf60e31b81526004810187905260248101869052604401610119565b5090505b9392505050565b60405163095ea7b360e01b5f8181526001600160a01b038616600452602485905291602083604481808b5af1925060015f51148316610bad578383151615610ba1573d5f823e3d81fd5b5f873b113d1516831692505b60405250949350505050565b6106d383838360016110e6565b5f805f805f610bd58787611130565b9250925092505f80610be7858561118c565b9150915081838015610bf65750815b9650965050505050505b9250929050565b80471015610c315760405163cf47918160e01b815247600482015260248101829052604401610119565b610c4a828260405180602001604052805f8152506113d5565b15610c53575050565b3d15610c6557610c616113ea565b5050565b60405163d6bda27560e01b815260040160405180910390fd5b60408051600480825260a082019092525f91816020015b6060815260200190600190039081610c955790505090505f5b8351811015610cf657838181518110610cc957610cc9612963565b6020026020010151828281518110610ce357610ce3612963565b6020908102919091010152600101610cae565b50335f8181523060209081526040808320815160a0810183528083018581526060808301879052608083018190529082528185015282518581529384018581528484019093529093909291905b8751811015610ebb57878181518110610d5e57610d5e612963565b602002602001015193505f845f015160400151511115610eb3575f845f01515f01516001600160a01b031663d04dfe236040518060e00160405280885f0151602001516001600160a01b03168152602001898152602001885f01516040015181526020015f8152602001610dd68c8a602001516113f5565b8152602001878152602001868152506040518263ffffffff1660e01b8152600401610e019190612b73565b5f60405180830381865afa158015610e1b573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610e429190810190612c6b565b9150505f81511115610eb15784516020015160405163012c676d60e21b81526001600160a01b03909116906304b19db490610e83908a908590600401612d17565b5f604051808303815f87803b158015610e9a575f80fd5b505af1158015610eac573d5f803e3d5ffd5b505050505b505b600101610d43565b505050505050505050565b606081471015610ef25760405163cf47918160e01b815247600482015260248101839052604401610119565b5f610efe8584866113d5565b9050808015610f1f57505f3d1180610f1f57505f856001600160a01b03163b115b15610f3457610f2c6116d7565b915050610b50565b8015610f5e57604051639996b31560e01b81526001600160a01b0386166004820152602401610119565b3d15610c6557610f6c6113ea565b509392505050565b5f805f851215610fa157604051634a7d166b60e01b81526004810186905260248101859052604401610119565b845f03610fb357505f905060016110de565b8460ff8416850185811215610fee5760405163c849483b60e01b8152600481018890526024810187905260ff86166044820152606401610119565b5f805f83121561103a57604c19831215611011575f8095509550505050506110de565b825f03600a0a915081848161102857611028612d37565b04955050840290911491506110de9050565b5f8313156110d357604d8313156110775760405163c849483b60e01b8152600481018a90526024810189905260ff88166044820152606401610119565b82600a0a9150815f198161108d5761108d612d37565b048411156110c15760405163c849483b60e01b8152600481018a90526024810189905260ff88166044820152606401610119565b50919091029250600191506110de9050565b509193506001925050505b935093915050565b60405163a9059cbb60e01b5f8181526001600160a01b038616600452602485905291602083604481808b5af1925060015f51148316610bad578383151615610ba1573d5f823e3d81fd5b5f808060ff841681037f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff86111561117b57600a860460018201600a88065f1493509350935050611185565b8593509150600190505b9250925092565b5f808383601b82900b8214806112c2577d90e40fbeea1d3a4abc8955e946fe31cdcf66f634e100000000000000000087051561120d577f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee80000000000000000008705156111fe576305f5e1008705965060088601955061120d565b620186a0870596506005860195505b8687601b0b1461122857600a8705965085600101955061120d565b7b0ccccccccccccccccccccccccccccccccccccccccccccccccccccccc7b19999999999999999999999999999999999999999999999999999998888201116112bc575f600188039050808160030b036112ba5760e01b6001600160e01b037b7fffffffffffffffffffffffffffffffffffffffffffffffffffffff60ff8b901d18161795505f9450610c009350505050565b505b506112d9565b865f036112d957505f935060019250610c00915050565b858660030b14611390575f821315611338576112f583836116f0565b1561131d5760405163d556b11160e01b81526004810184905260248101839052604401610119565b637ffffffe19909501600a0a82029550637fffffff94611390565b637fffffff19869003604381131561135a57505f9450849350610c0092505050565b80600a0a888161136c5761136c612d37565b059750875f0361138657505f9450849350610c0092505050565b50637fffffff1995505b8186136113a057600193506113b9565b818603600a0a83816113b4576113b4612d37565b071593505b5050506001600160e01b03841660e084901b1791509250929050565b5f805f83516020850186885af1949350505050565b6040513d5f823e3d81fd5b60605f825167ffffffffffffffff81111561141257611412611b33565b60405190808252806020026020018201604052801561143b578160200160208202803683370190505b5090505f8084511161144d575f611453565b83516001015b85516001010190505f8167ffffffffffffffff81111561147557611475611b33565b6040519080825280602002602001820160405280156114a857816020015b60608152602001906001900390816114935790505b5090505f6114cc604080516002815233602082015230818301526060810190915290565b8282815181106114de576114de612963565b60200260200101819052505f5b875181101561153b57818060010192505087818151811061150e5761150e612963565b602002602001015183838151811061152857611528612963565b60209081029190910101526001016114eb565b508551156116cd5780806001019150508382828151811061155e5761155e612963565b60200260200101819052505f5b86518110156116cb5761161a87828151811061158957611589612963565b60200260200101515f01516115f76115c58a85815181106115ac576115ac612963565b6020026020010151602001518051602090810291012090565b7f19457468657265756d205369676e6564204d6573736167653a0a3332000000005f908152601c91909152603c902090565b89848151811061160957611609612963565b60200260200101516040015161170b565b61163a57604051630a57f30960e31b815260048101829052602401610119565b86818151811061164c5761164c612963565b60200260200101515f01516001600160a01b03165f1b85828151811061167457611674612963565b602002602001018181525050818060010192505086818151811061169a5761169a612963565b6020026020010151602001518383815181106116b8576116b8612963565b602090810291909101015260010161156b565b505b5095945050505050565b6040513d81523d5f602083013e3d602001810160405290565b5f610b505f84126117015783611705565b835f035b8361177b565b5f836001600160a01b03163b5f03611769575f806117298585611819565b5090925090505f81600381111561174257611742612d4b565b1480156117605750856001600160a01b0316826001600160a01b0316145b92505050610b50565b61177484848461185f565b9050610b50565b5f637ffffff5821361178e57505f6100e1565b637ffffffe19820160438113156117a95750508115156100e1565b5f81126117e95780600a0a7b80000000000000000000000000000000000000000000000000000001816117de576117de612d37565b0484119150506100e1565b805f03600a0a7b800000000000000000000000000000000000000000000000000000020284101591505092915050565b5f805f8351604103611850576020840151604085015160608601515f1a611842888285856118c4565b955095509550505050611185565b505081515f9150600290611185565b805160408051630b135d3f60e11b8082526004820186905260248201929092525f92906020820185604483015e5f82606483010152601f820160051c60051b915060205f60648401838a5afa9050825f5114601f3d1116811693505050509392505050565b5f80807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08411156118fd57505f91506003905082611982565b604080515f808252602082018084528a905260ff891692820192909252606081018790526080810186905260019060a0016020604051602081039080840390855afa15801561194e573d5f803e3d5ffd5b5050604051601f1901519150506001600160a01b03811661197957505f925060019150829050611982565b92505f91508190505b9450945094915050565b5f6020828403121561199c575f80fd5b81356001600160e01b031981168114610b50575f80fd5b6001600160a01b0381168114610218575f80fd5b80356119d2816119b3565b919050565b5f8083601f8401126119e7575f80fd5b50813567ffffffffffffffff8111156119fe575f80fd5b602083019150836020828501011115610c00575f80fd5b5f805f805f8060a08789031215611a2a575f80fd5b8635611a35816119b3565b95506020870135611a45816119b3565b94506040870135935060608701359250608087013567ffffffffffffffff811115611a6e575f80fd5b611a7a89828a016119d7565b979a9699509497509295939492505050565b5f805f805f60808688031215611aa0575f80fd5b8535611aab816119b3565b9450602086013567ffffffffffffffff80821115611ac7575f80fd5b9087019060c0828a031215611ada575f80fd5b90945060408701359080821115611aef575f80fd5b611afb89838a016119d7565b90955093506060880135915080821115611b13575f80fd5b50860160408189031215611b25575f80fd5b809150509295509295909350565b634e487b7160e01b5f52604160045260245ffd5b6040516060810167ffffffffffffffff81118282101715611b6a57611b6a611b33565b60405290565b6040805190810167ffffffffffffffff81118282101715611b6a57611b6a611b33565b6040516080810167ffffffffffffffff81118282101715611b6a57611b6a611b33565b60405160a0810167ffffffffffffffff81118282101715611b6a57611b6a611b33565b60405160c0810167ffffffffffffffff81118282101715611b6a57611b6a611b33565b604051601f8201601f1916810167ffffffffffffffff81118282101715611c2557611c25611b33565b604052919050565b8015158114610218575f80fd5b80356119d281611c2d565b5f67ffffffffffffffff821115611c5e57611c5e611b33565b5060051b60200190565b5f67ffffffffffffffff821115611c8157611c81611b33565b50601f01601f191660200190565b5f82601f830112611c9e575f80fd5b8135611cb1611cac82611c68565b611bfc565b818152846020838601011115611cc5575f80fd5b816020850160208301375f918101602001919091529392505050565b5f60608284031215611cf1575f80fd5b611cf9611b47565b90508135611d06816119b3565b81526020820135611d16816119b3565b6020820152604082013567ffffffffffffffff811115611d34575f80fd5b611d4084828501611c8f565b60408301525092915050565b5f82601f830112611d5b575f80fd5b81356020611d6b611cac83611c45565b82815260069290921b84018101918181019086841115611d89575f80fd5b8286015b84811015611dcf5760408189031215611da4575f80fd5b611dac611b70565b8135611db7816119b3565b81528185013585820152835291830191604001611d8d565b509695505050505050565b5f82601f830112611de9575f80fd5b81356020611df9611cac83611c45565b82815260059290921b84018101918181019086841115611e17575f80fd5b8286015b84811015611dcf57803567ffffffffffffffff80821115611e3a575f80fd5b908801906060828b03601f19011215611e51575f80fd5b611e59611b47565b86830135611e66816119b3565b815260408381013583811115611e7a575f80fd5b8401603f81018d13611e8a575f80fd5b88810135611e9a611cac82611c45565b81815260059190911b82018301908a8101908f831115611eb8575f80fd5b928401925b82841015611ed65783358252928b0192908b0190611ebd565b858c0152505050606084013583811115611eee575f80fd5b611efc8d8a83880101611c8f565b918301919091525085525050918301918301611e1b565b5f82601f830112611f22575f80fd5b81356020611f32611cac83611c45565b82815260059290921b84018101918181019086841115611f50575f80fd5b8286015b84811015611dcf57803567ffffffffffffffff80821115611f73575f80fd5b90880190601f196080838c0382011215611f8b575f80fd5b611f93611b93565b8784013583811115611fa3575f80fd5b840160a0818e0384011215611fb6575f80fd5b611fbe611bb6565b9250611fcb8982016119c7565b8352604081013584811115611fde575f80fd5b611fec8e8b83850101611ce1565b8a8501525060608082013585811115612003575f80fd5b6120118f8c83860101611d4c565b604086015250608082013585811115612028575f80fd5b6120368f8c83860101611d4c565b828601525060a0820135608085015283835260408601358a840152808601356040840152608086013593508484111561206d575f80fd5b61207b8e8b86890101611dda565b90830152508652505050918301918301611f54565b5f80604083850312156120a1575f80fd5b823567ffffffffffffffff808211156120b8575f80fd5b9084019060c082870312156120cb575f80fd5b6120d3611bd9565b8235815260208301356020820152604083013560408201526120f760608401611c3a565b606082015260808301358281111561210d575f80fd5b61211988828601611f13565b60808301525060a083013582811115612130575f80fd5b61213c88828601611c8f565b60a08301525093506020850135915080821115612157575f80fd5b5061216485828601611c8f565b9150509250929050565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b5f815180845260208085019450602084015f5b838110156121df57815180516001600160a01b0316885283015183880152604090960195908201906001016121af565b509495945050505050565b5f815180845260208085019450602084015f5b838110156121df578151875295820195908201906001016121fd565b5f82825180855260208086019550808260051b8401018186015f5b8481101561229c57601f19868403018952815160606001600160a01b03825116855285820151818787015261226b828701826121ea565b91505060408083015192508582038187015250612288818361216e565b9a86019a9450505090830190600101612234565b5090979650505050505050565b5f602080835260e08301845182850152818501516040818187015280870151915060608281880152808801519250608083151560808901526080890151935060a060c060a08a01528585518088526101009750878b019150878160051b8c010189880197505f5b828110156123f8578c820360ff190184528851805187845280516001600160a01b03908116898601528d82015188860189905280518216610120870152808f01519091166101408601528a015161016085018a905261237361018086018261216e565b90508a820151607f19808784030160c0880152612390838361219c565b92508b8401519150808784030160e0880152506123ad828261219c565b915050888201518d8601528d8301518e8601528a8301518b8601528983015192508481038a8601526123df8184612219565b9b8e019b968e0196945050506001919091019050612310565b5060a08d01518c8203601f190160c08e01529950612416818b61216e565b9d9c50505050505050505050505050565b5f8060408385031215612438575f80fd5b505080516020909101519092909150565b5f60408236031215612459575f80fd5b612461611b70565b823567ffffffffffffffff80821115612478575f80fd5b61248436838701611ce1565b83526020850135915080821115612499575f80fd5b506124a636828601611dda565b60208301525092915050565b5f808335601e198436030181126124c7575f80fd5b83018035915067ffffffffffffffff8211156124e1575f80fd5b6020019150600581901b3603821315610c00575f80fd5b5f60208284031215612508575f80fd5b8135610b5081611c2d565b5f808335601e19843603018112612528575f80fd5b830160208101925035905067ffffffffffffffff811115612547575f80fd5b8060051b3603821315610c00575f80fd5b5f8235605e1983360301811261256c575f80fd5b90910192915050565b5f808335601e1984360301811261258a575f80fd5b830160208101925035905067ffffffffffffffff8111156125a9575f80fd5b803603821315610c00575f80fd5b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b5f808335601e198436030181126125f4575f80fd5b830160208101925035905067ffffffffffffffff811115612613575f80fd5b8060061b3603821315610c00575f80fd5b8183525f60208085019450825f5b858110156121df578135612645816119b3565b6001600160a01b03168752818301358388015260409687019690910190600101612632565b8183526020808401935f91600585811b8301820185855b8881101561274357858303601f19018a5261269c8289612558565b606081356126a9816119b3565b6001600160a01b031685526126c082880183612513565b82898801528083880152608092507f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8111156126fa575f80fd5b871b80828885013786019050604061271484820185612575565b945083888403018289015261272c84840186836125b7565b9e8a019e9750505093870193505050600101612681565b509098975050505050505050565b5f604080835261010080840187358386015260206060818a013581880152848a01356080880152808a013561278581611c2d565b151560a088015261279960808b018b612513565b60c0898101529384905261012093848901600582901b8a018601835f5b84811015612913578c830361011f19018452813536879003607e190181126127dc575f80fd5b8601803536829003609e190181126127f2575f80fd5b6080855281018035612803816119b3565b6001600160a01b03808216608088015261281f8c840184612558565b915060a0808801528135612832816119b3565b8116878e0152818c0135612845816119b3565b16610140870152612858818f0182612575565b91508a610160880152612870610180880183836125b7565b91505061287f8e8301836125df565b607f19808985030160c08a0152612897848385612624565b93506128a58d8601866125df565b93509150808985030160e08a0152506128bf838383612624565b9250505060808201358d8701528a8301358b8701528d8301358e8701526128e88a840184612513565b935091508581038a8701526128fe81848461266a565b968b01969550505091880191506001016127b6565b505061292260a08f018f612575565b8c8303603f190160e08e01529950975061293d818a8a6125b7565b98505050505050858403818701525050506129598185876125b7565b9695505050505050565b634e487b7160e01b5f52603260045260245ffd5b5f8235607e1983360301811261298b575f80fd5b9190910192915050565b5f8235609e1983360301811261298b575f80fd5b5f808335601e198436030181126129be575f80fd5b83018035915067ffffffffffffffff8211156129d8575f80fd5b6020019150600681901b3603821315610c00575f80fd5b5f602082840312156129ff575f80fd5b8135610b50816119b3565b5f6001600160a01b03808716835280861660208401525083604083015260806060830152612959608083018461216e565b5f60208284031215612a4b575f80fd5b8151610b5081611c2d565b5f60208284031215612a66575f80fd5b815160ff81168114610b50575f80fd5b5f60208284031215612a86575f80fd5b5051919050565b5f805f60608486031215612a9f575f80fd5b8351612aaa816119b3565b6020850151909350612abb816119b3565b604085015190925067ffffffffffffffff811115612ad7575f80fd5b8401601f81018613612ae7575f80fd5b8051612af5611cac82611c68565b818152876020838501011115612b09575f80fd5b8160208401602083015e5f602083830101528093505050509250925092565b5f8282518085526020808601955060208260051b840101602086015f5b8481101561229c57601f19868403018952612b618383516121ea565b98840198925090830190600101612b45565b602081526001600160a01b038251166020820152602082015160408201525f604083015160e06060840152612bac61010084018261216e565b9050606084015160808401526080840151601f19808584030160a0860152612bd48383612b28565b925060a08601519150808584030160c0860152612bf183836121ea565b925060c08601519150808584030160e08601525061067882826121ea565b5f82601f830112612c1e575f80fd5b81516020612c2e611cac83611c45565b8083825260208201915060208460051b870101935086841115612c4f575f80fd5b602086015b84811015611dcf5780518352918301918301612c54565b5f8060408385031215612c7c575f80fd5b825167ffffffffffffffff80821115612c93575f80fd5b818501915085601f830112612ca6575f80fd5b81516020612cb6611cac83611c45565b82815260059290921b84018101918181019089841115612cd4575f80fd5b948201945b83861015612cf257855182529482019490820190612cd9565b91880151919650909350505080821115612d0a575f80fd5b5061216485828601612c0f565b828152604060208201525f612d2f60408301846121ea565b949350505050565b634e487b7160e01b5f52601260045260245ffd5b634e487b7160e01b5f52602160045260245ffd"; + hex"6080604052348015600e575f80fd5b5060017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055612e13806100405f395ff3fe608060405260043610610034575f3560e01c806301ffc9a71461003d57806323e30c8b146100715780638c18e4ba1461009e57005b3661003b57005b005b348015610048575f80fd5b5061005c610057366004611a21565b6100b1565b60405190151581526020015b60405180910390f35b34801561007c575f80fd5b5061009061008b366004611aaa565b6100e7565b604051908152602001610068565b61003b6100ac366004611b21565b610204565b5f6001600160e01b031982166323e30c8b60e01b14806100e157506301ffc9a760e01b6001600160e01b03198316145b92915050565b5f3373d31af42aafee144967be4b5688ecf09592258d7b1461012257604051625e1e6f60e51b81523360048201526024015b60405180910390fd5b6001600160a01b0387163014610156576040516322c7df1960e21b81526001600160a01b0388166004820152602401610119565b5f8061016484860186612125565b915091506101728282610534565b6040516334e3942b60e11b815233906369c728569061019590859060040161233e565b60408051808303815f875af11580156101b0573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906101d491906124bc565b507f439148f0bbc682ca079e46d6e2c2f0c1e3b820f1a291b069d8882abf8cf18dd99a9950505050505050505050565b61020c6105a8565b61021b610218826124de565b50565b6102286080850185612547565b90505f0361024957604051639c95219f60e01b815260040160405180910390fd5b610259608085016060860161258d565b61027657604051636d3a9fe560e01b815260040160405180910390fd5b5f84848460405160200161028c939291906127e6565b60408051601f1981840301815291905290505f6102ac6080870187612547565b5f8181106102bc576102bc6129f8565b90506020028101906102ce9190612a0c565b6102d89080612a2a565b6102e6906060810190612a3e565b6102f36080890189612547565b5f818110610303576103036129f8565b90506020028101906103159190612a0c565b60400135818110610328576103286129f8565b61033e9260206040909202019081019150612a84565b90505f61034e6080880188612547565b5f81811061035e5761035e6129f8565b90506020028101906103709190612a0c565b61037a9080612a2a565b610388906040810190612a3e565b61039560808a018a612547565b5f8181106103a5576103a56129f8565b90506020028101906103b79190612a0c565b602001358181106103ca576103ca6129f8565b6103e09260206040909202019081019150612a84565b90505f6103ec826105d6565b90505f6103f8846105d6565b90505f6104068a358361065a565b905061041d6001600160a01b0385168c5f19610681565b6104326001600160a01b0386168c5f19610681565b604051632e7ff4ef60e11b81526001600160a01b038c1690635cffe9de90610464903090899086908c90600401612a9f565b6020604051808303815f875af1158015610480573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104a49190612ad0565b6104c1576040516349088f5960e11b815260040160405180910390fd5b6104d56001600160a01b0386168c5f610681565b6104e96001600160a01b0385168c5f610681565b6104fe6104f5886124de565b858588866106fb565b50505050505061052d60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b5050505050565b5f82608001515f8151811061054b5761054b6129f8565b60200260200101515f01516060015183608001515f81518110610570576105706129f8565b6020026020010151604001518151811061058c5761058c6129f8565b60200260200101515f015190506105a3818361094c565b505050565b6105b06109f6565b60027f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b5f6105df610a3a565b6040516354636d2b60e01b81526001600160a01b038316600482015273200e12d10bb0c5e4a17e7018f0f1161919bb9389906354636d2b906024016020604051808303815f875af1158015610636573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906100e19190612aeb565b5f6001600160e01b038316601b0b60e084901d610678828286610ac5565b95945050505050565b61068d8383835f610b09565b6105a35761069e83835f6001610b09565b6106c657604051635274afe760e01b81526001600160a01b0384166004820152602401610119565b6106d38383836001610b09565b6105a357604051635274afe760e01b81526001600160a01b0384166004820152602401610119565b604080516003808252608082019092525f9160208201606080368337019050506040516370a0823160e01b81523060048201529091505f906001600160a01b038716906370a0823190602401602060405180830381865afa158015610762573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107869190612b0b565b905080156107a2576107a26001600160a01b0387163383610b6b565b5f6107ad8287610b78565b50905080835f815181106107c3576107c36129f8565b602090810291909101015250506040516370a0823160e01b81523060048201525f906001600160a01b038516906370a0823190602401602060405180830381865afa158015610814573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108389190612b0b565b90508015610854576108546001600160a01b0385163383610b6b565b5f61085f8285610b78565b5090508083600181518110610876576108766129f8565b6020908102919091010152504790508015610895576108953382610bb9565b5f6108a1826012610b78565b50905080836002815181106108b8576108b86129f8565b602090810291909101015250506040805160018082528183019092525f91816020015b6040805160a0810182525f91810182815260608083019390935260808201839052815260208101919091528152602001906001900390816108db57905050905086815f8151811061092e5761092e6129f8565b60200260200101819052506109438282610c30565b50505050505050565b5f805f838060200190518101906109639190612b22565b919450925090506001600160a01b038316610991576040516398521dc560e01b815260040160405180910390fd5b6001600160a01b0382166109b85760405163456ac4c360e11b815260040160405180910390fd5b6109cd6001600160a01b038616845f19610681565b6109e16001600160a01b0383168247610c45565b5061052d6001600160a01b038616845f610681565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0054600203610a3857604051633ee5aeb560e01b815260040160405180910390fd5b565b73200e12d10bb0c5e4a17e7018f0f1161919bb93893b1580610a91575073200e12d10bb0c5e4a17e7018f0f1161919bb93893f7f1de7d717526cba131d684e312dedbf0852adef9cced9e36798ae4937f7145d4114155b15610a38576040516373e6d7b360e01b815273200e12d10bb0c5e4a17e7018f0f1161919bb93896004820152602401610119565b5f805f610ad3868686610cf3565b9150915080610afe5760405162bc8ecf60e31b81526004810187905260248101869052604401610119565b5090505b9392505050565b60405163095ea7b360e01b5f8181526001600160a01b038616600452602485905291602083604481808b5af1925060015f51148316610b5f578383151615610b53573d5f823e3d81fd5b5f873b113d1516831692505b60405250949350505050565b6106d38383836001610e65565b5f805f805f610b878787610eaf565b9250925092505f80610b998585610f0b565b9150915081838015610ba85750815b9650965050505050505b9250929050565b80471015610be35760405163cf47918160e01b815247600482015260248101829052604401610119565b610bfc828260405180602001604052805f815250611154565b15610c05575050565b3d15610c1757610c13611169565b5050565b60405163d6bda27560e01b815260040160405180910390fd5b610c13610c3e600784611174565b825f6111d6565b606081471015610c715760405163cf47918160e01b815247600482015260248101839052604401610119565b5f610c7d858486611154565b9050808015610c9e57505f3d1180610c9e57505f856001600160a01b03163b115b15610cb357610cab61148a565b915050610b02565b8015610cdd57604051639996b31560e01b81526001600160a01b0386166004820152602401610119565b3d15610c1757610ceb611169565b509392505050565b5f805f851215610d2057604051634a7d166b60e01b81526004810186905260248101859052604401610119565b845f03610d3257505f90506001610e5d565b8460ff8416850185811215610d6d5760405163c849483b60e01b8152600481018890526024810187905260ff86166044820152606401610119565b5f805f831215610db957604c19831215610d90575f809550955050505050610e5d565b825f03600a0a9150818481610da757610da7612bbd565b0495505084029091149150610e5d9050565b5f831315610e5257604d831315610df65760405163c849483b60e01b8152600481018a90526024810189905260ff88166044820152606401610119565b82600a0a9150815f1981610e0c57610e0c612bbd565b04841115610e405760405163c849483b60e01b8152600481018a90526024810189905260ff88166044820152606401610119565b5091909102925060019150610e5d9050565b509193506001925050505b935093915050565b60405163a9059cbb60e01b5f8181526001600160a01b038616600452602485905291602083604481808b5af1925060015f51148316610b5f578383151615610b53573d5f823e3d81fd5b5f808060ff841681037f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff861115610efa57600a860460018201600a88065f1493509350935050610f04565b8593509150600190505b9250925092565b5f808383601b82900b821480611041577d90e40fbeea1d3a4abc8955e946fe31cdcf66f634e1000000000000000000870515610f8c577f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee8000000000000000000870515610f7d576305f5e10087059650600886019550610f8c565b620186a0870596506005860195505b8687601b0b14610fa757600a87059650856001019550610f8c565b7b0ccccccccccccccccccccccccccccccccccccccccccccccccccccccc7b199999999999999999999999999999999999999999999999999999988882011161103b575f600188039050808160030b036110395760e01b6001600160e01b037b7fffffffffffffffffffffffffffffffffffffffffffffffffffffff60ff8b901d18161795505f9450610bb29350505050565b505b50611058565b865f0361105857505f935060019250610bb2915050565b858660030b1461110f575f8213156110b75761107483836114a3565b1561109c5760405163d556b11160e01b81526004810184905260248101839052604401610119565b637ffffffe19909501600a0a82029550637fffffff9461110f565b637fffffff1986900360438113156110d957505f9450849350610bb292505050565b80600a0a88816110eb576110eb612bbd565b059750875f0361110557505f9450849350610bb292505050565b50637fffffff1995505b81861361111f5760019350611138565b818603600a0a838161113357611133612bbd565b071593505b5050506001600160e01b03841660e084901b1791509250929050565b5f805f83516020850186885af1949350505050565b6040513d5f823e3d81fd5b60408051600780825261010082019092526060915f9190816020015b606081526020019060019003908161119057905050905082816111b4600187612bd1565b815181106111c4576111c46129f8565b60209081029190910101529392505050565b60408051600780825261010082019092525f91816020015b60608152602001906001900390816111ee5790505090505f5b845181101561124f57848181518110611222576112226129f8565b602002602001015182828151811061123c5761123c6129f8565b6020908102919091010152600101611207565b50335f8181523060209081526040808320815160a0810183528083018581526060808301879052608083018190529082528185015282518581529384018581528484019093529093909291905b885181101561147e578881815181106112b7576112b76129f8565b602002602001015193505f845f015160400151511115611476575f6112e08886602001516114be565b90508861135357611335815f815181106112fc576112fc6129f8565b60200260200101515f81518110611315576113156129f8565b602002602001015160408051600181526020810192909252818101905290565b815f81518110611347576113476129f8565b60200260200101819052505b8451516040805160e08101825287516020908101516001600160a01b0390811683529082018a90528851830151828401525f606083018190526080830186905260a0830189905260c08301889052925163d04dfe2360e01b81529293169163d04dfe23916113c391600401612c3b565b5f60405180830381865afa1580156113dd573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526114049190810190612d33565b9150505f815111156114735785516020015160405163012c676d60e21b81526001600160a01b03909116906304b19db490611445908b908590600401612ddf565b5f604051808303815f87803b15801561145c575f80fd5b505af115801561146e573d5f803e3d5ffd5b505050505b50505b60010161129c565b50505050505050505050565b6040513d81523d5f602083013e3d602001810160405290565b5f610b025f84126114b457836114b8565b835f035b836117a0565b60605f825167ffffffffffffffff8111156114db576114db611bc8565b604051908082528060200260200182016040528015611504578160200160208202803683370190505b5090505f80845111611516575f61151c565b83516001015b85516001010190505f8167ffffffffffffffff81111561153e5761153e611bc8565b60405190808252806020026020018201604052801561157157816020015b606081526020019060019003908161155c5790505b5090505f611595604080516002815233602082015230818301526060810190915290565b8282815181106115a7576115a76129f8565b60200260200101819052505f5b87518110156116045781806001019250508781815181106115d7576115d76129f8565b60200260200101518383815181106115f1576115f16129f8565b60209081029190910101526001016115b4565b5085511561179657808060010191505083828281518110611627576116276129f8565b60200260200101819052505f5b8651811015611794576116e3878281518110611652576116526129f8565b60200260200101515f01516116c061168e8a8581518110611675576116756129f8565b6020026020010151602001518051602090810291012090565b7f19457468657265756d205369676e6564204d6573736167653a0a3332000000005f908152601c91909152603c902090565b8984815181106116d2576116d26129f8565b60200260200101516040015161183e565b61170357604051630a57f30960e31b815260048101829052602401610119565b868181518110611715576117156129f8565b60200260200101515f01516001600160a01b03165f1b85828151811061173d5761173d6129f8565b6020026020010181815250508180600101925050868181518110611763576117636129f8565b602002602001015160200151838381518110611781576117816129f8565b6020908102919091010152600101611634565b505b5095945050505050565b5f637ffffff582136117b357505f6100e1565b637ffffffe19820160438113156117ce5750508115156100e1565b5f811261180e5780600a0a7b800000000000000000000000000000000000000000000000000000018161180357611803612bbd565b0484119150506100e1565b805f03600a0a7b800000000000000000000000000000000000000000000000000000020284101591505092915050565b5f836001600160a01b03163b5f0361189c575f8061185c85856118ae565b5090925090505f81600381111561187557611875612dff565b1480156118935750856001600160a01b0316826001600160a01b0316145b92505050610b02565b6118a78484846118f4565b9050610b02565b5f805f83516041036118e5576020840151604085015160608601515f1a6118d788828585611959565b955095509550505050610f04565b505081515f9150600290610f04565b805160408051630b135d3f60e11b8082526004820186905260248201929092525f92906020820185604483015e5f82606483010152601f820160051c60051b915060205f60648401838a5afa9050825f5114601f3d1116811693505050509392505050565b5f80807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a084111561199257505f91506003905082611a17565b604080515f808252602082018084528a905260ff891692820192909252606081018790526080810186905260019060a0016020604051602081039080840390855afa1580156119e3573d5f803e3d5ffd5b5050604051601f1901519150506001600160a01b038116611a0e57505f925060019150829050611a17565b92505f91508190505b9450945094915050565b5f60208284031215611a31575f80fd5b81356001600160e01b031981168114610b02575f80fd5b6001600160a01b0381168114610218575f80fd5b8035611a6781611a48565b919050565b5f8083601f840112611a7c575f80fd5b50813567ffffffffffffffff811115611a93575f80fd5b602083019150836020828501011115610bb2575f80fd5b5f805f805f8060a08789031215611abf575f80fd5b8635611aca81611a48565b95506020870135611ada81611a48565b94506040870135935060608701359250608087013567ffffffffffffffff811115611b03575f80fd5b611b0f89828a01611a6c565b979a9699509497509295939492505050565b5f805f805f60808688031215611b35575f80fd5b8535611b4081611a48565b9450602086013567ffffffffffffffff80821115611b5c575f80fd5b9087019060c0828a031215611b6f575f80fd5b90945060408701359080821115611b84575f80fd5b611b9089838a01611a6c565b90955093506060880135915080821115611ba8575f80fd5b50860160408189031215611bba575f80fd5b809150509295509295909350565b634e487b7160e01b5f52604160045260245ffd5b6040516060810167ffffffffffffffff81118282101715611bff57611bff611bc8565b60405290565b6040805190810167ffffffffffffffff81118282101715611bff57611bff611bc8565b6040516080810167ffffffffffffffff81118282101715611bff57611bff611bc8565b60405160a0810167ffffffffffffffff81118282101715611bff57611bff611bc8565b60405160c0810167ffffffffffffffff81118282101715611bff57611bff611bc8565b604051601f8201601f1916810167ffffffffffffffff81118282101715611cba57611cba611bc8565b604052919050565b8015158114610218575f80fd5b8035611a6781611cc2565b5f67ffffffffffffffff821115611cf357611cf3611bc8565b5060051b60200190565b5f67ffffffffffffffff821115611d1657611d16611bc8565b50601f01601f191660200190565b5f82601f830112611d33575f80fd5b8135611d46611d4182611cfd565b611c91565b818152846020838601011115611d5a575f80fd5b816020850160208301375f918101602001919091529392505050565b5f60608284031215611d86575f80fd5b611d8e611bdc565b90508135611d9b81611a48565b81526020820135611dab81611a48565b6020820152604082013567ffffffffffffffff811115611dc9575f80fd5b611dd584828501611d24565b60408301525092915050565b5f82601f830112611df0575f80fd5b81356020611e00611d4183611cda565b82815260069290921b84018101918181019086841115611e1e575f80fd5b8286015b84811015611e645760408189031215611e39575f80fd5b611e41611c05565b8135611e4c81611a48565b81528185013585820152835291830191604001611e22565b509695505050505050565b5f82601f830112611e7e575f80fd5b81356020611e8e611d4183611cda565b82815260059290921b84018101918181019086841115611eac575f80fd5b8286015b84811015611e6457803567ffffffffffffffff80821115611ecf575f80fd5b908801906060828b03601f19011215611ee6575f80fd5b611eee611bdc565b86830135611efb81611a48565b815260408381013583811115611f0f575f80fd5b8401603f81018d13611f1f575f80fd5b88810135611f2f611d4182611cda565b81815260059190911b82018301908a8101908f831115611f4d575f80fd5b928401925b82841015611f6b5783358252928b0192908b0190611f52565b858c0152505050606084013583811115611f83575f80fd5b611f918d8a83880101611d24565b918301919091525085525050918301918301611eb0565b5f82601f830112611fb7575f80fd5b81356020611fc7611d4183611cda565b82815260059290921b84018101918181019086841115611fe5575f80fd5b8286015b84811015611e6457803567ffffffffffffffff80821115612008575f80fd5b90880190601f196080838c0382011215612020575f80fd5b612028611c28565b8784013583811115612038575f80fd5b840160a0818e038401121561204b575f80fd5b612053611c4b565b9250612060898201611a5c565b8352604081013584811115612073575f80fd5b6120818e8b83850101611d76565b8a8501525060608082013585811115612098575f80fd5b6120a68f8c83860101611de1565b6040860152506080820135858111156120bd575f80fd5b6120cb8f8c83860101611de1565b828601525060a0820135608085015283835260408601358a8401528086013560408401526080860135935084841115612102575f80fd5b6121108e8b86890101611e6f565b90830152508652505050918301918301611fe9565b5f8060408385031215612136575f80fd5b823567ffffffffffffffff8082111561214d575f80fd5b9084019060c08287031215612160575f80fd5b612168611c6e565b82358152602083013560208201526040830135604082015261218c60608401611ccf565b60608201526080830135828111156121a2575f80fd5b6121ae88828601611fa8565b60808301525060a0830135828111156121c5575f80fd5b6121d188828601611d24565b60a083015250935060208501359150808211156121ec575f80fd5b506121f985828601611d24565b9150509250929050565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b5f815180845260208085019450602084015f5b8381101561227457815180516001600160a01b031688528301518388015260409096019590820190600101612244565b509495945050505050565b5f815180845260208085019450602084015f5b8381101561227457815187529582019590820190600101612292565b5f82825180855260208086019550808260051b8401018186015f5b8481101561233157601f19868403018952815160606001600160a01b0382511685528582015181878701526123008287018261227f565b9150506040808301519250858203818701525061231d8183612203565b9a86019a94505050908301906001016122c9565b5090979650505050505050565b5f602080835260e08301845182850152818501516040818187015280870151915060608281880152808801519250608083151560808901526080890151935060a060c060a08a01528585518088526101009750878b019150878160051b8c010189880197505f5b8281101561248d578c820360ff190184528851805187845280516001600160a01b03908116898601528d82015188860189905280518216610120870152808f01519091166101408601528a015161016085018a9052612408610180860182612203565b90508a820151607f19808784030160c08801526124258383612231565b92508b8401519150808784030160e0880152506124428282612231565b915050888201518d8601528d8301518e8601528a8301518b8601528983015192508481038a86015261247481846122ae565b9b8e019b968e01969450505060019190910190506123a5565b5060a08d01518c8203601f190160c08e015299506124ab818b612203565b9d9c50505050505050505050505050565b5f80604083850312156124cd575f80fd5b505080516020909101519092909150565b5f604082360312156124ee575f80fd5b6124f6611c05565b823567ffffffffffffffff8082111561250d575f80fd5b61251936838701611d76565b8352602085013591508082111561252e575f80fd5b5061253b36828601611e6f565b60208301525092915050565b5f808335601e1984360301811261255c575f80fd5b83018035915067ffffffffffffffff821115612576575f80fd5b6020019150600581901b3603821315610bb2575f80fd5b5f6020828403121561259d575f80fd5b8135610b0281611cc2565b5f808335601e198436030181126125bd575f80fd5b830160208101925035905067ffffffffffffffff8111156125dc575f80fd5b8060051b3603821315610bb2575f80fd5b5f8235605e19833603018112612601575f80fd5b90910192915050565b5f808335601e1984360301811261261f575f80fd5b830160208101925035905067ffffffffffffffff81111561263e575f80fd5b803603821315610bb2575f80fd5b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b5f808335601e19843603018112612689575f80fd5b830160208101925035905067ffffffffffffffff8111156126a8575f80fd5b8060061b3603821315610bb2575f80fd5b8183525f60208085019450825f5b858110156122745781356126da81611a48565b6001600160a01b031687528183013583880152604096870196909101906001016126c7565b8183526020808401935f91600585811b8301820185855b888110156127d857858303601f19018a5261273182896125ed565b6060813561273e81611a48565b6001600160a01b03168552612755828801836125a8565b82898801528083880152608092507f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81111561278f575f80fd5b871b8082888501378601905060406127a98482018561260a565b94508388840301828901526127c1848401868361264c565b9e8a019e9750505093870193505050600101612716565b509098975050505050505050565b5f604080835261010080840187358386015260206060818a013581880152848a01356080880152808a013561281a81611cc2565b151560a088015261282e60808b018b6125a8565b60c0898101529384905261012093848901600582901b8a018601835f5b848110156129a8578c830361011f19018452813536879003607e19018112612871575f80fd5b8601803536829003609e19018112612887575f80fd5b608085528101803561289881611a48565b6001600160a01b0380821660808801526128b48c8401846125ed565b915060a08088015281356128c781611a48565b8116878e0152818c01356128da81611a48565b166101408701526128ed818f018261260a565b91508a6101608801526129056101808801838361264c565b9150506129148e830183612674565b607f19808985030160c08a015261292c8483856126b9565b935061293a8d860186612674565b93509150808985030160e08a0152506129548383836126b9565b9250505060808201358d8701528a8301358b8701528d8301358e87015261297d8a8401846125a8565b935091508581038a8701526129938184846126ff565b968b019695505050918801915060010161284b565b50506129b760a08f018f61260a565b8c8303603f190160e08e0152995097506129d2818a8a61264c565b98505050505050858403818701525050506129ee81858761264c565b9695505050505050565b634e487b7160e01b5f52603260045260245ffd5b5f8235607e19833603018112612a20575f80fd5b9190910192915050565b5f8235609e19833603018112612a20575f80fd5b5f808335601e19843603018112612a53575f80fd5b83018035915067ffffffffffffffff821115612a6d575f80fd5b6020019150600681901b3603821315610bb2575f80fd5b5f60208284031215612a94575f80fd5b8135610b0281611a48565b5f6001600160a01b038087168352808616602084015250836040830152608060608301526129ee6080830184612203565b5f60208284031215612ae0575f80fd5b8151610b0281611cc2565b5f60208284031215612afb575f80fd5b815160ff81168114610b02575f80fd5b5f60208284031215612b1b575f80fd5b5051919050565b5f805f60608486031215612b34575f80fd5b8351612b3f81611a48565b6020850151909350612b5081611a48565b604085015190925067ffffffffffffffff811115612b6c575f80fd5b8401601f81018613612b7c575f80fd5b8051612b8a611d4182611cfd565b818152876020838501011115612b9e575f80fd5b8160208401602083015e5f602083830101528093505050509250925092565b634e487b7160e01b5f52601260045260245ffd5b818103818111156100e157634e487b7160e01b5f52601160045260245ffd5b5f8282518085526020808601955060208260051b840101602086015f5b8481101561233157601f19868403018952612c2983835161227f565b98840198925090830190600101612c0d565b602081526001600160a01b038251166020820152602082015160408201525f604083015160e06060840152612c74610100840182612203565b9050606084015160808401526080840151601f19808584030160a0860152612c9c8383612bf0565b925060a08601519150808584030160c0860152612cb9838361227f565b925060c08601519150808584030160e086015250610678828261227f565b5f82601f830112612ce6575f80fd5b81516020612cf6611d4183611cda565b8083825260208201915060208460051b870101935086841115612d17575f80fd5b602086015b84811015611e645780518352918301918301612d1c565b5f8060408385031215612d44575f80fd5b825167ffffffffffffffff80821115612d5b575f80fd5b818501915085601f830112612d6e575f80fd5b81516020612d7e611d4183611cda565b82815260059290921b84018101918181019089841115612d9c575f80fd5b948201945b83861015612dba57855182529482019490820190612da1565b91880151919650909350505080821115612dd2575f80fd5b506121f985828601612cd7565b828152604060208201525f612df7604083018461227f565b949350505050565b634e487b7160e01b5f52602160045260245ffd"; /// @dev The runtime bytecode of the contract. bytes constant RUNTIME_CODE = - hex"608060405260043610610034575f3560e01c806301ffc9a71461003d57806323e30c8b146100715780638c18e4ba1461009e57005b3661003b57005b005b348015610048575f80fd5b5061005c61005736600461198c565b6100b1565b60405190151581526020015b60405180910390f35b34801561007c575f80fd5b5061009061008b366004611a15565b6100e7565b604051908152602001610068565b61003b6100ac366004611a8c565b610204565b5f6001600160e01b031982166323e30c8b60e01b14806100e157506301ffc9a760e01b6001600160e01b03198316145b92915050565b5f3373834e1da0d2e04ab48f9efa6a7b9bbdb6ff62839e1461012257604051625e1e6f60e51b81523360048201526024015b60405180910390fd5b6001600160a01b0387163014610156576040516322c7df1960e21b81526001600160a01b0388166004820152602401610119565b5f8061016484860186612090565b915091506101728282610534565b6040516334e3942b60e11b815233906369c72856906101959085906004016122a9565b60408051808303815f875af11580156101b0573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906101d49190612427565b507f439148f0bbc682ca079e46d6e2c2f0c1e3b820f1a291b069d8882abf8cf18dd99a9950505050505050505050565b61020c6105a8565b61021b61021882612449565b50565b61022860808501856124b2565b90505f0361024957604051639c95219f60e01b815260040160405180910390fd5b61025960808501606086016124f8565b61027657604051636d3a9fe560e01b815260040160405180910390fd5b5f84848460405160200161028c93929190612751565b60408051601f1981840301815291905290505f6102ac60808701876124b2565b5f8181106102bc576102bc612963565b90506020028101906102ce9190612977565b6102d89080612995565b6102e69060608101906129a9565b6102f360808901896124b2565b5f81811061030357610303612963565b90506020028101906103159190612977565b6040013581811061032857610328612963565b61033e92602060409092020190810191506129ef565b90505f61034e60808801886124b2565b5f81811061035e5761035e612963565b90506020028101906103709190612977565b61037a9080612995565b6103889060408101906129a9565b61039560808a018a6124b2565b5f8181106103a5576103a5612963565b90506020028101906103b79190612977565b602001358181106103ca576103ca612963565b6103e092602060409092020190810191506129ef565b90505f6103ec826105d6565b90505f6103f8846105d6565b90505f6104068a358361065a565b905061041d6001600160a01b0385168c5f19610681565b6104326001600160a01b0386168c5f19610681565b604051632e7ff4ef60e11b81526001600160a01b038c1690635cffe9de90610464903090899086908c90600401612a0a565b6020604051808303815f875af1158015610480573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104a49190612a3b565b6104c1576040516349088f5960e11b815260040160405180910390fd5b6104d56001600160a01b0386168c5f610681565b6104e96001600160a01b0385168c5f610681565b6104fe6104f588612449565b858588866106fb565b50505050505061052d60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b5050505050565b5f82608001515f8151811061054b5761054b612963565b60200260200101515f01516060015183608001515f8151811061057057610570612963565b6020026020010151604001518151811061058c5761058c612963565b60200260200101515f015190506105a3818361099a565b505050565b6105b0610a44565b60027f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b5f6105df610a88565b6040516354636d2b60e01b81526001600160a01b038316600482015273200e12d10bb0c5e4a17e7018f0f1161919bb9389906354636d2b906024016020604051808303815f875af1158015610636573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906100e19190612a56565b5f6001600160e01b038316601b0b60e084901d610678828286610b13565b95945050505050565b61068d8383835f610b57565b6105a35761069e83835f6001610b57565b6106c657604051635274afe760e01b81526001600160a01b0384166004820152602401610119565b6106d38383836001610b57565b6105a357604051635274afe760e01b81526001600160a01b0384166004820152602401610119565b6040805160018082528183019092525f91816020015b6060815260200190600190039081610711575050604080516003808252608082019092529192505f919060208201606080368337019050506040516370a0823160e01b81523060048201529091505f906001600160a01b038816906370a0823190602401602060405180830381865afa158015610790573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107b49190612a76565b905080156107d0576107d06001600160a01b0388163383610bb9565b5f6107db8288610bc6565b50905080835f815181106107f1576107f1612963565b602090810291909101015250506040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa158015610842573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108669190612a76565b90508015610882576108826001600160a01b0386163383610bb9565b5f61088d8286610bc6565b50905080836001815181106108a4576108a4612963565b60209081029190910101525047905080156108c3576108c33382610c07565b5f6108cf826012610bc6565b50905080836002815181106108e6576108e6612963565b602002602001018181525050505080825f8151811061090757610907612963565b60209081029190910101526040805160018082528183019092525f91816020015b6040805160a0810182525f918101828152606080830193909352608082018390528152602081019190915281526020019060019003908161092857905050905087815f8151811061097b5761097b612963565b60200260200101819052506109908382610c7e565b5050505050505050565b5f805f838060200190518101906109b19190612a8d565b919450925090506001600160a01b0383166109df576040516398521dc560e01b815260040160405180910390fd5b6001600160a01b038216610a065760405163456ac4c360e11b815260040160405180910390fd5b610a1b6001600160a01b038616845f19610681565b610a2f6001600160a01b0383168247610ec6565b5061052d6001600160a01b038616845f610681565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0054600203610a8657604051633ee5aeb560e01b815260040160405180910390fd5b565b73200e12d10bb0c5e4a17e7018f0f1161919bb93893b1580610adf575073200e12d10bb0c5e4a17e7018f0f1161919bb93893f7f1de7d717526cba131d684e312dedbf0852adef9cced9e36798ae4937f7145d4114155b15610a86576040516373e6d7b360e01b815273200e12d10bb0c5e4a17e7018f0f1161919bb93896004820152602401610119565b5f805f610b21868686610f74565b9150915080610b4c5760405162bc8ecf60e31b81526004810187905260248101869052604401610119565b5090505b9392505050565b60405163095ea7b360e01b5f8181526001600160a01b038616600452602485905291602083604481808b5af1925060015f51148316610bad578383151615610ba1573d5f823e3d81fd5b5f873b113d1516831692505b60405250949350505050565b6106d383838360016110e6565b5f805f805f610bd58787611130565b9250925092505f80610be7858561118c565b9150915081838015610bf65750815b9650965050505050505b9250929050565b80471015610c315760405163cf47918160e01b815247600482015260248101829052604401610119565b610c4a828260405180602001604052805f8152506113d5565b15610c53575050565b3d15610c6557610c616113ea565b5050565b60405163d6bda27560e01b815260040160405180910390fd5b60408051600480825260a082019092525f91816020015b6060815260200190600190039081610c955790505090505f5b8351811015610cf657838181518110610cc957610cc9612963565b6020026020010151828281518110610ce357610ce3612963565b6020908102919091010152600101610cae565b50335f8181523060209081526040808320815160a0810183528083018581526060808301879052608083018190529082528185015282518581529384018581528484019093529093909291905b8751811015610ebb57878181518110610d5e57610d5e612963565b602002602001015193505f845f015160400151511115610eb3575f845f01515f01516001600160a01b031663d04dfe236040518060e00160405280885f0151602001516001600160a01b03168152602001898152602001885f01516040015181526020015f8152602001610dd68c8a602001516113f5565b8152602001878152602001868152506040518263ffffffff1660e01b8152600401610e019190612b73565b5f60405180830381865afa158015610e1b573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610e429190810190612c6b565b9150505f81511115610eb15784516020015160405163012c676d60e21b81526001600160a01b03909116906304b19db490610e83908a908590600401612d17565b5f604051808303815f87803b158015610e9a575f80fd5b505af1158015610eac573d5f803e3d5ffd5b505050505b505b600101610d43565b505050505050505050565b606081471015610ef25760405163cf47918160e01b815247600482015260248101839052604401610119565b5f610efe8584866113d5565b9050808015610f1f57505f3d1180610f1f57505f856001600160a01b03163b115b15610f3457610f2c6116d7565b915050610b50565b8015610f5e57604051639996b31560e01b81526001600160a01b0386166004820152602401610119565b3d15610c6557610f6c6113ea565b509392505050565b5f805f851215610fa157604051634a7d166b60e01b81526004810186905260248101859052604401610119565b845f03610fb357505f905060016110de565b8460ff8416850185811215610fee5760405163c849483b60e01b8152600481018890526024810187905260ff86166044820152606401610119565b5f805f83121561103a57604c19831215611011575f8095509550505050506110de565b825f03600a0a915081848161102857611028612d37565b04955050840290911491506110de9050565b5f8313156110d357604d8313156110775760405163c849483b60e01b8152600481018a90526024810189905260ff88166044820152606401610119565b82600a0a9150815f198161108d5761108d612d37565b048411156110c15760405163c849483b60e01b8152600481018a90526024810189905260ff88166044820152606401610119565b50919091029250600191506110de9050565b509193506001925050505b935093915050565b60405163a9059cbb60e01b5f8181526001600160a01b038616600452602485905291602083604481808b5af1925060015f51148316610bad578383151615610ba1573d5f823e3d81fd5b5f808060ff841681037f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff86111561117b57600a860460018201600a88065f1493509350935050611185565b8593509150600190505b9250925092565b5f808383601b82900b8214806112c2577d90e40fbeea1d3a4abc8955e946fe31cdcf66f634e100000000000000000087051561120d577f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee80000000000000000008705156111fe576305f5e1008705965060088601955061120d565b620186a0870596506005860195505b8687601b0b1461122857600a8705965085600101955061120d565b7b0ccccccccccccccccccccccccccccccccccccccccccccccccccccccc7b19999999999999999999999999999999999999999999999999999998888201116112bc575f600188039050808160030b036112ba5760e01b6001600160e01b037b7fffffffffffffffffffffffffffffffffffffffffffffffffffffff60ff8b901d18161795505f9450610c009350505050565b505b506112d9565b865f036112d957505f935060019250610c00915050565b858660030b14611390575f821315611338576112f583836116f0565b1561131d5760405163d556b11160e01b81526004810184905260248101839052604401610119565b637ffffffe19909501600a0a82029550637fffffff94611390565b637fffffff19869003604381131561135a57505f9450849350610c0092505050565b80600a0a888161136c5761136c612d37565b059750875f0361138657505f9450849350610c0092505050565b50637fffffff1995505b8186136113a057600193506113b9565b818603600a0a83816113b4576113b4612d37565b071593505b5050506001600160e01b03841660e084901b1791509250929050565b5f805f83516020850186885af1949350505050565b6040513d5f823e3d81fd5b60605f825167ffffffffffffffff81111561141257611412611b33565b60405190808252806020026020018201604052801561143b578160200160208202803683370190505b5090505f8084511161144d575f611453565b83516001015b85516001010190505f8167ffffffffffffffff81111561147557611475611b33565b6040519080825280602002602001820160405280156114a857816020015b60608152602001906001900390816114935790505b5090505f6114cc604080516002815233602082015230818301526060810190915290565b8282815181106114de576114de612963565b60200260200101819052505f5b875181101561153b57818060010192505087818151811061150e5761150e612963565b602002602001015183838151811061152857611528612963565b60209081029190910101526001016114eb565b508551156116cd5780806001019150508382828151811061155e5761155e612963565b60200260200101819052505f5b86518110156116cb5761161a87828151811061158957611589612963565b60200260200101515f01516115f76115c58a85815181106115ac576115ac612963565b6020026020010151602001518051602090810291012090565b7f19457468657265756d205369676e6564204d6573736167653a0a3332000000005f908152601c91909152603c902090565b89848151811061160957611609612963565b60200260200101516040015161170b565b61163a57604051630a57f30960e31b815260048101829052602401610119565b86818151811061164c5761164c612963565b60200260200101515f01516001600160a01b03165f1b85828151811061167457611674612963565b602002602001018181525050818060010192505086818151811061169a5761169a612963565b6020026020010151602001518383815181106116b8576116b8612963565b602090810291909101015260010161156b565b505b5095945050505050565b6040513d81523d5f602083013e3d602001810160405290565b5f610b505f84126117015783611705565b835f035b8361177b565b5f836001600160a01b03163b5f03611769575f806117298585611819565b5090925090505f81600381111561174257611742612d4b565b1480156117605750856001600160a01b0316826001600160a01b0316145b92505050610b50565b61177484848461185f565b9050610b50565b5f637ffffff5821361178e57505f6100e1565b637ffffffe19820160438113156117a95750508115156100e1565b5f81126117e95780600a0a7b80000000000000000000000000000000000000000000000000000001816117de576117de612d37565b0484119150506100e1565b805f03600a0a7b800000000000000000000000000000000000000000000000000000020284101591505092915050565b5f805f8351604103611850576020840151604085015160608601515f1a611842888285856118c4565b955095509550505050611185565b505081515f9150600290611185565b805160408051630b135d3f60e11b8082526004820186905260248201929092525f92906020820185604483015e5f82606483010152601f820160051c60051b915060205f60648401838a5afa9050825f5114601f3d1116811693505050509392505050565b5f80807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08411156118fd57505f91506003905082611982565b604080515f808252602082018084528a905260ff891692820192909252606081018790526080810186905260019060a0016020604051602081039080840390855afa15801561194e573d5f803e3d5ffd5b5050604051601f1901519150506001600160a01b03811661197957505f925060019150829050611982565b92505f91508190505b9450945094915050565b5f6020828403121561199c575f80fd5b81356001600160e01b031981168114610b50575f80fd5b6001600160a01b0381168114610218575f80fd5b80356119d2816119b3565b919050565b5f8083601f8401126119e7575f80fd5b50813567ffffffffffffffff8111156119fe575f80fd5b602083019150836020828501011115610c00575f80fd5b5f805f805f8060a08789031215611a2a575f80fd5b8635611a35816119b3565b95506020870135611a45816119b3565b94506040870135935060608701359250608087013567ffffffffffffffff811115611a6e575f80fd5b611a7a89828a016119d7565b979a9699509497509295939492505050565b5f805f805f60808688031215611aa0575f80fd5b8535611aab816119b3565b9450602086013567ffffffffffffffff80821115611ac7575f80fd5b9087019060c0828a031215611ada575f80fd5b90945060408701359080821115611aef575f80fd5b611afb89838a016119d7565b90955093506060880135915080821115611b13575f80fd5b50860160408189031215611b25575f80fd5b809150509295509295909350565b634e487b7160e01b5f52604160045260245ffd5b6040516060810167ffffffffffffffff81118282101715611b6a57611b6a611b33565b60405290565b6040805190810167ffffffffffffffff81118282101715611b6a57611b6a611b33565b6040516080810167ffffffffffffffff81118282101715611b6a57611b6a611b33565b60405160a0810167ffffffffffffffff81118282101715611b6a57611b6a611b33565b60405160c0810167ffffffffffffffff81118282101715611b6a57611b6a611b33565b604051601f8201601f1916810167ffffffffffffffff81118282101715611c2557611c25611b33565b604052919050565b8015158114610218575f80fd5b80356119d281611c2d565b5f67ffffffffffffffff821115611c5e57611c5e611b33565b5060051b60200190565b5f67ffffffffffffffff821115611c8157611c81611b33565b50601f01601f191660200190565b5f82601f830112611c9e575f80fd5b8135611cb1611cac82611c68565b611bfc565b818152846020838601011115611cc5575f80fd5b816020850160208301375f918101602001919091529392505050565b5f60608284031215611cf1575f80fd5b611cf9611b47565b90508135611d06816119b3565b81526020820135611d16816119b3565b6020820152604082013567ffffffffffffffff811115611d34575f80fd5b611d4084828501611c8f565b60408301525092915050565b5f82601f830112611d5b575f80fd5b81356020611d6b611cac83611c45565b82815260069290921b84018101918181019086841115611d89575f80fd5b8286015b84811015611dcf5760408189031215611da4575f80fd5b611dac611b70565b8135611db7816119b3565b81528185013585820152835291830191604001611d8d565b509695505050505050565b5f82601f830112611de9575f80fd5b81356020611df9611cac83611c45565b82815260059290921b84018101918181019086841115611e17575f80fd5b8286015b84811015611dcf57803567ffffffffffffffff80821115611e3a575f80fd5b908801906060828b03601f19011215611e51575f80fd5b611e59611b47565b86830135611e66816119b3565b815260408381013583811115611e7a575f80fd5b8401603f81018d13611e8a575f80fd5b88810135611e9a611cac82611c45565b81815260059190911b82018301908a8101908f831115611eb8575f80fd5b928401925b82841015611ed65783358252928b0192908b0190611ebd565b858c0152505050606084013583811115611eee575f80fd5b611efc8d8a83880101611c8f565b918301919091525085525050918301918301611e1b565b5f82601f830112611f22575f80fd5b81356020611f32611cac83611c45565b82815260059290921b84018101918181019086841115611f50575f80fd5b8286015b84811015611dcf57803567ffffffffffffffff80821115611f73575f80fd5b90880190601f196080838c0382011215611f8b575f80fd5b611f93611b93565b8784013583811115611fa3575f80fd5b840160a0818e0384011215611fb6575f80fd5b611fbe611bb6565b9250611fcb8982016119c7565b8352604081013584811115611fde575f80fd5b611fec8e8b83850101611ce1565b8a8501525060608082013585811115612003575f80fd5b6120118f8c83860101611d4c565b604086015250608082013585811115612028575f80fd5b6120368f8c83860101611d4c565b828601525060a0820135608085015283835260408601358a840152808601356040840152608086013593508484111561206d575f80fd5b61207b8e8b86890101611dda565b90830152508652505050918301918301611f54565b5f80604083850312156120a1575f80fd5b823567ffffffffffffffff808211156120b8575f80fd5b9084019060c082870312156120cb575f80fd5b6120d3611bd9565b8235815260208301356020820152604083013560408201526120f760608401611c3a565b606082015260808301358281111561210d575f80fd5b61211988828601611f13565b60808301525060a083013582811115612130575f80fd5b61213c88828601611c8f565b60a08301525093506020850135915080821115612157575f80fd5b5061216485828601611c8f565b9150509250929050565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b5f815180845260208085019450602084015f5b838110156121df57815180516001600160a01b0316885283015183880152604090960195908201906001016121af565b509495945050505050565b5f815180845260208085019450602084015f5b838110156121df578151875295820195908201906001016121fd565b5f82825180855260208086019550808260051b8401018186015f5b8481101561229c57601f19868403018952815160606001600160a01b03825116855285820151818787015261226b828701826121ea565b91505060408083015192508582038187015250612288818361216e565b9a86019a9450505090830190600101612234565b5090979650505050505050565b5f602080835260e08301845182850152818501516040818187015280870151915060608281880152808801519250608083151560808901526080890151935060a060c060a08a01528585518088526101009750878b019150878160051b8c010189880197505f5b828110156123f8578c820360ff190184528851805187845280516001600160a01b03908116898601528d82015188860189905280518216610120870152808f01519091166101408601528a015161016085018a905261237361018086018261216e565b90508a820151607f19808784030160c0880152612390838361219c565b92508b8401519150808784030160e0880152506123ad828261219c565b915050888201518d8601528d8301518e8601528a8301518b8601528983015192508481038a8601526123df8184612219565b9b8e019b968e0196945050506001919091019050612310565b5060a08d01518c8203601f190160c08e01529950612416818b61216e565b9d9c50505050505050505050505050565b5f8060408385031215612438575f80fd5b505080516020909101519092909150565b5f60408236031215612459575f80fd5b612461611b70565b823567ffffffffffffffff80821115612478575f80fd5b61248436838701611ce1565b83526020850135915080821115612499575f80fd5b506124a636828601611dda565b60208301525092915050565b5f808335601e198436030181126124c7575f80fd5b83018035915067ffffffffffffffff8211156124e1575f80fd5b6020019150600581901b3603821315610c00575f80fd5b5f60208284031215612508575f80fd5b8135610b5081611c2d565b5f808335601e19843603018112612528575f80fd5b830160208101925035905067ffffffffffffffff811115612547575f80fd5b8060051b3603821315610c00575f80fd5b5f8235605e1983360301811261256c575f80fd5b90910192915050565b5f808335601e1984360301811261258a575f80fd5b830160208101925035905067ffffffffffffffff8111156125a9575f80fd5b803603821315610c00575f80fd5b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b5f808335601e198436030181126125f4575f80fd5b830160208101925035905067ffffffffffffffff811115612613575f80fd5b8060061b3603821315610c00575f80fd5b8183525f60208085019450825f5b858110156121df578135612645816119b3565b6001600160a01b03168752818301358388015260409687019690910190600101612632565b8183526020808401935f91600585811b8301820185855b8881101561274357858303601f19018a5261269c8289612558565b606081356126a9816119b3565b6001600160a01b031685526126c082880183612513565b82898801528083880152608092507f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8111156126fa575f80fd5b871b80828885013786019050604061271484820185612575565b945083888403018289015261272c84840186836125b7565b9e8a019e9750505093870193505050600101612681565b509098975050505050505050565b5f604080835261010080840187358386015260206060818a013581880152848a01356080880152808a013561278581611c2d565b151560a088015261279960808b018b612513565b60c0898101529384905261012093848901600582901b8a018601835f5b84811015612913578c830361011f19018452813536879003607e190181126127dc575f80fd5b8601803536829003609e190181126127f2575f80fd5b6080855281018035612803816119b3565b6001600160a01b03808216608088015261281f8c840184612558565b915060a0808801528135612832816119b3565b8116878e0152818c0135612845816119b3565b16610140870152612858818f0182612575565b91508a610160880152612870610180880183836125b7565b91505061287f8e8301836125df565b607f19808985030160c08a0152612897848385612624565b93506128a58d8601866125df565b93509150808985030160e08a0152506128bf838383612624565b9250505060808201358d8701528a8301358b8701528d8301358e8701526128e88a840184612513565b935091508581038a8701526128fe81848461266a565b968b01969550505091880191506001016127b6565b505061292260a08f018f612575565b8c8303603f190160e08e01529950975061293d818a8a6125b7565b98505050505050858403818701525050506129598185876125b7565b9695505050505050565b634e487b7160e01b5f52603260045260245ffd5b5f8235607e1983360301811261298b575f80fd5b9190910192915050565b5f8235609e1983360301811261298b575f80fd5b5f808335601e198436030181126129be575f80fd5b83018035915067ffffffffffffffff8211156129d8575f80fd5b6020019150600681901b3603821315610c00575f80fd5b5f602082840312156129ff575f80fd5b8135610b50816119b3565b5f6001600160a01b03808716835280861660208401525083604083015260806060830152612959608083018461216e565b5f60208284031215612a4b575f80fd5b8151610b5081611c2d565b5f60208284031215612a66575f80fd5b815160ff81168114610b50575f80fd5b5f60208284031215612a86575f80fd5b5051919050565b5f805f60608486031215612a9f575f80fd5b8351612aaa816119b3565b6020850151909350612abb816119b3565b604085015190925067ffffffffffffffff811115612ad7575f80fd5b8401601f81018613612ae7575f80fd5b8051612af5611cac82611c68565b818152876020838501011115612b09575f80fd5b8160208401602083015e5f602083830101528093505050509250925092565b5f8282518085526020808601955060208260051b840101602086015f5b8481101561229c57601f19868403018952612b618383516121ea565b98840198925090830190600101612b45565b602081526001600160a01b038251166020820152602082015160408201525f604083015160e06060840152612bac61010084018261216e565b9050606084015160808401526080840151601f19808584030160a0860152612bd48383612b28565b925060a08601519150808584030160c0860152612bf183836121ea565b925060c08601519150808584030160e08601525061067882826121ea565b5f82601f830112612c1e575f80fd5b81516020612c2e611cac83611c45565b8083825260208201915060208460051b870101935086841115612c4f575f80fd5b602086015b84811015611dcf5780518352918301918301612c54565b5f8060408385031215612c7c575f80fd5b825167ffffffffffffffff80821115612c93575f80fd5b818501915085601f830112612ca6575f80fd5b81516020612cb6611cac83611c45565b82815260059290921b84018101918181019089841115612cd4575f80fd5b948201945b83861015612cf257855182529482019490820190612cd9565b91880151919650909350505080821115612d0a575f80fd5b5061216485828601612c0f565b828152604060208201525f612d2f60408301846121ea565b949350505050565b634e487b7160e01b5f52601260045260245ffd5b634e487b7160e01b5f52602160045260245ffd"; + hex"608060405260043610610034575f3560e01c806301ffc9a71461003d57806323e30c8b146100715780638c18e4ba1461009e57005b3661003b57005b005b348015610048575f80fd5b5061005c610057366004611a21565b6100b1565b60405190151581526020015b60405180910390f35b34801561007c575f80fd5b5061009061008b366004611aaa565b6100e7565b604051908152602001610068565b61003b6100ac366004611b21565b610204565b5f6001600160e01b031982166323e30c8b60e01b14806100e157506301ffc9a760e01b6001600160e01b03198316145b92915050565b5f3373d31af42aafee144967be4b5688ecf09592258d7b1461012257604051625e1e6f60e51b81523360048201526024015b60405180910390fd5b6001600160a01b0387163014610156576040516322c7df1960e21b81526001600160a01b0388166004820152602401610119565b5f8061016484860186612125565b915091506101728282610534565b6040516334e3942b60e11b815233906369c728569061019590859060040161233e565b60408051808303815f875af11580156101b0573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906101d491906124bc565b507f439148f0bbc682ca079e46d6e2c2f0c1e3b820f1a291b069d8882abf8cf18dd99a9950505050505050505050565b61020c6105a8565b61021b610218826124de565b50565b6102286080850185612547565b90505f0361024957604051639c95219f60e01b815260040160405180910390fd5b610259608085016060860161258d565b61027657604051636d3a9fe560e01b815260040160405180910390fd5b5f84848460405160200161028c939291906127e6565b60408051601f1981840301815291905290505f6102ac6080870187612547565b5f8181106102bc576102bc6129f8565b90506020028101906102ce9190612a0c565b6102d89080612a2a565b6102e6906060810190612a3e565b6102f36080890189612547565b5f818110610303576103036129f8565b90506020028101906103159190612a0c565b60400135818110610328576103286129f8565b61033e9260206040909202019081019150612a84565b90505f61034e6080880188612547565b5f81811061035e5761035e6129f8565b90506020028101906103709190612a0c565b61037a9080612a2a565b610388906040810190612a3e565b61039560808a018a612547565b5f8181106103a5576103a56129f8565b90506020028101906103b79190612a0c565b602001358181106103ca576103ca6129f8565b6103e09260206040909202019081019150612a84565b90505f6103ec826105d6565b90505f6103f8846105d6565b90505f6104068a358361065a565b905061041d6001600160a01b0385168c5f19610681565b6104326001600160a01b0386168c5f19610681565b604051632e7ff4ef60e11b81526001600160a01b038c1690635cffe9de90610464903090899086908c90600401612a9f565b6020604051808303815f875af1158015610480573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104a49190612ad0565b6104c1576040516349088f5960e11b815260040160405180910390fd5b6104d56001600160a01b0386168c5f610681565b6104e96001600160a01b0385168c5f610681565b6104fe6104f5886124de565b858588866106fb565b50505050505061052d60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b5050505050565b5f82608001515f8151811061054b5761054b6129f8565b60200260200101515f01516060015183608001515f81518110610570576105706129f8565b6020026020010151604001518151811061058c5761058c6129f8565b60200260200101515f015190506105a3818361094c565b505050565b6105b06109f6565b60027f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b5f6105df610a3a565b6040516354636d2b60e01b81526001600160a01b038316600482015273200e12d10bb0c5e4a17e7018f0f1161919bb9389906354636d2b906024016020604051808303815f875af1158015610636573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906100e19190612aeb565b5f6001600160e01b038316601b0b60e084901d610678828286610ac5565b95945050505050565b61068d8383835f610b09565b6105a35761069e83835f6001610b09565b6106c657604051635274afe760e01b81526001600160a01b0384166004820152602401610119565b6106d38383836001610b09565b6105a357604051635274afe760e01b81526001600160a01b0384166004820152602401610119565b604080516003808252608082019092525f9160208201606080368337019050506040516370a0823160e01b81523060048201529091505f906001600160a01b038716906370a0823190602401602060405180830381865afa158015610762573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107869190612b0b565b905080156107a2576107a26001600160a01b0387163383610b6b565b5f6107ad8287610b78565b50905080835f815181106107c3576107c36129f8565b602090810291909101015250506040516370a0823160e01b81523060048201525f906001600160a01b038516906370a0823190602401602060405180830381865afa158015610814573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108389190612b0b565b90508015610854576108546001600160a01b0385163383610b6b565b5f61085f8285610b78565b5090508083600181518110610876576108766129f8565b6020908102919091010152504790508015610895576108953382610bb9565b5f6108a1826012610b78565b50905080836002815181106108b8576108b86129f8565b602090810291909101015250506040805160018082528183019092525f91816020015b6040805160a0810182525f91810182815260608083019390935260808201839052815260208101919091528152602001906001900390816108db57905050905086815f8151811061092e5761092e6129f8565b60200260200101819052506109438282610c30565b50505050505050565b5f805f838060200190518101906109639190612b22565b919450925090506001600160a01b038316610991576040516398521dc560e01b815260040160405180910390fd5b6001600160a01b0382166109b85760405163456ac4c360e11b815260040160405180910390fd5b6109cd6001600160a01b038616845f19610681565b6109e16001600160a01b0383168247610c45565b5061052d6001600160a01b038616845f610681565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0054600203610a3857604051633ee5aeb560e01b815260040160405180910390fd5b565b73200e12d10bb0c5e4a17e7018f0f1161919bb93893b1580610a91575073200e12d10bb0c5e4a17e7018f0f1161919bb93893f7f1de7d717526cba131d684e312dedbf0852adef9cced9e36798ae4937f7145d4114155b15610a38576040516373e6d7b360e01b815273200e12d10bb0c5e4a17e7018f0f1161919bb93896004820152602401610119565b5f805f610ad3868686610cf3565b9150915080610afe5760405162bc8ecf60e31b81526004810187905260248101869052604401610119565b5090505b9392505050565b60405163095ea7b360e01b5f8181526001600160a01b038616600452602485905291602083604481808b5af1925060015f51148316610b5f578383151615610b53573d5f823e3d81fd5b5f873b113d1516831692505b60405250949350505050565b6106d38383836001610e65565b5f805f805f610b878787610eaf565b9250925092505f80610b998585610f0b565b9150915081838015610ba85750815b9650965050505050505b9250929050565b80471015610be35760405163cf47918160e01b815247600482015260248101829052604401610119565b610bfc828260405180602001604052805f815250611154565b15610c05575050565b3d15610c1757610c13611169565b5050565b60405163d6bda27560e01b815260040160405180910390fd5b610c13610c3e600784611174565b825f6111d6565b606081471015610c715760405163cf47918160e01b815247600482015260248101839052604401610119565b5f610c7d858486611154565b9050808015610c9e57505f3d1180610c9e57505f856001600160a01b03163b115b15610cb357610cab61148a565b915050610b02565b8015610cdd57604051639996b31560e01b81526001600160a01b0386166004820152602401610119565b3d15610c1757610ceb611169565b509392505050565b5f805f851215610d2057604051634a7d166b60e01b81526004810186905260248101859052604401610119565b845f03610d3257505f90506001610e5d565b8460ff8416850185811215610d6d5760405163c849483b60e01b8152600481018890526024810187905260ff86166044820152606401610119565b5f805f831215610db957604c19831215610d90575f809550955050505050610e5d565b825f03600a0a9150818481610da757610da7612bbd565b0495505084029091149150610e5d9050565b5f831315610e5257604d831315610df65760405163c849483b60e01b8152600481018a90526024810189905260ff88166044820152606401610119565b82600a0a9150815f1981610e0c57610e0c612bbd565b04841115610e405760405163c849483b60e01b8152600481018a90526024810189905260ff88166044820152606401610119565b5091909102925060019150610e5d9050565b509193506001925050505b935093915050565b60405163a9059cbb60e01b5f8181526001600160a01b038616600452602485905291602083604481808b5af1925060015f51148316610b5f578383151615610b53573d5f823e3d81fd5b5f808060ff841681037f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff861115610efa57600a860460018201600a88065f1493509350935050610f04565b8593509150600190505b9250925092565b5f808383601b82900b821480611041577d90e40fbeea1d3a4abc8955e946fe31cdcf66f634e1000000000000000000870515610f8c577f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee8000000000000000000870515610f7d576305f5e10087059650600886019550610f8c565b620186a0870596506005860195505b8687601b0b14610fa757600a87059650856001019550610f8c565b7b0ccccccccccccccccccccccccccccccccccccccccccccccccccccccc7b199999999999999999999999999999999999999999999999999999988882011161103b575f600188039050808160030b036110395760e01b6001600160e01b037b7fffffffffffffffffffffffffffffffffffffffffffffffffffffff60ff8b901d18161795505f9450610bb29350505050565b505b50611058565b865f0361105857505f935060019250610bb2915050565b858660030b1461110f575f8213156110b75761107483836114a3565b1561109c5760405163d556b11160e01b81526004810184905260248101839052604401610119565b637ffffffe19909501600a0a82029550637fffffff9461110f565b637fffffff1986900360438113156110d957505f9450849350610bb292505050565b80600a0a88816110eb576110eb612bbd565b059750875f0361110557505f9450849350610bb292505050565b50637fffffff1995505b81861361111f5760019350611138565b818603600a0a838161113357611133612bbd565b071593505b5050506001600160e01b03841660e084901b1791509250929050565b5f805f83516020850186885af1949350505050565b6040513d5f823e3d81fd5b60408051600780825261010082019092526060915f9190816020015b606081526020019060019003908161119057905050905082816111b4600187612bd1565b815181106111c4576111c46129f8565b60209081029190910101529392505050565b60408051600780825261010082019092525f91816020015b60608152602001906001900390816111ee5790505090505f5b845181101561124f57848181518110611222576112226129f8565b602002602001015182828151811061123c5761123c6129f8565b6020908102919091010152600101611207565b50335f8181523060209081526040808320815160a0810183528083018581526060808301879052608083018190529082528185015282518581529384018581528484019093529093909291905b885181101561147e578881815181106112b7576112b76129f8565b602002602001015193505f845f015160400151511115611476575f6112e08886602001516114be565b90508861135357611335815f815181106112fc576112fc6129f8565b60200260200101515f81518110611315576113156129f8565b602002602001015160408051600181526020810192909252818101905290565b815f81518110611347576113476129f8565b60200260200101819052505b8451516040805160e08101825287516020908101516001600160a01b0390811683529082018a90528851830151828401525f606083018190526080830186905260a0830189905260c08301889052925163d04dfe2360e01b81529293169163d04dfe23916113c391600401612c3b565b5f60405180830381865afa1580156113dd573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526114049190810190612d33565b9150505f815111156114735785516020015160405163012c676d60e21b81526001600160a01b03909116906304b19db490611445908b908590600401612ddf565b5f604051808303815f87803b15801561145c575f80fd5b505af115801561146e573d5f803e3d5ffd5b505050505b50505b60010161129c565b50505050505050505050565b6040513d81523d5f602083013e3d602001810160405290565b5f610b025f84126114b457836114b8565b835f035b836117a0565b60605f825167ffffffffffffffff8111156114db576114db611bc8565b604051908082528060200260200182016040528015611504578160200160208202803683370190505b5090505f80845111611516575f61151c565b83516001015b85516001010190505f8167ffffffffffffffff81111561153e5761153e611bc8565b60405190808252806020026020018201604052801561157157816020015b606081526020019060019003908161155c5790505b5090505f611595604080516002815233602082015230818301526060810190915290565b8282815181106115a7576115a76129f8565b60200260200101819052505f5b87518110156116045781806001019250508781815181106115d7576115d76129f8565b60200260200101518383815181106115f1576115f16129f8565b60209081029190910101526001016115b4565b5085511561179657808060010191505083828281518110611627576116276129f8565b60200260200101819052505f5b8651811015611794576116e3878281518110611652576116526129f8565b60200260200101515f01516116c061168e8a8581518110611675576116756129f8565b6020026020010151602001518051602090810291012090565b7f19457468657265756d205369676e6564204d6573736167653a0a3332000000005f908152601c91909152603c902090565b8984815181106116d2576116d26129f8565b60200260200101516040015161183e565b61170357604051630a57f30960e31b815260048101829052602401610119565b868181518110611715576117156129f8565b60200260200101515f01516001600160a01b03165f1b85828151811061173d5761173d6129f8565b6020026020010181815250508180600101925050868181518110611763576117636129f8565b602002602001015160200151838381518110611781576117816129f8565b6020908102919091010152600101611634565b505b5095945050505050565b5f637ffffff582136117b357505f6100e1565b637ffffffe19820160438113156117ce5750508115156100e1565b5f811261180e5780600a0a7b800000000000000000000000000000000000000000000000000000018161180357611803612bbd565b0484119150506100e1565b805f03600a0a7b800000000000000000000000000000000000000000000000000000020284101591505092915050565b5f836001600160a01b03163b5f0361189c575f8061185c85856118ae565b5090925090505f81600381111561187557611875612dff565b1480156118935750856001600160a01b0316826001600160a01b0316145b92505050610b02565b6118a78484846118f4565b9050610b02565b5f805f83516041036118e5576020840151604085015160608601515f1a6118d788828585611959565b955095509550505050610f04565b505081515f9150600290610f04565b805160408051630b135d3f60e11b8082526004820186905260248201929092525f92906020820185604483015e5f82606483010152601f820160051c60051b915060205f60648401838a5afa9050825f5114601f3d1116811693505050509392505050565b5f80807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a084111561199257505f91506003905082611a17565b604080515f808252602082018084528a905260ff891692820192909252606081018790526080810186905260019060a0016020604051602081039080840390855afa1580156119e3573d5f803e3d5ffd5b5050604051601f1901519150506001600160a01b038116611a0e57505f925060019150829050611a17565b92505f91508190505b9450945094915050565b5f60208284031215611a31575f80fd5b81356001600160e01b031981168114610b02575f80fd5b6001600160a01b0381168114610218575f80fd5b8035611a6781611a48565b919050565b5f8083601f840112611a7c575f80fd5b50813567ffffffffffffffff811115611a93575f80fd5b602083019150836020828501011115610bb2575f80fd5b5f805f805f8060a08789031215611abf575f80fd5b8635611aca81611a48565b95506020870135611ada81611a48565b94506040870135935060608701359250608087013567ffffffffffffffff811115611b03575f80fd5b611b0f89828a01611a6c565b979a9699509497509295939492505050565b5f805f805f60808688031215611b35575f80fd5b8535611b4081611a48565b9450602086013567ffffffffffffffff80821115611b5c575f80fd5b9087019060c0828a031215611b6f575f80fd5b90945060408701359080821115611b84575f80fd5b611b9089838a01611a6c565b90955093506060880135915080821115611ba8575f80fd5b50860160408189031215611bba575f80fd5b809150509295509295909350565b634e487b7160e01b5f52604160045260245ffd5b6040516060810167ffffffffffffffff81118282101715611bff57611bff611bc8565b60405290565b6040805190810167ffffffffffffffff81118282101715611bff57611bff611bc8565b6040516080810167ffffffffffffffff81118282101715611bff57611bff611bc8565b60405160a0810167ffffffffffffffff81118282101715611bff57611bff611bc8565b60405160c0810167ffffffffffffffff81118282101715611bff57611bff611bc8565b604051601f8201601f1916810167ffffffffffffffff81118282101715611cba57611cba611bc8565b604052919050565b8015158114610218575f80fd5b8035611a6781611cc2565b5f67ffffffffffffffff821115611cf357611cf3611bc8565b5060051b60200190565b5f67ffffffffffffffff821115611d1657611d16611bc8565b50601f01601f191660200190565b5f82601f830112611d33575f80fd5b8135611d46611d4182611cfd565b611c91565b818152846020838601011115611d5a575f80fd5b816020850160208301375f918101602001919091529392505050565b5f60608284031215611d86575f80fd5b611d8e611bdc565b90508135611d9b81611a48565b81526020820135611dab81611a48565b6020820152604082013567ffffffffffffffff811115611dc9575f80fd5b611dd584828501611d24565b60408301525092915050565b5f82601f830112611df0575f80fd5b81356020611e00611d4183611cda565b82815260069290921b84018101918181019086841115611e1e575f80fd5b8286015b84811015611e645760408189031215611e39575f80fd5b611e41611c05565b8135611e4c81611a48565b81528185013585820152835291830191604001611e22565b509695505050505050565b5f82601f830112611e7e575f80fd5b81356020611e8e611d4183611cda565b82815260059290921b84018101918181019086841115611eac575f80fd5b8286015b84811015611e6457803567ffffffffffffffff80821115611ecf575f80fd5b908801906060828b03601f19011215611ee6575f80fd5b611eee611bdc565b86830135611efb81611a48565b815260408381013583811115611f0f575f80fd5b8401603f81018d13611f1f575f80fd5b88810135611f2f611d4182611cda565b81815260059190911b82018301908a8101908f831115611f4d575f80fd5b928401925b82841015611f6b5783358252928b0192908b0190611f52565b858c0152505050606084013583811115611f83575f80fd5b611f918d8a83880101611d24565b918301919091525085525050918301918301611eb0565b5f82601f830112611fb7575f80fd5b81356020611fc7611d4183611cda565b82815260059290921b84018101918181019086841115611fe5575f80fd5b8286015b84811015611e6457803567ffffffffffffffff80821115612008575f80fd5b90880190601f196080838c0382011215612020575f80fd5b612028611c28565b8784013583811115612038575f80fd5b840160a0818e038401121561204b575f80fd5b612053611c4b565b9250612060898201611a5c565b8352604081013584811115612073575f80fd5b6120818e8b83850101611d76565b8a8501525060608082013585811115612098575f80fd5b6120a68f8c83860101611de1565b6040860152506080820135858111156120bd575f80fd5b6120cb8f8c83860101611de1565b828601525060a0820135608085015283835260408601358a8401528086013560408401526080860135935084841115612102575f80fd5b6121108e8b86890101611e6f565b90830152508652505050918301918301611fe9565b5f8060408385031215612136575f80fd5b823567ffffffffffffffff8082111561214d575f80fd5b9084019060c08287031215612160575f80fd5b612168611c6e565b82358152602083013560208201526040830135604082015261218c60608401611ccf565b60608201526080830135828111156121a2575f80fd5b6121ae88828601611fa8565b60808301525060a0830135828111156121c5575f80fd5b6121d188828601611d24565b60a083015250935060208501359150808211156121ec575f80fd5b506121f985828601611d24565b9150509250929050565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b5f815180845260208085019450602084015f5b8381101561227457815180516001600160a01b031688528301518388015260409096019590820190600101612244565b509495945050505050565b5f815180845260208085019450602084015f5b8381101561227457815187529582019590820190600101612292565b5f82825180855260208086019550808260051b8401018186015f5b8481101561233157601f19868403018952815160606001600160a01b0382511685528582015181878701526123008287018261227f565b9150506040808301519250858203818701525061231d8183612203565b9a86019a94505050908301906001016122c9565b5090979650505050505050565b5f602080835260e08301845182850152818501516040818187015280870151915060608281880152808801519250608083151560808901526080890151935060a060c060a08a01528585518088526101009750878b019150878160051b8c010189880197505f5b8281101561248d578c820360ff190184528851805187845280516001600160a01b03908116898601528d82015188860189905280518216610120870152808f01519091166101408601528a015161016085018a9052612408610180860182612203565b90508a820151607f19808784030160c08801526124258383612231565b92508b8401519150808784030160e0880152506124428282612231565b915050888201518d8601528d8301518e8601528a8301518b8601528983015192508481038a86015261247481846122ae565b9b8e019b968e01969450505060019190910190506123a5565b5060a08d01518c8203601f190160c08e015299506124ab818b612203565b9d9c50505050505050505050505050565b5f80604083850312156124cd575f80fd5b505080516020909101519092909150565b5f604082360312156124ee575f80fd5b6124f6611c05565b823567ffffffffffffffff8082111561250d575f80fd5b61251936838701611d76565b8352602085013591508082111561252e575f80fd5b5061253b36828601611e6f565b60208301525092915050565b5f808335601e1984360301811261255c575f80fd5b83018035915067ffffffffffffffff821115612576575f80fd5b6020019150600581901b3603821315610bb2575f80fd5b5f6020828403121561259d575f80fd5b8135610b0281611cc2565b5f808335601e198436030181126125bd575f80fd5b830160208101925035905067ffffffffffffffff8111156125dc575f80fd5b8060051b3603821315610bb2575f80fd5b5f8235605e19833603018112612601575f80fd5b90910192915050565b5f808335601e1984360301811261261f575f80fd5b830160208101925035905067ffffffffffffffff81111561263e575f80fd5b803603821315610bb2575f80fd5b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b5f808335601e19843603018112612689575f80fd5b830160208101925035905067ffffffffffffffff8111156126a8575f80fd5b8060061b3603821315610bb2575f80fd5b8183525f60208085019450825f5b858110156122745781356126da81611a48565b6001600160a01b031687528183013583880152604096870196909101906001016126c7565b8183526020808401935f91600585811b8301820185855b888110156127d857858303601f19018a5261273182896125ed565b6060813561273e81611a48565b6001600160a01b03168552612755828801836125a8565b82898801528083880152608092507f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81111561278f575f80fd5b871b8082888501378601905060406127a98482018561260a565b94508388840301828901526127c1848401868361264c565b9e8a019e9750505093870193505050600101612716565b509098975050505050505050565b5f604080835261010080840187358386015260206060818a013581880152848a01356080880152808a013561281a81611cc2565b151560a088015261282e60808b018b6125a8565b60c0898101529384905261012093848901600582901b8a018601835f5b848110156129a8578c830361011f19018452813536879003607e19018112612871575f80fd5b8601803536829003609e19018112612887575f80fd5b608085528101803561289881611a48565b6001600160a01b0380821660808801526128b48c8401846125ed565b915060a08088015281356128c781611a48565b8116878e0152818c01356128da81611a48565b166101408701526128ed818f018261260a565b91508a6101608801526129056101808801838361264c565b9150506129148e830183612674565b607f19808985030160c08a015261292c8483856126b9565b935061293a8d860186612674565b93509150808985030160e08a0152506129548383836126b9565b9250505060808201358d8701528a8301358b8701528d8301358e87015261297d8a8401846125a8565b935091508581038a8701526129938184846126ff565b968b019695505050918801915060010161284b565b50506129b760a08f018f61260a565b8c8303603f190160e08e0152995097506129d2818a8a61264c565b98505050505050858403818701525050506129ee81858761264c565b9695505050505050565b634e487b7160e01b5f52603260045260245ffd5b5f8235607e19833603018112612a20575f80fd5b9190910192915050565b5f8235609e19833603018112612a20575f80fd5b5f808335601e19843603018112612a53575f80fd5b83018035915067ffffffffffffffff821115612a6d575f80fd5b6020019150600681901b3603821315610bb2575f80fd5b5f60208284031215612a94575f80fd5b8135610b0281611a48565b5f6001600160a01b038087168352808616602084015250836040830152608060608301526129ee6080830184612203565b5f60208284031215612ae0575f80fd5b8151610b0281611cc2565b5f60208284031215612afb575f80fd5b815160ff81168114610b02575f80fd5b5f60208284031215612b1b575f80fd5b5051919050565b5f805f60608486031215612b34575f80fd5b8351612b3f81611a48565b6020850151909350612b5081611a48565b604085015190925067ffffffffffffffff811115612b6c575f80fd5b8401601f81018613612b7c575f80fd5b8051612b8a611d4182611cfd565b818152876020838501011115612b9e575f80fd5b8160208401602083015e5f602083830101528093505050509250925092565b634e487b7160e01b5f52601260045260245ffd5b818103818111156100e157634e487b7160e01b5f52601160045260245ffd5b5f8282518085526020808601955060208260051b840101602086015f5b8481101561233157601f19868403018952612c2983835161227f565b98840198925090830190600101612c0d565b602081526001600160a01b038251166020820152602082015160408201525f604083015160e06060840152612c74610100840182612203565b9050606084015160808401526080840151601f19808584030160a0860152612c9c8383612bf0565b925060a08601519150808584030160c0860152612cb9838361227f565b925060c08601519150808584030160e086015250610678828261227f565b5f82601f830112612ce6575f80fd5b81516020612cf6611d4183611cda565b8083825260208201915060208460051b870101935086841115612d17575f80fd5b602086015b84811015611e645780518352918301918301612d1c565b5f8060408385031215612d44575f80fd5b825167ffffffffffffffff80821115612d5b575f80fd5b818501915085601f830112612d6e575f80fd5b81516020612d7e611d4183611cda565b82815260059290921b84018101918181019089841115612d9c575f80fd5b948201945b83861015612dba57855182529482019490820190612da1565b91880151919650909350505080821115612dd2575f80fd5b506121f985828601612cd7565b828152604060208201525f612df7604083018461227f565b949350505050565b634e487b7160e01b5f52602160045260245ffd"; /// @dev What MUST already be on a network before this release can be /// broadcast there: an address, and the runtime code that belongs at it. diff --git a/src/generated/candidate/RaindexV6.sol b/src/generated/candidate/RaindexV6.sol index 2fcc1e428a..dcecedf292 100644 --- a/src/generated/candidate/RaindexV6.sol +++ b/src/generated/candidate/RaindexV6.sol @@ -5,19 +5,19 @@ pragma solidity ^0.8.25; // THIS FILE IS AUTOGENERATED BY THE BUILD SCRIPT. DO NOT EDIT BY HAND. /// @dev Hash of the known bytecode. -bytes32 constant BYTECODE_HASH = bytes32(0x97f7a52369f3954c476b9c12c5d28c5a936d581b949cf38d0209d1516fd571cc); +bytes32 constant BYTECODE_HASH = bytes32(0x38f065eeedcc6a954eb53c47402578314e06a5b9a1d6f275e685e68f3fb3cbd4); /// @dev The deterministic deploy address of the contract when deployed via /// the Zoltu factory. -address constant DEPLOYED_ADDRESS = address(0x834E1DA0D2e04ab48f9EFa6a7B9bbDb6FF62839e); +address constant DEPLOYED_ADDRESS = address(0xd31af42aafee144967bE4B5688ecF09592258d7B); /// @dev The creation bytecode of the contract. bytes constant CREATION_CODE = - hex"6080806040523460395760017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00556150f5908161003e8239f35b5f80fdfe6080806040526004361015610012575f80fd5b5f3560e01c90816301ffc9a7146117cc575080631f69cb751461156f5780632cb77e9f146115435780632fbc4ba0146113f957806341d1514f146113c25780635cffe9de1461126657806360746119146110e2578063613255ab1461105f57806369c7285614610771578063709fb8a5146104375780639235084d146103e3578063ac9650d814610295578063d7e442ec14610237578063d9d98ce4146101865763fa501182146100c1575f80fd5b34610182576101403660031901126101825767ffffffffffffffff600435818111610182576100f4903690600401611b61565b6024358281116101825761010c903690600401611b61565b60c0366043190112610182576101043583811161018257610131903690600401611d07565b90610124359384116101825761014e61015c943690600401611d07565b9261015761264d565b61222d565b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055005b5f80fd5b34610182576040366003190112610182576001600160a01b036101a7611850565b166040516370a0823160e01b8152306004820152602081602481855afa90811561022c575f916101fa575b50156101e25760206040515f8152f35b60249060405190633c5bf76960e21b82526004820152fd5b90506020813d602011610224575b81610215602093836119d0565b810103126101825751826101d2565b3d9150610208565b6040513d5f823e3d90fd5b346101825760203660031901126101825760043567ffffffffffffffff81116101825761028f61026e61015c92369060040161181f565b919061027861264d565b60405192610285846119b4565b5f84523691611ddb565b90612ae5565b34610182576020806003193601126101825760043567ffffffffffffffff8111610182576102c790369060040161181f565b9190604051926102d6846119b4565b5f84528284016102e582611ab4565b946102f360405196876119d0565b8286526102ff83611ab4565b9361031186880195601f190186612211565b5f5b84811061037557604080518881528951818a018190525f92600582901b83018101918a918c9085015b8287106103495785850386f35b909192938280610365600193603f198a820301865288516118dc565b960192019601959291909261033c565b806103c4886103be61039160019560059d9c9d1b8701876120f1565b929089846040519586938585013782018381015f81528b519283915e015f838201520380845201826119d0565b30613965565b6103ce828a611fd7565b526103d98189611fd7565b5001969596610313565b3461018257600319602036820112610182576004359067ffffffffffffffff821161018257608090823603011261018257610422606091600401612139565b90604051921515835260208301526040820152f35b34610182576003196040368201126101825760043567ffffffffffffffff8082116101825760c082600401938336030112610182576024359081116101825761048490369060040161181f565b9061048d61264d565b6104be6104b96104b46104ad6104a38880612124565b60408101906120f1565b36916119f2565b6138fb565b613950565b801561075f576001101561074d57602483016104da8186611f44565b90501561073b5760448401946104f08682611f44565b9050156107295761055661051e9661054a61051561050e8580612124565b9585611f44565b99909285611f44565b91909261053b6040519761053189611900565b3389523690611a56565b9a60209b8c8901523691611acc565b60408601523691611acc565b60608301526064850135608083015261056e8261268f565b91825f525f875260405f209586541596876105b2575b888860017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055604051908152f35b6001905560a46001600160a01b03917f87491344dfbcf91f6cbbc610cbbeedc85313d37a02df0c93527f7ea5f8db717f83855116604051908152878c8201526060604082015280610606606082018861203f565b0390a1019161061583856120f1565b9050610679575b5050505061066d929161066561064e61028f933390919060405192600284526020840152604083015260608201604052565b906040519160018352602083015260408201604052565b923691611ddb565b82808080808080610584565b6106866104ad84866120f1565b61068f816146ec565b156107025750937fd46c2c56b35c8210e9e712ec3f02242d5fc90187c0ac8ed80cc33626846ec3698961066d9897956106f56106d86106659761064e9761028f9b5116936120f1565b866040519586958652850152606060408501526060840191611d36565b0390a1938395965061061c565b89610725604051928392630c89984b60e31b8452600484015260248301906118dc565b0390fd5b60405163540e5f0b60e01b8152600490fd5b604051636c44ef8f60e01b8152600490fd5b604051633c8270bd60e21b8152600490fd5b604051632cff108b60e21b8152600490fd5b34610182576003196020368201126101825767ffffffffffffffff600435116101825760c09060043536030112610182576107aa61264d565b5f80806107bf60048035608481019101611e8d565b90501561104d5760246004350135926107d7846126f4565b1561103b576060806040516107eb81611968565b6107f3611ee2565b81525f60208201525f6040820152015261080b611ee2565b5061086b61086661084561083b61083561082f608460043501600435600401611e8d565b90611f14565b80611f2f565b6040810190611f44565b602061085e61082f608460043501600435600401611e8d565b013591611f7a565b611d22565b936001600160a01b036108ba6108666108a161089761083561082f608460043501600435600401611e8d565b6060810190611f44565b604061085e61082f608460043501600435600401611e8d565b81604051976108c889611930565b16875216602086015260408501526108ea608460043501600435600401611e8d565b9490506001604051950160051b85016040525f905f5b610914608460043501600435600401611e8d565b9050811080611028575b15610e7557610937608460043501600435600401611e8d565b821015610e61578160051b810135607e1982360301811215610182576080818301360312610182576040519161096c83611968565b8181013567ffffffffffffffff81116101825761098e90369084840101611b61565b835280820160208181013590850152604080820135908501526060013567ffffffffffffffff8111610182576109c79236920101611d07565b606082015280516001600160a01b036109e96040830151602085015190611fd7565b5151166001600160a01b0385511614801590610e2d575b610e1b57610a18602083015160408401519083613035565b610a218161268f565b91825f525f60205260405f2054155f14610a85575051604080513381526001600160a01b039092166020830152810191909152600191907fb70c12fa453793fa6818ec07c91e74363a47aa6a6829dcd9533937fdf30314f390606090a15b01610900565b9190610ab6602084979597015160408501519060608601519060405192610aab846119b4565b5f845233918661307c565b925f93610ace60608201516044600435013590612717565b15610b3557505051604080513381526001600160a01b03909216602083015281019190915260019291907fe3151dc8cb7a54ffc4baabd28c1f241c94d510b5e5b502491ac3cad6c16316d590606090a15b8115610b2d575b5092610a7f565b905088610b26565b610b4260408201516126f4565b158015610e08575b15610b9f57505051604080513381526001600160a01b03909216602083015281019190915260019291907f500b713857325f9e6dcb52ae832eca9109d107ed1aae9cb4928b4c1e13f051aa90606090a1610b1f565b9250925050600196959691610bb8606460043501611feb565b15610d755796610c2897610c3860408401516040880151610bd981836133d5565b15610d6d5750925b610c32848592610c1b610c1560608a01516001600160e01b03601b918660e01d92828816810b928260e01d9216900b613da5565b90613f60565b9d8e9260408d01516134a0565b60408c01526134ca565b996134ca565b98610c4384846134f4565b610c4d8482613552565b60405192338452608060208501526060610c73845160808088015261010087019061203f565b93602081015160a0870152604081015160c0870152015192607f198582030160e0860152835180825260208201906020808260051b8501019601925f5b828110610d0f57505050505092806001979695937f194f1feb3b4d7076a2c272e774e792e0c48bb8c7aa1a9a3671c1cd6da9e6b4c193610d0a96604084015260608301520390a180858c5101808d5260051b8c0152613664565b610b1f565b9091929396602080610d60600193601f198782030189528b51906001600160a01b0382511681526040610d4f8584015160608785015260608401906120be565b9201519060408184039101526118dc565b9901950193929101610cb0565b905092610be1565b610c2890610c386060840151610c32610db3610c1560408801516001600160e01b0394601b90868360e01d9316820b91878260e01d9216900b613da5565b60408a0151610dc281836133d5565b15610e005750915b829c8d916060890151908116155f14610df1575060408801515b96879460408d01516134a0565b610dfb90856133fc565b610de4565b905091610dca565b50610e1660608201516133b2565b610b4a565b60405163936bb5ad60e01b8152600490fd5b506001600160a01b03610e496060830151604085015190611fd7565b5151166001600160a01b036020860151161415610a00565b634e487b7160e01b5f52603260045260245ffd5b50919390610e87606460043501611feb565b1561102257835b6004356004013590610ea082826133d5565b6110045750508490610ec0856001600160a01b0360208701511633612fcc565b505060a46004350190610ed8826004356004016120f1565b905015159081610ffc575b50610f5b575b506001600160a01b03610eff929351163361273e565b50505b8351811015610f275780610f21610f1b60019387611fd7565b5161383d565b01610f02565b5060409160017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f005582519182526020820152f35b90506001600160a01b03602084015116610f856001600160a01b03855116926004356004016120f1565b929091333b1561018257610fcd5f93604051958694859463691f9ed760e01b8652600486015260248501528960448501528a606485015260a0608485015260a4840191611d36565b038183335af190811561022c57859115610ee9579050610fed9150611984565b5f836001600160a01b03610ee9565b905088610ee3565b604492506040519163573b6f4160e01b835260048301526024820152fd5b84610e8e565b5061103660408301516126f4565b61091e565b60405163315f9e2360e21b8152600490fd5b604051639c95219f60e01b8152600490fd5b3461018257602080600319360112610182576024816001600160a01b03611084611850565b16604051928380926370a0823160e01b82523060048301525afa90811561022c575f916110b5575b50604051908152f35b90508181813d83116110db575b6110cc81836119d0565b810103126101825751826110ac565b503d6110c2565b34610182576110f036611890565b92916110fd94919461264d565b6111088383336126c0565b611111816126f4565b15611235578160ff91611129856111ec969533612cff565b61113381836133d5565b1561122f575080935b61114885828533612f6e565b917f8045c25080b0868951141ed0a91720bcad09a8364a2b3109ee1fd49c1f0bc8b860c0611177898833612fcc565b97906001600160a01b0360405192338452169a8b6020840152856040840152886060840152608083015260a0820152a16040519660068852602088015260408701526060860152608085015260a08401521660c082015260e08101604052906040519160018352602083015260408201604052565b90806112185760017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055005b6112279261028f913691611ddb565b80808061015c565b9361113c565b50604051623a3a4d60e21b81523360048201526001600160a01b039190911660248201526044810191909152606490fd5b34610182576080366003190112610182576004356001600160a01b039081811680910361018257611295611866565b6044359167ffffffffffffffff916064358381116101825736602382011215610182578060040135938411610182573660248583010111610182576113229560209216936112e4868587612e8f565b60405196879283926323e30c8b60e01b84523360048501528760248501528860448501525f606485015260a06084850152602460a485019201611d36565b03815f855af193841561022c575f9461138e575b507f439148f0bbc682ca079e46d6e2c2f0c1e3b820f1a291b069d8882abf8cf18dd984036113755761136a93503091612f08565b602060405160018152f35b604051630b6c58a960e31b815260048101859052602490fd5b9093506020813d6020116113ba575b816113aa602093836119d0565b8101031261018257519284611336565b3d915061139d565b346101825760603660031901126101825760206113f16113e0611850565b6113e8611866565b60443591612cff565b604051908152f35b346101825761140736611890565b9280949261141361264d565b61141e8285336126c0565b611427816126f4565b15611513578061143b61148a92863361273e565b9790957f7f9dfa19cf1cc2f806f2f860fbc9c056b601fb1afc0e9b843dfe5c63616268e660806040513381526001600160a01b038416998a60208301528560408301526060820152a1336127e4565b939091856114b85760017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055005b6115079661028f956106659460ff93604051956005875260208701526040860152606085015260808401521660a082015260c08101604052906040519160018352602083015260408201604052565b8080808080808061015c565b506040516306dde9c360e41b81523360048201526001600160a01b03841660248201526044810191909152606490fd5b34610182576020366003190112610182576004355f525f6020526020600160405f205414604051908152f35b34610182576003196040368201126101825767ffffffffffffffff9060043582811161018257806004019160a08236039182011261018257602435848111610182576115bf90369060040161181f565b90936115c961264d565b5f946001600160a01b0394856115de84611d22565b1633036117aa576115f76115f23685611b61565b61268f565b805f525f60205260405f2096600188541461163e575b60208960017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00556040519015158152f35b9091929394959697505f6001985560405196338852826020890152606060408901528161166a8761187c565b166060890152602484013590606219018112156101825783019060a06080890152806116986004840161187c565b166101008901526116ab6024830161187c565b16610120880152604481013560221982360301811215610182570190602460048301359201988211610182578136038913610182577f09d18501db0080ca2d6cd7c17fa7255daff4b2d503ea93b76ff68b6752ea8e63878061066595608461177361028f9a60209f6117329061179d9f9a606061014061064e9d0152610160880191611d36565b6117646117596117456044880185611d56565b605f198a8603810160a08c01529491611d8b565b926064870190611d56565b918784030160c0880152611d8b565b91013560e08301520390a13390919060405192600284526020840152604083015260608201604052565b828080808080808061160d565b6024866117b685611d22565b6040516335252be360e01b815291166004820152fd5b34610182576020366003190112610182576004359063ffffffff60e01b82168092036101825760209163e414309160e01b811490811561180e575b5015158152f35b6301ffc9a760e01b14905083611807565b9181601f840112156101825782359167ffffffffffffffff8311610182576020808501948460051b01011161018257565b600435906001600160a01b038216820361018257565b602435906001600160a01b038216820361018257565b35906001600160a01b038216820361018257565b906080600319830112610182576004356001600160a01b0381168103610182579160243591604435916064359067ffffffffffffffff8211610182576118d89160040161181f565b9091565b805180835260209291819084018484015e5f828201840152601f01601f1916010190565b60a0810190811067ffffffffffffffff82111761191c57604052565b634e487b7160e01b5f52604160045260245ffd5b6060810190811067ffffffffffffffff82111761191c57604052565b6040810190811067ffffffffffffffff82111761191c57604052565b6080810190811067ffffffffffffffff82111761191c57604052565b67ffffffffffffffff811161191c57604052565b60e0810190811067ffffffffffffffff82111761191c57604052565b6020810190811067ffffffffffffffff82111761191c57604052565b90601f8019910116810190811067ffffffffffffffff82111761191c57604052565b92919267ffffffffffffffff821161191c5760405191611a1c601f8201601f1916602001846119d0565b829481845281830111610182578281602093845f960137010152565b9080601f8301121561018257816020611a53933591016119f2565b90565b91906060838203126101825760405190611a6f82611930565b8193611a7a8161187c565b8352611a886020820161187c565b602084015260408101359167ffffffffffffffff831161018257604092611aaf9201611a38565b910152565b67ffffffffffffffff811161191c5760051b60200190565b929192611ad882611ab4565b604092611ae860405192836119d0565b819581835260208093019160061b84019381851161018257915b848310611b1157505050505050565b8583830312610182578386918251611b288161194c565b611b318661187c565b81528286013583820152815201920191611b02565b9080601f8301121561018257816020611a5393359101611acc565b91909160a0818403126101825760405190611b7b82611900565b8193611b868261187c565b835267ffffffffffffffff9160208101358381116101825782611baa918301611a56565b602085015260408101358381116101825782611bc7918301611b46565b6040850152606081013592831161018257611be86080939284938301611b46565b60608501520135910152565b909291611c0084611ab4565b916040611c1060405194856119d0565b839580855260208095019160059160051b8401948086116101825784935b868510611c3f575050505050505050565b67ffffffffffffffff90853582811161018257870190606082850312610182578451611c6a81611930565b611c738361187c565b81528a83013584811161018257830185601f8201121561018257803590611c9982611ab4565b91611ca6895193846119d0565b8083528d808401918b1b83010191888311610182578e809101915b838310611cf757509150508201528583013593841161018257611ce8858c95869501611a38565b86820152815201940193611c2e565b82358152918101918f9101611cc1565b9080601f8301121561018257816020611a5393359101611bf4565b356001600160a01b03811681036101825790565b908060209392818452848401375f828201840152601f01601f1916010190565b9035601e198236030181121561018257016020813591019167ffffffffffffffff8211610182578160061b3603831361018257565b9190808252602080920192915f905b828210611da8575050505090565b909192936001906001600160a01b03611dc08761187c565b16815285830135838201526040908101950193920190611d9a565b90929192611de881611ab4565b91604091611df960405194856119d0565b839581855260208095019160051b8301938185116101825783925b858410611e245750505050505050565b67ffffffffffffffff908435828111610182578601908382860312610182578351611e4e8161194c565b82358481116101825786611e63918501611a56565b81528983013593841161018257611e7e868b95869501611d07565b83820152815201930192611e14565b903590601e1981360301821215610182570180359067ffffffffffffffff821161018257602001918160051b3603831361018257565b60405190611ed082611930565b60606040835f81525f60208201520152565b60405190611eef82611900565b5f608083828152611efe611ec3565b6020820152606060408201526060808201520152565b9015610e6157803590607e1981360301821215610182570190565b903590609e1981360301821215610182570190565b903590601e1981360301821215610182570180359067ffffffffffffffff821161018257602001918160061b3603831361018257565b9190811015610e615760061b0190565b805115610e615760200190565b805160011015610e615760400190565b805160021015610e615760600190565b805160031015610e615760800190565b805160041015610e615760a00190565b8051821015610e615760209160051b010190565b3580151581036101825790565b9081518082526020808093019301915f5b828110612017575050505090565b835180516001600160a01b031686528201518583015260409094019392810192600101612009565b906080806120b56120a361209160406001600160a01b0380895116885260208901519060a060208a01528082511660a08a015260208201511660c08901520151606060e08801526101008701906118dc565b60408701518682036040880152611ff8565b60608601518582036060870152611ff8565b93015191015290565b9081518082526020808093019301915f5b8281106120dd575050505090565b8351855293810193928101926001016120cf565b903590601e1981360301821215610182570180359067ffffffffffffffff82116101825760200191813603831361018257565b903590605e1981360301821215610182570190565b6121506115f26121498380611f2f565b3690611b61565b5f525f602052600160405f2054036121ec5780612170816121dc93611f2f565b6121d461218f6121946020850135938460408701359384923690611b61565b613035565b6121ac6121a18580611f2f565b946060810190611e8d565b92906121cc604051966121be886119b4565b5f88525f3681373690611b61565b933691611bf4565b92339261307c565b6040810151606090910151600192565b505f905f905f90565b5f5b60808110612203575050565b6060828201526020016121f7565b5f5b82811061221f57505050565b606082820152602001612213565b9291926001600160a01b039081815116828451161461263b57606081018051908361225b6064358094611fd7565b515116906040968787015192866122756084358096611fd7565b5151161480159061260a575b6125f9578785015192866122986044358096611fd7565b515116876122a7878651611fd7565b515116146125e8576122b88661268f565b805f525f602052895f20541561259557506122d28861268f565b998a5f525f602052895f20541561253f57899a5087899a51958c6101203389528060208a01528801612304908b61203f565b888103828a0152612315908d61203f565b958260608a01528960808a01528560a08a01528360a4359d8e60c08c015260c4359a8b60e08201528060e4359a8b610100830152037f6fa7f4c28634b0a9d6831401c45ae468195fb63aed07308935c35374ff5d9e3991a1511691519161237b836119b4565b8a5f8452612389948d61307c565b975116908b5191612399836119b4565b8a5f84526123a7948d61307c565b958951976123b489611968565b5f895260208901995f8b528b8a01965f885260608b01965f88526123d88b8b614710565b8d5289528c6123e78b8d614710565b9091528089528c51906123f9916134a0565b918d518a51612407916134a0565b97612411846133b2565b8015612530575b61251e5789958f8f966124e59f9e9c8f976124e09f9b96978f7fd9fa84dd790c969daa5c33d8050dc06b4a9b59d5b42e2be5f5e8ae20447f618d9f9a60a09f9a8f996124a16124b99f9361249c868f976124a79f6124b09c60609f83879361249685612496946124a79f61249c9961249091516134f4565b516134f4565b51613552565b61383d565b51611fd7565b515116336127e4565b50500151611fd7565b50508a5191338352895160208401528a518c840152516060830152516080820152a1613664565b613664565b6001600160e01b0380915116159182612512575b50506125025750565b516321badf1f60e01b8152600490fd5b51161590505f806124f9565b508e51630d86822160e01b8152600490fd5b5061253a896133b2565b612418565b505095519651338152949096166001600160a01b031660208501525050506040810193909352507fb70c12fa453793fa6818ec07c91e74363a47aa6a6829dcd9533937fdf30314f391905080606081015b0390a1565b95519851338152969098166001600160a01b031660208701525050505060408201527fb70c12fa453793fa6818ec07c91e74363a47aa6a6829dcd9533937fdf30314f39350915081905060608101612590565b8851631cd2f1c760e21b8152600490fd5b875163936bb5ad60e01b8152600490fd5b508561261d606089015160a43590611fd7565b515116866126318a88015160443590611fd7565b5151161415612281565b604051630a98f1f360e21b8152600490fd5b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00600281541461267d5760029055565b604051633ee5aeb560e01b8152600490fd5b6040516126ba816126ac602082019460208652604083019061203f565b03601f1981018352826119d0565b51902090565b9091156126cb575050565b6040516305dbdfd960e41b81526001600160a01b03918216600482015291166024820152604490fd5b612713905f60e01d906001600160e01b038160e01d9116601b0b614773565b1290565b90612713916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b6147f4565b92919261274a82613a38565b93612754816133b2565b6127d25784816001600160e01b036127739360e01d9116601b0b614873565b92908093156127a9575b5082908161278d575b5050509190565b6127a1926001600160a01b03309216612f08565b5f8181612786565b9092505f1981146127be57600101915f61277d565b634e487b7160e01b5f52601160045260245ffd5b604051632eaefac360e21b8152600490fd5b939291936127f1836133b2565b61288f578461280d57612805939450612fcc565b50505f905f90565b6001600160a01b039392919380911694855f52602060018152604092835f20961695865f528152825f20825f52815261284a835f205494856134ca565b95612854876133b2565b612877575f97885260018252838820908852815282872091875252909320829055565b835163c5e12af560e01b815260048101889052602490fd5b60405163793a8f5560e01b815260048101849052602490fd5b919060408382031261018257825167ffffffffffffffff908181116101825784019082601f830112156101825781516020926128e382611ab4565b916128f160405193846119d0565b808352848084019160051b830101918683116101825785809101915b8383106129805750505050948281015191821161018257019180601f8401121561018257825161293c81611ab4565b9361294a60405195866119d0565b818552838086019260051b820101928311610182578301905b828210612971575050505090565b81518152908301908301612963565b825181529181019186910161290d565b90808251908181526020809101926020808460051b8301019501935f915b8483106129be5750505050505090565b90919293949584806129dc600193601f198682030187528a516120be565b98019301930191949392906129ae565b91906020928381526001600160a01b0382511684820152838201516040820152612a26604083015160e060608401526101008301906118dc565b9060608301516080820152612a4d608084015192601f1993848483030160a0850152612990565b9260a081015193838382030160c08401528680865192838152019501905f5b818110612a9057505050611a5394955060c060e091015192828503019101526120be565b825187529588019591880191600101612a6c565b90604082019082526020606081936040838201528551809452019301915f5b828110612ad1575050505090565b835185529381019392810192600101612ac3565b916040805191612af483611900565b60048084526020612b068186016121f5565b5f5b8751811015612b3b5780612b1e6001928a611fd7565b51612b298289611fd7565b52612b348188611fd7565b5001612b08565b5092955092939093335f52308352855f2091865190612b598261194c565b612b61611ec3565b8252606085819301528751612b75816119b4565b5f8152885191612b84836119b4565b5f83525f3681375f5b8151811015612cf257612ba08183611fd7565b5190888c8b84519189818401518d8d8251612bc8575b50505050505050506001915001612b8d565b5f612c3797948197948c9794612bf58c956001600160a01b039d8e81818d51169c0151169b015190613b17565b94865199612c028b611998565b8a528901528488015286015260808501528a60a08501528b60c08501525180958194829363d04dfe2360e01b845283016129ec565b03915afa938415612ce8578b915f95612cc2575b508451612c60575b50908b8e89838d8d612bb6565b51015116803b1561018257612c8f925f918c8f84905180978195829463012c676d60e21b845233908401612aa4565b03925af1918215612cb857600192612ca9575b8981612c53565b612cb290611984565b5f612ca2565b8c513d5f823e3d90fd5b612cdf9195503d805f833e612cd781836119d0565b8101906128a8565b9050935f612c4b565b8e513d5f823e3d90fd5b5050505050505050509050565b8215612d34576001600160a01b038091165f52600160205260405f2091165f5260205260405f20905f5260205260405f205490565b909150612d4082613d49565b6001600160a01b03809316906040918251946370a0823160e01b86528416938460048701526020928387602481865afa968715612e56575f97612e60575b5083612d97612d9083612dc79a614a28565b50906141b3565b508651636eb1769f60e11b81526001600160a01b0390941660048501523060248501529297889081906044820190565b0381865afa968715612e56575f97612e25575b50612d90612deb91611a5398614a28565b50612df681836133d5565b15612e1d5750935b5f5260018252825f20905f528152815f20905f8052525f2054906134ca565b905093612dfe565b96508387813d8311612e4f575b612e3c81836119d0565b8101031261018257955195612d90612dda565b503d612e32565b85513d5f823e3d90fd5b96508387813d8311612e88575b612e7781836119d0565b810103126101825795519583612d7e565b503d612e6d565b6040519263a9059cbb60e01b5f526001600160a01b0380931660045260245260205f60448180855af160015f5114811615612ee9575b8360405215612ed357505050565b635274afe760e01b835216600482015260249150fd5b6001811516612eff57813b15153d151616612ec5565b833d5f823e3d90fd5b9092604051936323b872dd60e01b5f526001600160a01b0393848092166004521660245260445260205f60648180855af160015f5114811615612f58575b836040525f60605215612ed357505050565b6001811516612eff57813b15153d151616612f46565b93929193612f7b836133b2565b61288f5784612f8f5761280593945061273e565b6001600160a01b039392919380911694855f52602060018152604092835f20961695865f528152825f20825f52815261284a835f205494856134a0565b90929192612fd981613a38565b93612fe3816133b2565b6130235784816001600160e01b036130029360e01d9116601b0b614873565b50809281613011575050509190565b6001600160a01b036127a19316612e8f565b604051632d1671a360e11b8152600490fd5b91613060906060613055936001600160a01b039485916040880151611fd7565b515116940151611fd7565b5151161461306a57565b604051631cd2f1c760e21b8152600490fd5b9491936132bb919360c0915f61324260409283519461309a86611998565b6130a2611ee2565b86526020958487820152848682015260609781868a809401528260808201528660a082015201526131f28551916130d883611900565b600483526130e78884016121f5565b8d6130f18161268f565b9c896001600160a01b039e8f94859182865116908d5194600386528501528c840152168c820152608081018a5261312786611f8a565b5261313185611f8a565b50885161313d81611930565b6002815289368c83013761315086611f97565b5261315a85611f97565b5060ff8a6131bd8b8501936131a78761318081613178858a51611fd7565b515116613d49565b9751168861318f848951611fd7565b5151168561319e858a51611fd7565b51015191612cff565b966131b3828751611fd7565b5151169451611fd7565b51015192169093929190604051946005865260208601526040850152606084015260808301525f60a083015260c08201604052565b6131fb82611fa7565b5261320581611fa7565b506132298a8d8d60ff8a6131bd8d8501936131a78761318081613178858a51611fd7565b61323282611fb7565b5261323c81611fb7565b50613b17565b95878a511697848b0191825191868184511693015116928a85523087528580862091510151865191613273836119b4565b86835287519561328287611998565b86528886015286850152848885015289608085015260a084015260c08301528351808098819463d04dfe2360e01b8352600483016129ec565b03915afa9687156133a8575f945f98613386575b5084516002811061336f575081838601519501516132f56132ef88611fc7565b51611fb7565b5161330081836133d5565b156133675750925b61332a8685919060405192600284526020840152604083015260608201604052565b61333388611fa7565b5261333d87611fa7565b5082519961334a8b611998565b8a52890152870152850152608084015260a083015260c082015290565b905092613308565b602490835190630fbb8e5560e21b82526004820152fd5b90975061339e9194503d805f833e612cd781836119d0565b939093965f6132cf565b50513d5f823e3d90fd5b6133d1905f60e01d906001600160e01b038160e01d9116601b0b614773565b1390565b906133d1916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b6147f4565b6134236001600160e01b0392838316601b0b9260e01d938160e01d9116601b0b8484613f6a565b90637ffffff58213613473575b9061343a916141b3565b929092158061346b575b61344d57505090565b6044925060405191638eba4d0760e01b835260048301526024820152fd5b508215613444565b61347d8282614e53565b1561343057604483856040519163d556b11160e01b835260048301526024820152fd5b611a5391610c15916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b6143b9565b611a5391610c15916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b61457d565b61354e91608081018261351061350a8351611fc7565b51611fc7565b526135476135416001600160a01b038094515116936135386135328551611fc7565b51611f8a565b51169251611fc7565b51611fa7565b5191612f6e565b5050565b9060808101918061356661350a8551611fb7565b526001600160a01b038092515116916135826135328551611fb7565b51166135916135418551611fb7565b51908161362c576135a1836133b2565b61288f579183917f4cb6e22a3e7e651d7cf0376cff48f20f5007a54147777865be7f5f6c38c50f4a9593612590955f52602090600182526135f7604094855f20835f528452855f20855f528452855f20546134ca565b945f5260018252835f20905f528152825f20915f52525f20555b51604051918291338352604060208401526040830190612990565b9161365d917f4cb6e22a3e7e651d7cf0376cff48f20f5007a54147777865be7f5f6c38c50f4a9593612590956127e4565b5050613611565b60c0810151908151915f926137d8575b506137196020918281510151926001600160a01b039081818187511696015116928660a082019485518252308452604097888320898686510151015160808601518b51916136c1836119b4565b8683528c51936136d0856119b4565b8785528d51966136df88611998565b8752898701528c86015260016060860152608085015260a084015260c08301528851808099819463d04dfe2360e01b8352600483016129ec565b03915afa9485156137ce5787956137b0575b50845161373c575b50505050505050565b81905101510151169051813b156137ac57918491849383613771965180978195829463012c676d60e21b845260048401612aa4565b03925af19081156137a3575061378c575b8080808080613733565b6137968291611984565b6137a05780613782565b80fd5b513d84823e3d90fd5b8480fd5b6137c59195503d8089833e612cd781836119d0565b9050935f61372b565b86513d89823e3d90fd5b6001600160a01b03602080845101510151169060a083015190823b156101825761381b925f928360405180968195829463012c676d60e21b845260048401612aa4565b03925af1801561022c571561367457613835919250611984565b5f905f613674565b6080810161384e6135418251611fb7565b5191821561385b57505050565b6138756135326001600160a01b0380935151169351611fb7565b5116815f5260209160018352604092835f20835f528152835f20855f528152835f2054936001600160e01b0385166138b0575b505050505050565b6138d4955f9284845260018152828420868552815282842091845252812055612fcc565b5f8080806138a8565b81156138e7570490565b634e487b7160e01b5f52601260045260245ffd5b6040815110613943576020810151908051603f1981019081116127be5760051c821161392f5760016020920160051b010190565b505060405161393d816119b4565b5f815290565b5060405161393d816119b4565b80511561396057602001515f1a90565b505f90565b905f8091602081519101845af480806139e3575b156139995750506040513d81523d5f602083013e60203d82010160405290565b156139c057604051639996b31560e01b81526001600160a01b039091166004820152602490fd5b3d156139d1576040513d5f823e3d90fd5b60405163d6bda27560e01b8152600490fd5b503d1515806139795750813b1515613979565b60041115613a0057565b634e487b7160e01b5f52602160045260245ffd5b602090939291936001600160a01b036040820195168152613a34836139f6565b0152565b613a40614f41565b6040805163b7bad1b160e01b81526001600160a01b0383166004820152909182826024815f73200e12d10bb0c5e4a17e7018f0f1161919bb93895af1928315613b0e575f925f94613ad9575b50613a96836139f6565b600183141580613ac7575b613aab5750505090565b5163ee07877f60e01b8152918291610725919060048401613a14565b50613ad1836139f6565b821515613aa1565b90809450613afd9293503d8511613b07575b613af581836119d0565b810190614849565b919091925f613a8c565b503d613aeb565b513d5f823e3d90fd5b90805191613b2483611ab4565b91613b3f604094613b37865195866119d0565b808552611ab4565b601f199460209186013686840137835183519095908015613d3e576001613b959101965b6001978891010197613b8c613b778a611ab4565b99613b8486519b8c6119d0565b808b52611ab4565b01848901612211565b85805f9684516002815233878201523086820152606081018652613bb88b611f8a565b52613bc28a611f8a565b505f925b613cfa575b5050508351613bde575b50505050505090565b85809598979692980181613bf28289611fd7565b52613bfd8188611fd7565b505f925b613c10575b5085969750613bd5565b8451831015613cf5576001600160a01b03613c8781613c2f8689611fd7565b51511686613c3d878a611fd7565b51015187815160051b9101207f19457468657265756d205369676e6564204d6573736167653a0a3332000000005f52601c52603c5f208c613c7e888b611fd7565b5101519161499f565b15613cdd57868098999a928192613c9e878a611fd7565b515116613cab8787611fd7565b52019385613cb98289611fd7565b510151613cc6868c611fd7565b52613cd1858b611fd7565b50019290989796613c01565b8951630a57f30960e31b815260048101859052602490fd5b613c06565b9091968151881015613d35578280910197613d158184611fd7565b51613d208a8d611fd7565b52613d2b898c611fd7565b5001919081613bc6565b96829150613bcb565b50613b955f96613b63565b613d51614f41565b60408051630782d7e160e01b81526001600160a01b03831660048201529091828260248173200e12d10bb0c5e4a17e7018f0f1161919bb93895afa928315613b0e575f925f94613ad95750613a96836139f6565b9091939284158215175f14613dbf5750505090505f905f90565b82810192600160fd1b8082019083011760fe1c613ef6575b5050613de281614b18565b93613dec81614b18565b94613df78682614b38565b90918215613ee7575f9083986f0785ee10d5da46d900f436a000000000808611613ed9575b50670de0b6b3a7640000808b11613eca575b50633b9aca00808b11613ebb575b50612710808b11613ead575b5098805b613e9c575081906118d8989982600a0a9109960195817fcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccd0a93838211900382610100031b9203901c170291614b4b565b60019290920191600a900480613e4c565b60049a04998a930192613e48565b600991939a049901915f613e3c565b601291939a049901915f613e2e565b85049950602592505f613e1c565b509290506118d8949550614b4b565b5f821215613f4a57808413613f3c575b7f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb2841315613dd7579092506118d8939491614a56565b9092506118d8939491614abd565b80841215613f06579092506118d8939491614a56565b61343a82826141b3565b92909180613f90576044848460405191637a97930f60e01b835260048301526024820152fd5b90919280155f14613fa557505050505f905f90565b613fbe93613fb291614c05565b92919490938492614c05565b9093919284613fcc88614b18565b91613fd686614b18565b947f161bcca7119915b50764b4abe86529797775a5f171951000000000000000000094604c9186881061417d575b030191600160ff1b98838a018112155f1461414a575050035b5f955f821280614141575b614123575b5f811280614111575b6140f35786820103966001600160ff1b03881490816140e9575b50806140e0575b806140d7575b6140b957509061406d9291614db1565b915f8113614080575b506118d893614b4b565b9091604c82136140ae5761409791600a0a906138dd565b9081156140a4575f614076565b505050505f905f90565b50505050505f905f90565b876044916040519163d556b11160e01b835260048301526024820152fd5b505f851261405d565b50828414614057565b905088145f614050565b604489836040519163d556b11160e01b835260048301526024820152fd5b50806001600160ff1b03018213614036565b955080870186131561413b5786818703015b9561402d565b5f614135565b505f8113614028565b89985090920390506001600160ff1b038190038701821361416e570186019461401d565b5050505050505050505f905f90565b7f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee80000000000000000009650604b9250614004565b81156138e7570590565b8082601b82810b83146143a8577d90e40fbeea1d3a4abc8955e946fe31cdcf66f634e10000000000000000008405614354575b8380820b0361434357507b199999999999999999999999999999999999999999999999999999987b0ccccccccccccccccccccccccccccccccccccccccccccccccccccccc840111156142f4575b838060030b03614278575b80841361425c5750506001600160e01b036001925b60e01b91161791565b8303600a0a80156138e7576001600160e01b0391071592614253565b92915f8413156142c857509061428e8383614e53565b6142aa57637ffffffe1901600a0a810290637fffffff9261423e565b506044916040519163d556b11160e01b835260048301526024820152fd5b637fffffff1992830390604382136140ae576142e791600a0a906141a9565b9182156140a4579261423e565b5f198401808060030b146143085750614233565b90506001600160e01b039293507b7fffffffffffffffffffffffffffffffffffffffffffffffffffffff915060e01b9260ff1d181617905f90565b600190940193600a909305926141e6565b937f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee8000000000000000000840515614395576305f5e100600894058094819201955b9150506141e6565b620186a06005940580948192019561438d565b508261423357505050505f90600190565b919291600160ff1b84016143d1576118d89350614e6c565b906118d8935f039161457d565b919291600160ff1b919080158061456b5750906143fa91614c05565b9490929091905f868585858282138015614562575b614545575b505050508682841860ff1c94860391039081604c03811161452a5701600a0a808205919084614510575b505081019182821860ff1c111561450857826001600160ff1b03146144ea57905f600192135f146144bb57600a9004915b01925b8115811761447f57509190565b80614498575b508015614490579190565b505f91508190565b91926144ae9203600160ff1b01600a0a906141a9565b600160ff1b91905f614485565b600a60037fe666666666666666666666666666666666666666666666666666666666666667920104019161446f565b604490836040519163d556b11160e01b835260048301526024820152fd5b509092614472565b810761451d575b8061443e565b60ff1d600117015f614517565b505050919350614538579190565b60018160ff1d1790039190565b5f9a50909750909550600160ff1b94509250905086808080614414565b50835f1261440f565b156145765750509190565b9350919050565b93929193841581158181176146ce5750509061459891614c05565b91949082956145a982958294614c05565b80969294919693878684821380156146c5575b6146ac575b5050505050508682841860ff1c94860391039081604c03811161452a5701600a0a808205919084614692575b505081019182821860ff1c111561468a57826001600160ff1b03146144ea57905f600192135f1461465b57600a9004915b01925b8115811761462e57509190565b8061463e57508015614490579190565b600160ff1b936146559291038401600a0a906141a9565b5f614485565b600a60037fe666666666666666666666666666666666666666666666666666666666666667920104019161461e565b509092614621565b810761469f575b806145ed565b60ff1d600117015f614699565b929b5098509196509450925090505f80808080806145c1565b508584126145bc565b93959390929190156146e4575050614490579190565b945092915050565b6008815110613960576008015167ffffffffffffffff1667ff0a89c674ee78741490565b916040830192604061474a610c15606087519401938451906001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b613da5565b94519301614759815186612717565b614761575050565b909350611a53919250519251836133fc565b92915f9060018184145f871287151717176147ed575f928082136147df575b03604c81135f8212176147d357600a0a90846147b183820293846141a9565b146147c6575050156147c2575f9190565b5f90565b9093509015611a53579190565b5050156147c2575f9190565b5f9560019450925090614792565b5050505f90565b93929190918083145f83125f87121883158715171717614843575f928082136148365703604c81135f8212176147d357600a0a90846147b183820293846141a9565b9194600193509190614792565b50919050565b919082604091031261018257815160048110156101825760209092015160ff811681036101825790565b91925f83121561489b576044838360405191634a7d166b60e01b835260048301526024820152fd5b9192836148ad57505090505f90600190565b60ff8116820191808312614975575f8312156148e5575050604c198112614490575f03600a0a916148de83826138dd565b9283021490565b909293915f81135f1461496b57604d811361494057600a0a9283156138e757835f190483116149175750500290600190565b60405163c849483b60e01b815260048101849052602481019290925260ff166044820152606490fd5b5060405163c849483b60e01b81526004810192909252602482015260ff919091166044820152606490fd5b5050905090600190565b60405163c849483b60e01b815260048101869052602481019190915260ff82166044820152606490fd5b9091813b6149da576149b19192614faa565b506149bb816139f6565b1591826149c757505090565b6001600160a01b03918216911614919050565b6020918160645f935160405192630b135d3f60e11b9788855260048501526040602485015286820190604485015e8281018201859052601f01601f191601915afa905f5114601f3d11161690565b9060ff165f03916001600160ff1b0382115f14614a4e57600a6001818404940192061590565b909190600190565b909392915f614a66918184613da5565b9490945f8483019182019412159081614ab3575b8115614aa9575b50614a8b57505090565b604492506040519163d556b11160e01b835260048301526024820152fd5b905083125f614a81565b8281129150614a7a565b614ad293600160fe1b90810193920190613da5565b9081815f821215614b09575050604b19821261280557614af7915f03600a0a906141a9565b9081614b01575f90565b600160ff1b90565b93600160ff1b90910192509050565b5f811215611a5357600160ff1b90808203614b31575090565b90505f0390565b905f198183099102908180821091030391565b92939291905f8184181215614be0576001600160ff1b039283831115614bca57600160ff1b93838503614b8057505050509190565b90919293508514614b9a575050600a600191045f03920190565b604051630ed8062160e21b8152600481019190915260248101919091526044810182905260648101849052608490fd5b5090915050600160ff1b81146127be575f039190565b90916001600160ff1b0380841115612786578514614b9a575050600a60019104920190565b9190918015614da757827f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee800000000000000000080830515614cb5575b507f19999999999999999999999999999999999999999999999999999999999999997f0ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc830110614ca6575b8313614c905791905f90565b919060018060ff1b926001600160ff1b03030190565b9290600a02905f190192614c84565b6f4b3b4ca85a86c47a098a22400000000080840515614d95575b507728c87cb5c89a2571ebfdcb54864ada834a00000000000000830515614d7e575b7b097edd871cfda3a5697758bf0e3cbb5ac5741c640000000000000000830515614d6a575b7e3899162693736ac531a5a58f1fbb4b746504382ca7e4000000000000000000830515614d5a57820515614d4b575b5f614c39565b9290600a02905f190192614d45565b9391606402916001190193614d16565b93916402540be40002916009190193614d16565b9391678ac7230489e8000002916012190193614cf1565b6025198301955092909202915f614ccf565b505f915081908190565b90915f198383099280830292838086109503948086039584871015614e2f5714614e27579082910960018219018216809204600280826003021880830282030280830282030280830282030280830282030280830282030280920290030293600183805f03040190848311900302920304170290565b505091500490565b60648386866040519263362ced0960e11b8452600484015260248301526044820152fd5b611a5391905f811215614e67575f03614fe4565b614fe4565b909291600160ff1b91828101614efe5750808414614ef457808413918215614eec578185035b604c811115614edb5750505f915b15614ecc57507f8000000000000000000000000000000000000000000000000000000000000001019190565b92506001600160ff1b03039190565b600a0a9081156138e7570491614ea0565b848203614e92565b505090505f905f90565b93614f0b92945f036143de565b80939180928114614f1f575b50505f039190565b915092506001600160ff1b0383146144ea57600a600191059201915f80614f17565b73200e12d10bb0c5e4a17e7018f0f1161919bb9389803b158015614f7f575b614f675750565b602490604051906373e6d7b360e01b82526004820152fd5b507f1de7d717526cba131d684e312dedbf0852adef9cced9e36798ae4937f7145d41813f1415614f60565b8151919060418303614fda57614fd39250602082015190606060408401519301515f1a90615073565b9192909190565b50505f9160029190565b90637ffffff581131561506d57637ffffffe1981019060438213615066575f82121561503a57637fffffff91505f0301600a0a7b8000000000000000000000000000000000000000000000000000000202111590565b50600a0a80156138e7577b80000000000000000000000000000000000000000000000000000001041090565b5050151590565b50505f90565b91907f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a084116150ea579160209360809260ff5f9560405194855216868401526040830152606082015282805260015afa1561022c575f516001600160a01b038116156150e057905f905f90565b505f906001905f90565b5050505f916003919056"; + hex"6080806040523460395760017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055615139908161003e8239f35b5f80fdfe6080806040526004361015610012575f80fd5b5f3560e01c90816301ffc9a71461178f575080631f69cb75146115595780632cb77e9f1461152d5780632fbc4ba0146113cb57806341d1514f146113945780635cffe9de14611238578063607461191461109c578063613255ab1461101957806369c728561461072b578063709fb8a5146104375780639235084d146103e3578063ac9650d814610295578063d7e442ec14610237578063d9d98ce4146101865763fa501182146100c1575f80fd5b34610182576101403660031901126101825767ffffffffffffffff600435818111610182576100f4903690600401611b41565b6024358281116101825761010c903690600401611b41565b60c0366043190112610182576101043583811161018257610131903690600401611ce7565b90610124359384116101825761014e61015c943690600401611ce7565b9261015761263d565b61221d565b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055005b5f80fd5b34610182576040366003190112610182576001600160a01b036101a7611813565b166040516370a0823160e01b8152306004820152602081602481855afa90811561022c575f916101fa575b50156101e25760206040515f8152f35b60249060405190633c5bf76960e21b82526004820152fd5b90506020813d602011610224575b81610215602093836119b0565b810103126101825751826101d2565b3d9150610208565b6040513d5f823e3d90fd5b346101825760203660031901126101825760043567ffffffffffffffff81116101825761028f61026e61015c9236906004016117e2565b919061027861263d565b6040519261028584611994565b5f84523691611dbb565b906128f6565b34610182576020806003193601126101825760043567ffffffffffffffff8111610182576102c79036906004016117e2565b9190604051926102d684611994565b5f84528284016102e582611a94565b946102f360405196876119b0565b8286526102ff83611a94565b9361031186880195601f190186612201565b5f5b84811061037557604080518881528951818a018190525f92600582901b83018101918a918c9085015b8287106103495785850386f35b909192938280610365600193603f198a8203018652885161189f565b960192019601959291909261033c565b806103c4886103be61039160019560059d9c9d1b8701876120e1565b929089846040519586938585013782018381015f81528b519283915e015f838201520380845201826119b0565b306139a9565b6103ce828a611fc7565b526103d98189611fc7565b5001969596610313565b3461018257600319602036820112610182576004359067ffffffffffffffff821161018257608090823603011261018257610422606091600401612129565b90604051921515835260208301526040820152f35b34610182576003196040368201126101825760043567ffffffffffffffff8082116101825760c08260040193833603011261018257602435908111610182576104849036906004016117e2565b61048f92919261263d565b6104c06104bb6104b66104af6104a58880612114565b60408101906120e1565b36916119d2565b61393f565b613994565b801561071957600110156107075760248201926104dd8486611f24565b9050156106f55760448301936104f38587611f24565b9050156106e3576105596105219561054d6105186105118a80612114565b948a611f24565b9890928a611f24565b91909261053e60405196610534886118c3565b3388523690611a36565b9960209a8b8801523691611aac565b60408501523691611aac565b6060820152606484013560808201526105718161267f565b90815f525f865260405f209485541595866105b5575b878760017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055604051908152f35b6001905560a46001600160a01b03917f87491344dfbcf91f6cbbc610cbbeedc85313d37a02df0c93527f7ea5f8db717f83855116604051908152868b8201526060604082015280610609606082018861202f565b0390a10191610618838a6120e1565b905061063b575b50505061062e939495506126b0565b8190838080808080610587565b6106486104af848b6120e1565b61065181614730565b156106bc57509761068f7fd46c2c56b35c8210e9e712ec3f02242d5fc90187c0ac8ed80cc33626846ec369936106af9361062e999a9b5116926120e1565b92906040519384938452868c850152606060408501526060840191611d16565b0390a1859493878061061f565b886106df604051928392630c89984b60e31b84526004840152602483019061189f565b0390fd5b60405163540e5f0b60e01b8152600490fd5b604051636c44ef8f60e01b8152600490fd5b604051633c8270bd60e21b8152600490fd5b604051632cff108b60e21b8152600490fd5b34610182576003196020368201126101825767ffffffffffffffff600435116101825760c090600435360301126101825761076461263d565b5f808061077960048035608481019101611e6d565b90501561100757602460043501359261079184612742565b15610ff5576060806040516107a58161192b565b6107ad611ec2565b81525f60208201525f604082015201526107c5611ec2565b506108256108206107ff6107f56107ef6107e9608460043501600435600401611e6d565b90611ef4565b80611f0f565b6040810190611f24565b60206108186107e9608460043501600435600401611e6d565b013591611f5a565b611d02565b936001600160a01b0361087461082061085b6108516107ef6107e9608460043501600435600401611e6d565b6060810190611f24565b60406108186107e9608460043501600435600401611e6d565b8160405197610882896118f3565b16875216602086015260408501526108a4608460043501600435600401611e6d565b9490506001604051950160051b85016040525f905f5b6108ce608460043501600435600401611e6d565b9050811080610fe2575b15610e2f576108f1608460043501600435600401611e6d565b821015610e1b578160051b810135607e198236030181121561018257608081830136031261018257604051916109268361192b565b8181013567ffffffffffffffff81116101825761094890369084840101611b41565b835280820160208181013590850152604080820135908501526060013567ffffffffffffffff8111610182576109819236920101611ce7565b606082015280516001600160a01b036109a36040830151602085015190611fc7565b5151166001600160a01b0385511614801590610de7575b610dd5576109d2602083015160408401519083612e36565b6109db8161267f565b91825f525f60205260405f2054155f14610a3f575051604080513381526001600160a01b039092166020830152810191909152600191907fb70c12fa453793fa6818ec07c91e74363a47aa6a6829dcd9533937fdf30314f390606090a15b016108ba565b9190610a70602084979597015160408501519060608601519060405192610a6584611994565b5f8452339186613079565b925f93610a8860608201516044600435013590612765565b15610aef57505051604080513381526001600160a01b03909216602083015281019190915260019291907fe3151dc8cb7a54ffc4baabd28c1f241c94d510b5e5b502491ac3cad6c16316d590606090a15b8115610ae7575b5092610a39565b905088610ae0565b610afc6040820151612742565b158015610dc2575b15610b5957505051604080513381526001600160a01b03909216602083015281019190915260019291907f500b713857325f9e6dcb52ae832eca9109d107ed1aae9cb4928b4c1e13f051aa90606090a1610ad9565b9250925050600196959691610b72606460043501611fdb565b15610d2f5796610be297610bf260408401516040880151610b9381836133d8565b15610d275750925b610bec848592610bd5610bcf60608a01516001600160e01b03601b918660e01d92828816810b928260e01d9216900b613de9565b90613fa4565b9d8e9260408d01516134a3565b60408c01526134cd565b996134cd565b98610bfd84846134f7565b610c078482613555565b60405192338452608060208501526060610c2d845160808088015261010087019061202f565b93602081015160a0870152604081015160c0870152015192607f198582030160e0860152835180825260208201906020808260051b8501019601925f5b828110610cc957505050505092806001979695937f194f1feb3b4d7076a2c272e774e792e0c48bb8c7aa1a9a3671c1cd6da9e6b4c193610cc496604084015260608301520390a180858c5101808d5260051b8c01526136a8565b610ad9565b9091929396602080610d1a600193601f198782030189528b51906001600160a01b0382511681526040610d098584015160608785015260608401906120ae565b92015190604081840391015261189f565b9901950193929101610c6a565b905092610b9b565b610be290610bf26060840151610bec610d6d610bcf60408801516001600160e01b0394601b90868360e01d9316820b91878260e01d9216900b613de9565b60408a0151610d7c81836133d8565b15610dba5750915b829c8d916060890151908116155f14610dab575060408801515b96879460408d01516134a3565b610db590856133ff565b610d9e565b905091610d84565b50610dd060608201516133b5565b610b04565b60405163936bb5ad60e01b8152600490fd5b506001600160a01b03610e036060830151604085015190611fc7565b5151166001600160a01b0360208601511614156109ba565b634e487b7160e01b5f52603260045260245ffd5b50919390610e41606460043501611fdb565b15610fdc57835b6004356004013590610e5a82826133d8565b610fbe5750508490610e7a856001600160a01b0360208701511633612dcd565b505060a46004350190610e92826004356004016120e1565b905015159081610fb6575b50610f15575b506001600160a01b03610eb9929351163361278c565b50505b8351811015610ee15780610edb610ed560019387611fc7565b51613881565b01610ebc565b5060409160017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f005582519182526020820152f35b90506001600160a01b03602084015116610f3f6001600160a01b03855116926004356004016120e1565b929091333b1561018257610f875f93604051958694859463691f9ed760e01b8652600486015260248501528960448501528a606485015260a0608485015260a4840191611d16565b038183335af190811561022c57859115610ea3579050610fa79150611947565b5f836001600160a01b03610ea3565b905088610e9d565b604492506040519163573b6f4160e01b835260048301526024820152fd5b84610e48565b50610ff06040830151612742565b6108d8565b60405163315f9e2360e21b8152600490fd5b604051639c95219f60e01b8152600490fd5b3461018257602080600319360112610182576024816001600160a01b0361103e611813565b16604051928380926370a0823160e01b82523060048301525afa90811561022c575f9161106f575b50604051908152f35b90508181813d8311611095575b61108681836119b0565b81010312610182575182611066565b503d61107c565b34610182576110aa36611853565b6110b261263d565b6110bd84863361270e565b6110c683612742565b1561120b576110d6848633612b00565b6110e081856133d8565b15611205575082935b6110f585828833612d6f565b9690947f8045c25080b0868951141ed0a91720bcad09a8364a2b3109ee1fd49c1f0bc8b860c0611126898533612dcd565b94906001600160a01b0360405192338452169a8b6020840152876040840152856060840152608083015260a0820152a1836111815760017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055005b6111f89761028f9660ff946040519960078b5260208b015260408a01526060890152608088015260a08701521660c08501523360e0850152610100840193846040526111cc85611977565b600785526111dd61012082016121e5565b6111e685611fb7565b526111f084611fb7565b503691611dbb565b808080808080808061015c565b936110e9565b604051623a3a4d60e21b81523360048201526001600160a01b038616602482015260448101859052606490fd5b34610182576080366003190112610182576004356001600160a01b039081811680910361018257611267611829565b6044359167ffffffffffffffff916064358381116101825736602382011215610182578060040135938411610182573660248583010111610182576112f49560209216936112b6868587612c90565b60405196879283926323e30c8b60e01b84523360048501528760248501528860448501525f606485015260a06084850152602460a485019201611d16565b03815f855af193841561022c575f94611360575b507f439148f0bbc682ca079e46d6e2c2f0c1e3b820f1a291b069d8882abf8cf18dd984036113475761133c93503091612d09565b602060405160018152f35b604051630b6c58a960e31b815260048101859052602490fd5b9093506020813d60201161138c575b8161137c602093836119b0565b8101031261018257519284611308565b3d915061136f565b346101825760603660031901126101825760206113c36113b2611813565b6113ba611829565b60443591612b00565b604051908152f35b34610182576113d936611853565b839493926113e561263d565b6113f084863361270e565b6113f981612742565b156114ff578061140d61145c92873361278c565b9590967f7f9dfa19cf1cc2f806f2f860fbc9c056b601fb1afc0e9b843dfe5c63616268e660806040513381526001600160a01b0384169a8b60208301528560408301526060820152a133612832565b9590938261148a5760017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055005b6114f39661028f9560ff936040519860068a5260208a01526040890152606088015260808701521660a08501523360c085015260e0840193846040526114cf85611977565b600785526114e061010082016121e5565b6114e985611fa7565b526111f084611fa7565b8080808080808061015c565b6040516306dde9c360e41b81523360048201526001600160a01b038616602482015260448101859052606490fd5b34610182576020366003190112610182576004355f525f6020526020600160405f205414604051908152f35b3461018257600319604036820112610182576004359067ffffffffffffffff808311610182578260040160a08436039384011261018257602435828111610182576115a89036906004016117e2565b906115b161263d565b5f946001600160a01b0394856115c686611d02565b16330361176d576115df6115da3687611b41565b61267f565b91825f525f60205260405f20966001885414611627575b60208960017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00556040519015158152f35b9091929394959697505f600198556040519133835284602084015260606040840152816116538961183f565b16606084015260248a013590606219018112156101825789019060a06080840152806116816004840161183f565b166101008401526116946024830161183f565b16610120830152604481013560221982360301811215610182570195602460048801359701928711610182578636038313610182576020986084611750849361170f7f09d18501db0080ca2d6cd7c17fa7255daff4b2d503ea93b76ff68b6752ea8e63976117609c6060610140890152610160880191611d16565b6117416117366117226044880185611d36565b605f198a8603810160a08c01529491611d6b565b926064870190611d36565b918784030160c0880152611d6b565b91013560e08301520390a16126b0565b82808080808080806115f6565b60248661177987611d02565b6040516335252be360e01b815291166004820152fd5b34610182576020366003190112610182576004359063ffffffff60e01b82168092036101825760209163e414309160e01b81149081156117d1575b5015158152f35b6301ffc9a760e01b149050836117ca565b9181601f840112156101825782359167ffffffffffffffff8311610182576020808501948460051b01011161018257565b600435906001600160a01b038216820361018257565b602435906001600160a01b038216820361018257565b35906001600160a01b038216820361018257565b906080600319830112610182576004356001600160a01b0381168103610182579160243591604435916064359067ffffffffffffffff82116101825761189b916004016117e2565b9091565b805180835260209291819084018484015e5f828201840152601f01601f1916010190565b60a0810190811067ffffffffffffffff8211176118df57604052565b634e487b7160e01b5f52604160045260245ffd5b6060810190811067ffffffffffffffff8211176118df57604052565b6040810190811067ffffffffffffffff8211176118df57604052565b6080810190811067ffffffffffffffff8211176118df57604052565b67ffffffffffffffff81116118df57604052565b60e0810190811067ffffffffffffffff8211176118df57604052565b610100810190811067ffffffffffffffff8211176118df57604052565b6020810190811067ffffffffffffffff8211176118df57604052565b90601f8019910116810190811067ffffffffffffffff8211176118df57604052565b92919267ffffffffffffffff82116118df57604051916119fc601f8201601f1916602001846119b0565b829481845281830111610182578281602093845f960137010152565b9080601f8301121561018257816020611a33933591016119d2565b90565b91906060838203126101825760405190611a4f826118f3565b8193611a5a8161183f565b8352611a686020820161183f565b602084015260408101359167ffffffffffffffff831161018257604092611a8f9201611a18565b910152565b67ffffffffffffffff81116118df5760051b60200190565b929192611ab882611a94565b604092611ac860405192836119b0565b819581835260208093019160061b84019381851161018257915b848310611af157505050505050565b8583830312610182578386918251611b088161190f565b611b118661183f565b81528286013583820152815201920191611ae2565b9080601f8301121561018257816020611a3393359101611aac565b91909160a0818403126101825760405190611b5b826118c3565b8193611b668261183f565b835267ffffffffffffffff9160208101358381116101825782611b8a918301611a36565b602085015260408101358381116101825782611ba7918301611b26565b6040850152606081013592831161018257611bc86080939284938301611b26565b60608501520135910152565b909291611be084611a94565b916040611bf060405194856119b0565b839580855260208095019160059160051b8401948086116101825784935b868510611c1f575050505050505050565b67ffffffffffffffff90853582811161018257870190606082850312610182578451611c4a816118f3565b611c538361183f565b81528a83013584811161018257830185601f8201121561018257803590611c7982611a94565b91611c86895193846119b0565b8083528d808401918b1b83010191888311610182578e809101915b838310611cd757509150508201528583013593841161018257611cc8858c95869501611a18565b86820152815201940193611c0e565b82358152918101918f9101611ca1565b9080601f8301121561018257816020611a3393359101611bd4565b356001600160a01b03811681036101825790565b908060209392818452848401375f828201840152601f01601f1916010190565b9035601e198236030181121561018257016020813591019167ffffffffffffffff8211610182578160061b3603831361018257565b9190808252602080920192915f905b828210611d88575050505090565b909192936001906001600160a01b03611da08761183f565b16815285830135838201526040908101950193920190611d7a565b90929192611dc881611a94565b91604091611dd960405194856119b0565b839581855260208095019160051b8301938185116101825783925b858410611e045750505050505050565b67ffffffffffffffff908435828111610182578601908382860312610182578351611e2e8161190f565b82358481116101825786611e43918501611a36565b81528983013593841161018257611e5e868b95869501611ce7565b83820152815201930192611df4565b903590601e1981360301821215610182570180359067ffffffffffffffff821161018257602001918160051b3603831361018257565b60405190611eb0826118f3565b60606040835f81525f60208201520152565b60405190611ecf826118c3565b5f608083828152611ede611ea3565b6020820152606060408201526060808201520152565b9015610e1b57803590607e1981360301821215610182570190565b903590609e1981360301821215610182570190565b903590601e1981360301821215610182570180359067ffffffffffffffff821161018257602001918160061b3603831361018257565b9190811015610e1b5760061b0190565b805115610e1b5760200190565b805160011015610e1b5760400190565b805160021015610e1b5760600190565b805160031015610e1b5760800190565b805160041015610e1b5760a00190565b805160051015610e1b5760c00190565b8051821015610e1b5760209160051b010190565b3580151581036101825790565b9081518082526020808093019301915f5b828110612007575050505090565b835180516001600160a01b031686528201518583015260409094019392810192600101611ff9565b906080806120a561209361208160406001600160a01b0380895116885260208901519060a060208a01528082511660a08a015260208201511660c08901520151606060e088015261010087019061189f565b60408701518682036040880152611fe8565b60608601518582036060870152611fe8565b93015191015290565b9081518082526020808093019301915f5b8281106120cd575050505090565b8351855293810193928101926001016120bf565b903590601e1981360301821215610182570180359067ffffffffffffffff82116101825760200191813603831361018257565b903590605e1981360301821215610182570190565b6121406115da6121398380611f0f565b3690611b41565b5f525f602052600160405f2054036121dc5780612160816121cc93611f0f565b6121c461217f6121846020850135938460408701359384923690611b41565b612e36565b61219c6121918580611f0f565b946060810190611e6d565b92906121bc604051966121ae88611994565b5f88525f3681373690611b41565b933691611bd4565b923392613079565b6040810151606090910151600192565b505f905f905f90565b5f5b60e081106121f3575050565b6060828201526020016121e7565b5f5b82811061220f57505050565b606082820152602001612203565b9291926001600160a01b039081815116828451161461262b57606081018051908361224b6064358094611fc7565b515116906040968787015192866122656084358096611fc7565b515116148015906125fa575b6125e9578785015192866122886044358096611fc7565b51511687612297878651611fc7565b515116146125d8576122a88661267f565b805f525f602052895f20541561258557506122c28861267f565b998a5f525f602052895f20541561252f57899a5087899a51958c6101203389528060208a015288016122f4908b61202f565b888103828a0152612305908d61202f565b958260608a01528960808a01528560a08a01528360a4359d8e60c08c015260c4359a8b60e08201528060e4359a8b610100830152037f6fa7f4c28634b0a9d6831401c45ae468195fb63aed07308935c35374ff5d9e3991a1511691519161236b83611994565b8a5f8452612379948d613079565b975116908b519161238983611994565b8a5f8452612397948d613079565b958951976123a48961192b565b5f895260208901995f8b528b8a01965f885260608b01965f88526123c88b8b614754565b8d5289528c6123d78b8d614754565b9091528089528c51906123e9916134a3565b918d518a516123f7916134a3565b97612401846133b5565b8015612520575b61250e5789958f8f966124d59f9e9c8f976124d09f9b96978f7fd9fa84dd790c969daa5c33d8050dc06b4a9b59d5b42e2be5f5e8ae20447f618d9f9a60a09f9a8f996124916124a99f9361248c868f976124979f6124a09c60609f83879361248685612486946124979f61248c9961248091516134f7565b516134f7565b51613555565b613881565b51611fc7565b51511633612832565b50500151611fc7565b50508a5191338352895160208401528a518c840152516060830152516080820152a16136a8565b6136a8565b6001600160e01b0380915116159182612502575b50506124f25750565b516321badf1f60e01b8152600490fd5b51161590505f806124e9565b508e51630d86822160e01b8152600490fd5b5061252a896133b5565b612408565b505095519651338152949096166001600160a01b031660208501525050506040810193909352507fb70c12fa453793fa6818ec07c91e74363a47aa6a6829dcd9533937fdf30314f391905080606081015b0390a1565b95519851338152969098166001600160a01b031660208701525050505060408201527fb70c12fa453793fa6818ec07c91e74363a47aa6a6829dcd9533937fdf30314f39350915081905060608101612580565b8851631cd2f1c760e21b8152600490fd5b875163936bb5ad60e01b8152600490fd5b508561260d606089015160a43590611fc7565b515116866126218a88015160443590611fc7565b5151161415612271565b604051630a98f1f360e21b8152600490fd5b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00600281541461266d5760029055565b604051633ee5aeb560e01b8152600490fd5b6040516126aa8161269c602082019460208652604083019061202f565b03601f1981018352826119b0565b51902090565b61270c92916126db61028f923390919060405192600284526020840152604083015260608201604052565b92604051936126e985611977565b600785526126f9602086016121e5565b61270285611f6a565b526111f084611f6a565b565b909115612719575050565b6040516305dbdfd960e41b81526001600160a01b03918216600482015291166024820152604490fd5b612761905f60e01d906001600160e01b038160e01d9116601b0b6147b7565b1290565b90612761916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b614838565b92919261279882613a7c565b936127a2816133b5565b6128205784816001600160e01b036127c19360e01d9116601b0b6148b7565b92908093156127f7575b508290816127db575b5050509190565b6127ef926001600160a01b03309216612d09565b5f81816127d4565b9092505f19811461280c57600101915f6127cb565b634e487b7160e01b5f52601160045260245ffd5b604051632eaefac360e21b8152600490fd5b9392919361283f836133b5565b6128dd578461285b57612853939450612dcd565b50505f905f90565b6001600160a01b039392919380911694855f52602060018152604092835f20961695865f528152825f20825f528152612898835f205494856134cd565b956128a2876133b5565b6128c5575f97885260018252838820908852815282872091875252909320829055565b835163c5e12af560e01b815260048101889052602490fd5b60405163793a8f5560e01b815260048101849052602490fd5b60408051929361290584611977565b6007845260206129168186016121e5565b5f5b845181101561294b578061292e60019287611fc7565b516129398289611fc7565b526129448188611fc7565b5001612918565b50925092939093335f52308352845f20928551916129688361190f565b612970611ea3565b83526060828194015286519361298585611994565b5f855287519061299482611994565b5f82525f3681375f5b8151811015612af4576129b08183611fc7565b51908a82510151516129c7575b600191500161299d565b8a89875f6129d8828701518a613bb7565b938651946001600160a01b0394828680895116968901511697015190835197612a008961195b565b88528d88015282870152828d87015260808601528c60a08601528860c086015251809263d04dfe2360e01b82528180612a3d600498898301612fc1565b03915afa948515612aea5789915f96612ac4575b508551612a62575b505050506129bd565b5101511692833b1561018257612a90935f92838f5180978195829463012c676d60e21b845233908401613667565b03925af1918215612aba57600192612aab575b808781612a59565b612ab490611947565b5f612aa3565b8b513d5f823e3d90fd5b612ae19196503d805f833e612ad981836119b0565b810190612e7d565b9050945f612a51565b8e513d5f823e3d90fd5b50505050505050509050565b8215612b35576001600160a01b038091165f52600160205260405f2091165f5260205260405f20905f5260205260405f205490565b909150612b4182613b5b565b6001600160a01b03809316906040918251946370a0823160e01b86528416938460048701526020928387602481865afa968715612c57575f97612c61575b5083612b98612b9183612bc89a6149e3565b50906141f7565b508651636eb1769f60e11b81526001600160a01b0390941660048501523060248501529297889081906044820190565b0381865afa968715612c57575f97612c26575b50612b91612bec91611a33986149e3565b50612bf781836133d8565b15612c1e5750935b5f5260018252825f20905f528152815f20905f8052525f2054906134cd565b905093612bff565b96508387813d8311612c50575b612c3d81836119b0565b8101031261018257955195612b91612bdb565b503d612c33565b85513d5f823e3d90fd5b96508387813d8311612c89575b612c7881836119b0565b810103126101825795519583612b7f565b503d612c6e565b6040519263a9059cbb60e01b5f526001600160a01b0380931660045260245260205f60448180855af160015f5114811615612cea575b8360405215612cd457505050565b635274afe760e01b835216600482015260249150fd5b6001811516612d0057813b15153d151616612cc6565b833d5f823e3d90fd5b9092604051936323b872dd60e01b5f526001600160a01b0393848092166004521660245260445260205f60648180855af160015f5114811615612d59575b836040525f60605215612cd457505050565b6001811516612d0057813b15153d151616612d47565b93929193612d7c836133b5565b6128dd5784612d905761285393945061278c565b6001600160a01b039392919380911694855f52602060018152604092835f20961695865f528152825f20825f528152612898835f205494856134a3565b90929192612dda81613a7c565b93612de4816133b5565b612e245784816001600160e01b03612e039360e01d9116601b0b6148b7565b50809281612e12575050509190565b6001600160a01b036127ef9316612c90565b604051632d1671a360e11b8152600490fd5b91612e61906060612e56936001600160a01b039485916040880151611fc7565b515116940151611fc7565b51511614612e6b57565b604051631cd2f1c760e21b8152600490fd5b919060408382031261018257825167ffffffffffffffff908181116101825784019082601f83011215610182578151602092612eb882611a94565b91612ec660405193846119b0565b808352848084019160051b830101918683116101825785809101915b838310612f555750505050948281015191821161018257019180601f84011215610182578251612f1181611a94565b93612f1f60405195866119b0565b818552838086019260051b820101928311610182578301905b828210612f46575050505090565b81518152908301908301612f38565b8251815291810191869101612ee2565b90808251908181526020809101926020808460051b8301019501935f915b848310612f935750505050505090565b9091929394958480612fb1600193601f198682030187528a516120ae565b9801930193019194939290612f83565b91906020928381526001600160a01b0382511684820152838201516040820152612ffb604083015160e0606084015261010083019061189f565b9060608301516080820152613022608084015192601f1993848483030160a0850152612f65565b9260a081015193838382030160c08401528680865192838152019501905f5b81811061306557505050611a3394955060c060e091015192828503019101526120ae565b825187529588019591880191600101613041565b9491936132be919360c0915f6132456040928351946130978661195b565b61309f611ec2565b86526020958487820152848682015260609781868a809401528260808201528660a082015201526131f58551916130d583611977565b600783526130e48884016121e5565b8d6130ee8161267f565b9c896001600160a01b039e8f94859182865116908d5194600486528501528c840152168c82015233608082015260a081018a5261312a86611f6a565b5261313485611f6a565b508851613140816118f3565b6002815289368c83013761315386611f77565b5261315d85611f77565b5060ff8a6131c08b8501936131aa876131838161317b858a51611fc7565b515116613b5b565b97511688613192848951611fc7565b515116856131a1858a51611fc7565b51015191612b00565b966131b6828751611fc7565b5151169451611fc7565b51015192169093929190604051946005865260208601526040850152606084015260808301525f60a083015260c08201604052565b6131fe82611f87565b5261320881611f87565b5061322c8a8d8d60ff8a6131c08d8501936131aa876131838161317b858a51611fc7565b61323582611f97565b5261323f81611f97565b50613bb7565b95878a511697848b0191825191868184511693015116928a8552308752858086209151015186519161327683611994565b8683528751956132858761195b565b86528886015286850152848885015289608085015260a084015260c08301528351808098819463d04dfe2360e01b835260048301612fc1565b03915afa9687156133ab575f945f98613389575b50845160028110613372575081838601519501516132f86132f288611fa7565b51611f97565b5161330381836133d8565b1561336a5750925b61332d8685919060405192600284526020840152604083015260608201604052565b61333688611f87565b5261334087611f87565b5082519961334d8b61195b565b8a52890152870152850152608084015260a083015260c082015290565b90509261330b565b602490835190630fbb8e5560e21b82526004820152fd5b9097506133a19194503d805f833e612ad981836119b0565b939093965f6132d2565b50513d5f823e3d90fd5b6133d4905f60e01d906001600160e01b038160e01d9116601b0b6147b7565b1390565b906133d4916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b614838565b6134266001600160e01b0392838316601b0b9260e01d938160e01d9116601b0b8484613fae565b90637ffffff58213613476575b9061343d916141f7565b929092158061346e575b61345057505090565b6044925060405191638eba4d0760e01b835260048301526024820152fd5b508215613447565b6134808282614e97565b1561343357604483856040519163d556b11160e01b835260048301526024820152fd5b611a3391610bcf916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b6143fd565b611a3391610bcf916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b6145c1565b61355191608081018261351361350d8351611fa7565b51611fa7565b5261354a6135446001600160a01b0380945151169361353b6135358551611fa7565b51611f6a565b51169251611fa7565b51611f87565b5191612d6f565b5050565b9060808101918061356961350d8551611f97565b526001600160a01b038092515116916135856135358551611f97565b51166135946135448551611f97565b51908161362f576135a4836133b5565b6128dd579183917f4cb6e22a3e7e651d7cf0376cff48f20f5007a54147777865be7f5f6c38c50f4a9593612580955f52602090600182526135fa604094855f20835f528452855f20855f528452855f20546134cd565b945f5260018252835f20905f528152825f20915f52525f20555b51604051918291338352604060208401526040830190612f65565b91613660917f4cb6e22a3e7e651d7cf0376cff48f20f5007a54147777865be7f5f6c38c50f4a959361258095612832565b5050613614565b90604082019082526020606081936040838201528551809452019301915f5b828110613694575050505090565b835185529381019392810192600101613686565b60c0810151908151915f9261381c575b5061375d6020918281510151926001600160a01b039081818187511696015116928660a082019485518252308452604097888320898686510151015160808601518b519161370583611994565b8683528c519361371485611994565b8785528d51966137238861195b565b8752898701528c86015260016060860152608085015260a084015260c08301528851808099819463d04dfe2360e01b835260048301612fc1565b03915afa9485156138125787956137f4575b508451613780575b50505050505050565b81905101510151169051813b156137f0579184918493836137b5965180978195829463012c676d60e21b845260048401613667565b03925af19081156137e757506137d0575b8080808080613777565b6137da8291611947565b6137e457806137c6565b80fd5b513d84823e3d90fd5b8480fd5b6138099195503d8089833e612ad981836119b0565b9050935f61376f565b86513d89823e3d90fd5b6001600160a01b03602080845101510151169060a083015190823b156101825761385f925f928360405180968195829463012c676d60e21b845260048401613667565b03925af1801561022c57156136b857613879919250611947565b5f905f6136b8565b608081016138926135448251611f97565b5191821561389f57505050565b6138b96135356001600160a01b0380935151169351611f97565b5116815f5260209160018352604092835f20835f528152835f20855f528152835f2054936001600160e01b0385166138f4575b505050505050565b613918955f9284845260018152828420868552815282842091845252812055612dcd565b5f8080806138ec565b811561392b570490565b634e487b7160e01b5f52601260045260245ffd5b6040815110613987576020810151908051603f19810190811161280c5760051c82116139735760016020920160051b010190565b505060405161398181611994565b5f815290565b5060405161398181611994565b8051156139a457602001515f1a90565b505f90565b905f8091602081519101845af48080613a27575b156139dd5750506040513d81523d5f602083013e60203d82010160405290565b15613a0457604051639996b31560e01b81526001600160a01b039091166004820152602490fd5b3d15613a15576040513d5f823e3d90fd5b60405163d6bda27560e01b8152600490fd5b503d1515806139bd5750813b15156139bd565b60041115613a4457565b634e487b7160e01b5f52602160045260245ffd5b602090939291936001600160a01b036040820195168152613a7883613a3a565b0152565b613a84614f85565b6040805163b7bad1b160e01b81526001600160a01b0383166004820152909182826024815f73200e12d10bb0c5e4a17e7018f0f1161919bb93895af1928315613b52575f925f94613b1d575b50613ada83613a3a565b600183141580613b0b575b613aef5750505090565b5163ee07877f60e01b81529182916106df919060048401613a58565b50613b1583613a3a565b821515613ae5565b90809450613b419293503d8511613b4b575b613b3981836119b0565b81019061488d565b919091925f613ad0565b503d613b2f565b513d5f823e3d90fd5b613b63614f85565b60408051630782d7e160e01b81526001600160a01b03831660048201529091828260248173200e12d10bb0c5e4a17e7018f0f1161919bb93895afa928315613b52575f925f94613b1d5750613ada83613a3a565b90805191613bc483611a94565b91613bdf604094613bd7865195866119b0565b808552611a94565b601f199460209186013686840137835183519095908015613dde576001613c359101965b6001978891010197613c2c613c178a611a94565b99613c2486519b8c6119b0565b808b52611a94565b01848901612201565b85805f9684516002815233878201523086820152606081018652613c588b611f6a565b52613c628a611f6a565b505f925b613d9a575b5050508351613c7e575b50505050505090565b85809598979692980181613c928289611fc7565b52613c9d8188611fc7565b505f925b613cb0575b5085969750613c75565b8451831015613d95576001600160a01b03613d2781613ccf8689611fc7565b51511686613cdd878a611fc7565b51015187815160051b9101207f19457468657265756d205369676e6564204d6573736167653a0a3332000000005f52601c52603c5f208c613d1e888b611fc7565b51015191614a11565b15613d7d57868098999a928192613d3e878a611fc7565b515116613d4b8787611fc7565b52019385613d598289611fc7565b510151613d66868c611fc7565b52613d71858b611fc7565b50019290989796613ca1565b8951630a57f30960e31b815260048101859052602490fd5b613ca6565b9091968151881015613dd5578280910197613db58184611fc7565b51613dc08a8d611fc7565b52613dcb898c611fc7565b5001919081613c66565b96829150613c6b565b50613c355f96613c03565b9091939284158215175f14613e035750505090505f905f90565b82810192600160fd1b8082019083011760fe1c613f3a575b5050613e2681614b5c565b93613e3081614b5c565b94613e3b8682614b7c565b90918215613f2b575f9083986f0785ee10d5da46d900f436a000000000808611613f1d575b50670de0b6b3a7640000808b11613f0e575b50633b9aca00808b11613eff575b50612710808b11613ef1575b5098805b613ee05750819061189b989982600a0a9109960195817fcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccd0a93838211900382610100031b9203901c170291614b8f565b60019290920191600a900480613e90565b60049a04998a930192613e8c565b600991939a049901915f613e80565b601291939a049901915f613e72565b85049950602592505f613e60565b5092905061189b949550614b8f565b5f821215613f8e57808413613f80575b7f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb2841315613e1b5790925061189b939491614a9a565b90925061189b939491614b01565b80841215613f4a5790925061189b939491614a9a565b61343d82826141f7565b92909180613fd4576044848460405191637a97930f60e01b835260048301526024820152fd5b90919280155f14613fe957505050505f905f90565b61400293613ff691614c49565b92919490938492614c49565b909391928461401088614b5c565b9161401a86614b5c565b947f161bcca7119915b50764b4abe86529797775a5f171951000000000000000000094604c918688106141c1575b030191600160ff1b98838a018112155f1461418e575050035b5f955f821280614185575b614167575b5f811280614155575b6141375786820103966001600160ff1b038814908161412d575b5080614124575b8061411b575b6140fd5750906140b19291614df5565b915f81136140c4575b5061189b93614b8f565b9091604c82136140f2576140db91600a0a90613921565b9081156140e8575f6140ba565b505050505f905f90565b50505050505f905f90565b876044916040519163d556b11160e01b835260048301526024820152fd5b505f85126140a1565b5082841461409b565b905088145f614094565b604489836040519163d556b11160e01b835260048301526024820152fd5b50806001600160ff1b0301821361407a565b955080870186131561417f5786818703015b95614071565b5f614179565b505f811361406c565b89985090920390506001600160ff1b03819003870182136141b25701860194614061565b5050505050505050505f905f90565b7f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee80000000000000000009650604b9250614048565b811561392b570590565b8082601b82810b83146143ec577d90e40fbeea1d3a4abc8955e946fe31cdcf66f634e10000000000000000008405614398575b8380820b0361438757507b199999999999999999999999999999999999999999999999999999987b0ccccccccccccccccccccccccccccccccccccccccccccccccccccccc84011115614338575b838060030b036142bc575b8084136142a05750506001600160e01b036001925b60e01b91161791565b8303600a0a801561392b576001600160e01b0391071592614297565b92915f84131561430c5750906142d28383614e97565b6142ee57637ffffffe1901600a0a810290637fffffff92614282565b506044916040519163d556b11160e01b835260048301526024820152fd5b637fffffff1992830390604382136140f25761432b91600a0a906141ed565b9182156140e85792614282565b5f198401808060030b1461434c5750614277565b90506001600160e01b039293507b7fffffffffffffffffffffffffffffffffffffffffffffffffffffff915060e01b9260ff1d181617905f90565b600190940193600a9093059261422a565b937f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee80000000000000000008405156143d9576305f5e100600894058094819201955b91505061422a565b620186a0600594058094819201956143d1565b508261427757505050505f90600190565b919291600160ff1b84016144155761189b9350614eb0565b9061189b935f03916145c1565b919291600160ff1b91908015806145af57509061443e91614c49565b9490929091905f8685858582821380156145a6575b614589575b505050508682841860ff1c94860391039081604c03811161456e5701600a0a808205919084614554575b505081019182821860ff1c111561454c57826001600160ff1b031461452e57905f600192135f146144ff57600a9004915b01925b811581176144c357509190565b806144dc575b5080156144d4579190565b505f91508190565b91926144f29203600160ff1b01600a0a906141ed565b600160ff1b91905f6144c9565b600a60037fe66666666666666666666666666666666666666666666666666666666666666792010401916144b3565b604490836040519163d556b11160e01b835260048301526024820152fd5b5090926144b6565b8107614561575b80614482565b60ff1d600117015f61455b565b50505091935061457c579190565b60018160ff1d1790039190565b5f9a50909750909550600160ff1b94509250905086808080614458565b50835f12614453565b156145ba5750509190565b9350919050565b9392919384158115818117614712575050906145dc91614c49565b91949082956145ed82958294614c49565b8096929491969387868482138015614709575b6146f0575b5050505050508682841860ff1c94860391039081604c03811161456e5701600a0a8082059190846146d6575b505081019182821860ff1c11156146ce57826001600160ff1b031461452e57905f600192135f1461469f57600a9004915b01925b8115811761467257509190565b80614682575080156144d4579190565b600160ff1b936146999291038401600a0a906141ed565b5f6144c9565b600a60037fe6666666666666666666666666666666666666666666666666666666666666679201040191614662565b509092614665565b81076146e3575b80614631565b60ff1d600117015f6146dd565b929b5098509196509450925090505f8080808080614605565b50858412614600565b93959390929190156147285750506144d4579190565b945092915050565b60088151106139a4576008015167ffffffffffffffff1667ff0a89c674ee78741490565b916040830192604061478e610bcf606087519401938451906001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b613de9565b9451930161479d815186612765565b6147a5575050565b909350611a33919250519251836133ff565b92915f9060018184145f87128715171717614831575f92808213614823575b03604c81135f82121761481757600a0a90846147f583820293846141ed565b1461480a57505015614806575f9190565b5f90565b9093509015611a33579190565b505015614806575f9190565b5f95600194509250906147d6565b5050505f90565b93929190918083145f83125f87121883158715171717614887575f9280821361487a5703604c81135f82121761481757600a0a90846147f583820293846141ed565b91946001935091906147d6565b50919050565b919082604091031261018257815160048110156101825760209092015160ff811681036101825790565b91925f8312156148df576044838360405191634a7d166b60e01b835260048301526024820152fd5b9192836148f157505090505f90600190565b60ff81168201918083126149b9575f831215614929575050604c1981126144d4575f03600a0a916149228382613921565b9283021490565b909293915f81135f146149af57604d811361498457600a0a92831561392b57835f1904831161495b5750500290600190565b60405163c849483b60e01b815260048101849052602481019290925260ff166044820152606490fd5b5060405163c849483b60e01b81526004810192909252602482015260ff919091166044820152606490fd5b5050905090600190565b60405163c849483b60e01b815260048101869052602481019190915260ff82166044820152606490fd5b9060ff165f03916001600160ff1b0382115f14614a0957600a6001818404940192061590565b909190600190565b9091813b614a4c57614a239192614fee565b50614a2d81613a3a565b159182614a3957505090565b6001600160a01b03918216911614919050565b6020918160645f935160405192630b135d3f60e11b9788855260048501526040602485015286820190604485015e8281018201859052601f01601f191601915afa905f5114601f3d11161690565b909392915f614aaa918184613de9565b9490945f8483019182019412159081614af7575b8115614aed575b50614acf57505090565b604492506040519163d556b11160e01b835260048301526024820152fd5b905083125f614ac5565b8281129150614abe565b614b1693600160fe1b90810193920190613de9565b9081815f821215614b4d575050604b19821261285357614b3b915f03600a0a906141ed565b9081614b45575f90565b600160ff1b90565b93600160ff1b90910192509050565b5f811215611a3357600160ff1b90808203614b75575090565b90505f0390565b905f198183099102908180821091030391565b92939291905f8184181215614c24576001600160ff1b039283831115614c0e57600160ff1b93838503614bc457505050509190565b90919293508514614bde575050600a600191045f03920190565b604051630ed8062160e21b8152600481019190915260248101919091526044810182905260648101849052608490fd5b5090915050600160ff1b811461280c575f039190565b90916001600160ff1b03808411156127d4578514614bde575050600a60019104920190565b9190918015614deb57827f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee800000000000000000080830515614cf9575b507f19999999999999999999999999999999999999999999999999999999999999997f0ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc830110614cea575b8313614cd45791905f90565b919060018060ff1b926001600160ff1b03030190565b9290600a02905f190192614cc8565b6f4b3b4ca85a86c47a098a22400000000080840515614dd9575b507728c87cb5c89a2571ebfdcb54864ada834a00000000000000830515614dc2575b7b097edd871cfda3a5697758bf0e3cbb5ac5741c640000000000000000830515614dae575b7e3899162693736ac531a5a58f1fbb4b746504382ca7e4000000000000000000830515614d9e57820515614d8f575b5f614c7d565b9290600a02905f190192614d89565b9391606402916001190193614d5a565b93916402540be40002916009190193614d5a565b9391678ac7230489e8000002916012190193614d35565b6025198301955092909202915f614d13565b505f915081908190565b90915f198383099280830292838086109503948086039584871015614e735714614e6b579082910960018219018216809204600280826003021880830282030280830282030280830282030280830282030280830282030280920290030293600183805f03040190848311900302920304170290565b505091500490565b60648386866040519263362ced0960e11b8452600484015260248301526044820152fd5b611a3391905f811215614eab575f03615028565b615028565b909291600160ff1b91828101614f425750808414614f3857808413918215614f30578185035b604c811115614f1f5750505f915b15614f1057507f8000000000000000000000000000000000000000000000000000000000000001019190565b92506001600160ff1b03039190565b600a0a90811561392b570491614ee4565b848203614ed6565b505090505f905f90565b93614f4f92945f03614422565b80939180928114614f63575b50505f039190565b915092506001600160ff1b03831461452e57600a600191059201915f80614f5b565b73200e12d10bb0c5e4a17e7018f0f1161919bb9389803b158015614fc3575b614fab5750565b602490604051906373e6d7b360e01b82526004820152fd5b507f1de7d717526cba131d684e312dedbf0852adef9cced9e36798ae4937f7145d41813f1415614fa4565b815191906041830361501e576150179250602082015190606060408401519301515f1a906150b7565b9192909190565b50505f9160029190565b90637ffffff58113156150b157637ffffffe19810190604382136150aa575f82121561507e57637fffffff91505f0301600a0a7b8000000000000000000000000000000000000000000000000000000202111590565b50600a0a801561392b577b80000000000000000000000000000000000000000000000000000001041090565b5050151590565b50505f90565b91907f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0841161512e579160209360809260ff5f9560405194855216868401526040830152606082015282805260015afa1561022c575f516001600160a01b0381161561512457905f905f90565b505f906001905f90565b5050505f916003919056"; /// @dev The runtime bytecode of the contract. bytes constant RUNTIME_CODE = - hex"6080806040526004361015610012575f80fd5b5f3560e01c90816301ffc9a7146117cc575080631f69cb751461156f5780632cb77e9f146115435780632fbc4ba0146113f957806341d1514f146113c25780635cffe9de1461126657806360746119146110e2578063613255ab1461105f57806369c7285614610771578063709fb8a5146104375780639235084d146103e3578063ac9650d814610295578063d7e442ec14610237578063d9d98ce4146101865763fa501182146100c1575f80fd5b34610182576101403660031901126101825767ffffffffffffffff600435818111610182576100f4903690600401611b61565b6024358281116101825761010c903690600401611b61565b60c0366043190112610182576101043583811161018257610131903690600401611d07565b90610124359384116101825761014e61015c943690600401611d07565b9261015761264d565b61222d565b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055005b5f80fd5b34610182576040366003190112610182576001600160a01b036101a7611850565b166040516370a0823160e01b8152306004820152602081602481855afa90811561022c575f916101fa575b50156101e25760206040515f8152f35b60249060405190633c5bf76960e21b82526004820152fd5b90506020813d602011610224575b81610215602093836119d0565b810103126101825751826101d2565b3d9150610208565b6040513d5f823e3d90fd5b346101825760203660031901126101825760043567ffffffffffffffff81116101825761028f61026e61015c92369060040161181f565b919061027861264d565b60405192610285846119b4565b5f84523691611ddb565b90612ae5565b34610182576020806003193601126101825760043567ffffffffffffffff8111610182576102c790369060040161181f565b9190604051926102d6846119b4565b5f84528284016102e582611ab4565b946102f360405196876119d0565b8286526102ff83611ab4565b9361031186880195601f190186612211565b5f5b84811061037557604080518881528951818a018190525f92600582901b83018101918a918c9085015b8287106103495785850386f35b909192938280610365600193603f198a820301865288516118dc565b960192019601959291909261033c565b806103c4886103be61039160019560059d9c9d1b8701876120f1565b929089846040519586938585013782018381015f81528b519283915e015f838201520380845201826119d0565b30613965565b6103ce828a611fd7565b526103d98189611fd7565b5001969596610313565b3461018257600319602036820112610182576004359067ffffffffffffffff821161018257608090823603011261018257610422606091600401612139565b90604051921515835260208301526040820152f35b34610182576003196040368201126101825760043567ffffffffffffffff8082116101825760c082600401938336030112610182576024359081116101825761048490369060040161181f565b9061048d61264d565b6104be6104b96104b46104ad6104a38880612124565b60408101906120f1565b36916119f2565b6138fb565b613950565b801561075f576001101561074d57602483016104da8186611f44565b90501561073b5760448401946104f08682611f44565b9050156107295761055661051e9661054a61051561050e8580612124565b9585611f44565b99909285611f44565b91909261053b6040519761053189611900565b3389523690611a56565b9a60209b8c8901523691611acc565b60408601523691611acc565b60608301526064850135608083015261056e8261268f565b91825f525f875260405f209586541596876105b2575b888860017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055604051908152f35b6001905560a46001600160a01b03917f87491344dfbcf91f6cbbc610cbbeedc85313d37a02df0c93527f7ea5f8db717f83855116604051908152878c8201526060604082015280610606606082018861203f565b0390a1019161061583856120f1565b9050610679575b5050505061066d929161066561064e61028f933390919060405192600284526020840152604083015260608201604052565b906040519160018352602083015260408201604052565b923691611ddb565b82808080808080610584565b6106866104ad84866120f1565b61068f816146ec565b156107025750937fd46c2c56b35c8210e9e712ec3f02242d5fc90187c0ac8ed80cc33626846ec3698961066d9897956106f56106d86106659761064e9761028f9b5116936120f1565b866040519586958652850152606060408501526060840191611d36565b0390a1938395965061061c565b89610725604051928392630c89984b60e31b8452600484015260248301906118dc565b0390fd5b60405163540e5f0b60e01b8152600490fd5b604051636c44ef8f60e01b8152600490fd5b604051633c8270bd60e21b8152600490fd5b604051632cff108b60e21b8152600490fd5b34610182576003196020368201126101825767ffffffffffffffff600435116101825760c09060043536030112610182576107aa61264d565b5f80806107bf60048035608481019101611e8d565b90501561104d5760246004350135926107d7846126f4565b1561103b576060806040516107eb81611968565b6107f3611ee2565b81525f60208201525f6040820152015261080b611ee2565b5061086b61086661084561083b61083561082f608460043501600435600401611e8d565b90611f14565b80611f2f565b6040810190611f44565b602061085e61082f608460043501600435600401611e8d565b013591611f7a565b611d22565b936001600160a01b036108ba6108666108a161089761083561082f608460043501600435600401611e8d565b6060810190611f44565b604061085e61082f608460043501600435600401611e8d565b81604051976108c889611930565b16875216602086015260408501526108ea608460043501600435600401611e8d565b9490506001604051950160051b85016040525f905f5b610914608460043501600435600401611e8d565b9050811080611028575b15610e7557610937608460043501600435600401611e8d565b821015610e61578160051b810135607e1982360301811215610182576080818301360312610182576040519161096c83611968565b8181013567ffffffffffffffff81116101825761098e90369084840101611b61565b835280820160208181013590850152604080820135908501526060013567ffffffffffffffff8111610182576109c79236920101611d07565b606082015280516001600160a01b036109e96040830151602085015190611fd7565b5151166001600160a01b0385511614801590610e2d575b610e1b57610a18602083015160408401519083613035565b610a218161268f565b91825f525f60205260405f2054155f14610a85575051604080513381526001600160a01b039092166020830152810191909152600191907fb70c12fa453793fa6818ec07c91e74363a47aa6a6829dcd9533937fdf30314f390606090a15b01610900565b9190610ab6602084979597015160408501519060608601519060405192610aab846119b4565b5f845233918661307c565b925f93610ace60608201516044600435013590612717565b15610b3557505051604080513381526001600160a01b03909216602083015281019190915260019291907fe3151dc8cb7a54ffc4baabd28c1f241c94d510b5e5b502491ac3cad6c16316d590606090a15b8115610b2d575b5092610a7f565b905088610b26565b610b4260408201516126f4565b158015610e08575b15610b9f57505051604080513381526001600160a01b03909216602083015281019190915260019291907f500b713857325f9e6dcb52ae832eca9109d107ed1aae9cb4928b4c1e13f051aa90606090a1610b1f565b9250925050600196959691610bb8606460043501611feb565b15610d755796610c2897610c3860408401516040880151610bd981836133d5565b15610d6d5750925b610c32848592610c1b610c1560608a01516001600160e01b03601b918660e01d92828816810b928260e01d9216900b613da5565b90613f60565b9d8e9260408d01516134a0565b60408c01526134ca565b996134ca565b98610c4384846134f4565b610c4d8482613552565b60405192338452608060208501526060610c73845160808088015261010087019061203f565b93602081015160a0870152604081015160c0870152015192607f198582030160e0860152835180825260208201906020808260051b8501019601925f5b828110610d0f57505050505092806001979695937f194f1feb3b4d7076a2c272e774e792e0c48bb8c7aa1a9a3671c1cd6da9e6b4c193610d0a96604084015260608301520390a180858c5101808d5260051b8c0152613664565b610b1f565b9091929396602080610d60600193601f198782030189528b51906001600160a01b0382511681526040610d4f8584015160608785015260608401906120be565b9201519060408184039101526118dc565b9901950193929101610cb0565b905092610be1565b610c2890610c386060840151610c32610db3610c1560408801516001600160e01b0394601b90868360e01d9316820b91878260e01d9216900b613da5565b60408a0151610dc281836133d5565b15610e005750915b829c8d916060890151908116155f14610df1575060408801515b96879460408d01516134a0565b610dfb90856133fc565b610de4565b905091610dca565b50610e1660608201516133b2565b610b4a565b60405163936bb5ad60e01b8152600490fd5b506001600160a01b03610e496060830151604085015190611fd7565b5151166001600160a01b036020860151161415610a00565b634e487b7160e01b5f52603260045260245ffd5b50919390610e87606460043501611feb565b1561102257835b6004356004013590610ea082826133d5565b6110045750508490610ec0856001600160a01b0360208701511633612fcc565b505060a46004350190610ed8826004356004016120f1565b905015159081610ffc575b50610f5b575b506001600160a01b03610eff929351163361273e565b50505b8351811015610f275780610f21610f1b60019387611fd7565b5161383d565b01610f02565b5060409160017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f005582519182526020820152f35b90506001600160a01b03602084015116610f856001600160a01b03855116926004356004016120f1565b929091333b1561018257610fcd5f93604051958694859463691f9ed760e01b8652600486015260248501528960448501528a606485015260a0608485015260a4840191611d36565b038183335af190811561022c57859115610ee9579050610fed9150611984565b5f836001600160a01b03610ee9565b905088610ee3565b604492506040519163573b6f4160e01b835260048301526024820152fd5b84610e8e565b5061103660408301516126f4565b61091e565b60405163315f9e2360e21b8152600490fd5b604051639c95219f60e01b8152600490fd5b3461018257602080600319360112610182576024816001600160a01b03611084611850565b16604051928380926370a0823160e01b82523060048301525afa90811561022c575f916110b5575b50604051908152f35b90508181813d83116110db575b6110cc81836119d0565b810103126101825751826110ac565b503d6110c2565b34610182576110f036611890565b92916110fd94919461264d565b6111088383336126c0565b611111816126f4565b15611235578160ff91611129856111ec969533612cff565b61113381836133d5565b1561122f575080935b61114885828533612f6e565b917f8045c25080b0868951141ed0a91720bcad09a8364a2b3109ee1fd49c1f0bc8b860c0611177898833612fcc565b97906001600160a01b0360405192338452169a8b6020840152856040840152886060840152608083015260a0820152a16040519660068852602088015260408701526060860152608085015260a08401521660c082015260e08101604052906040519160018352602083015260408201604052565b90806112185760017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055005b6112279261028f913691611ddb565b80808061015c565b9361113c565b50604051623a3a4d60e21b81523360048201526001600160a01b039190911660248201526044810191909152606490fd5b34610182576080366003190112610182576004356001600160a01b039081811680910361018257611295611866565b6044359167ffffffffffffffff916064358381116101825736602382011215610182578060040135938411610182573660248583010111610182576113229560209216936112e4868587612e8f565b60405196879283926323e30c8b60e01b84523360048501528760248501528860448501525f606485015260a06084850152602460a485019201611d36565b03815f855af193841561022c575f9461138e575b507f439148f0bbc682ca079e46d6e2c2f0c1e3b820f1a291b069d8882abf8cf18dd984036113755761136a93503091612f08565b602060405160018152f35b604051630b6c58a960e31b815260048101859052602490fd5b9093506020813d6020116113ba575b816113aa602093836119d0565b8101031261018257519284611336565b3d915061139d565b346101825760603660031901126101825760206113f16113e0611850565b6113e8611866565b60443591612cff565b604051908152f35b346101825761140736611890565b9280949261141361264d565b61141e8285336126c0565b611427816126f4565b15611513578061143b61148a92863361273e565b9790957f7f9dfa19cf1cc2f806f2f860fbc9c056b601fb1afc0e9b843dfe5c63616268e660806040513381526001600160a01b038416998a60208301528560408301526060820152a1336127e4565b939091856114b85760017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055005b6115079661028f956106659460ff93604051956005875260208701526040860152606085015260808401521660a082015260c08101604052906040519160018352602083015260408201604052565b8080808080808061015c565b506040516306dde9c360e41b81523360048201526001600160a01b03841660248201526044810191909152606490fd5b34610182576020366003190112610182576004355f525f6020526020600160405f205414604051908152f35b34610182576003196040368201126101825767ffffffffffffffff9060043582811161018257806004019160a08236039182011261018257602435848111610182576115bf90369060040161181f565b90936115c961264d565b5f946001600160a01b0394856115de84611d22565b1633036117aa576115f76115f23685611b61565b61268f565b805f525f60205260405f2096600188541461163e575b60208960017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00556040519015158152f35b9091929394959697505f6001985560405196338852826020890152606060408901528161166a8761187c565b166060890152602484013590606219018112156101825783019060a06080890152806116986004840161187c565b166101008901526116ab6024830161187c565b16610120880152604481013560221982360301811215610182570190602460048301359201988211610182578136038913610182577f09d18501db0080ca2d6cd7c17fa7255daff4b2d503ea93b76ff68b6752ea8e63878061066595608461177361028f9a60209f6117329061179d9f9a606061014061064e9d0152610160880191611d36565b6117646117596117456044880185611d56565b605f198a8603810160a08c01529491611d8b565b926064870190611d56565b918784030160c0880152611d8b565b91013560e08301520390a13390919060405192600284526020840152604083015260608201604052565b828080808080808061160d565b6024866117b685611d22565b6040516335252be360e01b815291166004820152fd5b34610182576020366003190112610182576004359063ffffffff60e01b82168092036101825760209163e414309160e01b811490811561180e575b5015158152f35b6301ffc9a760e01b14905083611807565b9181601f840112156101825782359167ffffffffffffffff8311610182576020808501948460051b01011161018257565b600435906001600160a01b038216820361018257565b602435906001600160a01b038216820361018257565b35906001600160a01b038216820361018257565b906080600319830112610182576004356001600160a01b0381168103610182579160243591604435916064359067ffffffffffffffff8211610182576118d89160040161181f565b9091565b805180835260209291819084018484015e5f828201840152601f01601f1916010190565b60a0810190811067ffffffffffffffff82111761191c57604052565b634e487b7160e01b5f52604160045260245ffd5b6060810190811067ffffffffffffffff82111761191c57604052565b6040810190811067ffffffffffffffff82111761191c57604052565b6080810190811067ffffffffffffffff82111761191c57604052565b67ffffffffffffffff811161191c57604052565b60e0810190811067ffffffffffffffff82111761191c57604052565b6020810190811067ffffffffffffffff82111761191c57604052565b90601f8019910116810190811067ffffffffffffffff82111761191c57604052565b92919267ffffffffffffffff821161191c5760405191611a1c601f8201601f1916602001846119d0565b829481845281830111610182578281602093845f960137010152565b9080601f8301121561018257816020611a53933591016119f2565b90565b91906060838203126101825760405190611a6f82611930565b8193611a7a8161187c565b8352611a886020820161187c565b602084015260408101359167ffffffffffffffff831161018257604092611aaf9201611a38565b910152565b67ffffffffffffffff811161191c5760051b60200190565b929192611ad882611ab4565b604092611ae860405192836119d0565b819581835260208093019160061b84019381851161018257915b848310611b1157505050505050565b8583830312610182578386918251611b288161194c565b611b318661187c565b81528286013583820152815201920191611b02565b9080601f8301121561018257816020611a5393359101611acc565b91909160a0818403126101825760405190611b7b82611900565b8193611b868261187c565b835267ffffffffffffffff9160208101358381116101825782611baa918301611a56565b602085015260408101358381116101825782611bc7918301611b46565b6040850152606081013592831161018257611be86080939284938301611b46565b60608501520135910152565b909291611c0084611ab4565b916040611c1060405194856119d0565b839580855260208095019160059160051b8401948086116101825784935b868510611c3f575050505050505050565b67ffffffffffffffff90853582811161018257870190606082850312610182578451611c6a81611930565b611c738361187c565b81528a83013584811161018257830185601f8201121561018257803590611c9982611ab4565b91611ca6895193846119d0565b8083528d808401918b1b83010191888311610182578e809101915b838310611cf757509150508201528583013593841161018257611ce8858c95869501611a38565b86820152815201940193611c2e565b82358152918101918f9101611cc1565b9080601f8301121561018257816020611a5393359101611bf4565b356001600160a01b03811681036101825790565b908060209392818452848401375f828201840152601f01601f1916010190565b9035601e198236030181121561018257016020813591019167ffffffffffffffff8211610182578160061b3603831361018257565b9190808252602080920192915f905b828210611da8575050505090565b909192936001906001600160a01b03611dc08761187c565b16815285830135838201526040908101950193920190611d9a565b90929192611de881611ab4565b91604091611df960405194856119d0565b839581855260208095019160051b8301938185116101825783925b858410611e245750505050505050565b67ffffffffffffffff908435828111610182578601908382860312610182578351611e4e8161194c565b82358481116101825786611e63918501611a56565b81528983013593841161018257611e7e868b95869501611d07565b83820152815201930192611e14565b903590601e1981360301821215610182570180359067ffffffffffffffff821161018257602001918160051b3603831361018257565b60405190611ed082611930565b60606040835f81525f60208201520152565b60405190611eef82611900565b5f608083828152611efe611ec3565b6020820152606060408201526060808201520152565b9015610e6157803590607e1981360301821215610182570190565b903590609e1981360301821215610182570190565b903590601e1981360301821215610182570180359067ffffffffffffffff821161018257602001918160061b3603831361018257565b9190811015610e615760061b0190565b805115610e615760200190565b805160011015610e615760400190565b805160021015610e615760600190565b805160031015610e615760800190565b805160041015610e615760a00190565b8051821015610e615760209160051b010190565b3580151581036101825790565b9081518082526020808093019301915f5b828110612017575050505090565b835180516001600160a01b031686528201518583015260409094019392810192600101612009565b906080806120b56120a361209160406001600160a01b0380895116885260208901519060a060208a01528082511660a08a015260208201511660c08901520151606060e08801526101008701906118dc565b60408701518682036040880152611ff8565b60608601518582036060870152611ff8565b93015191015290565b9081518082526020808093019301915f5b8281106120dd575050505090565b8351855293810193928101926001016120cf565b903590601e1981360301821215610182570180359067ffffffffffffffff82116101825760200191813603831361018257565b903590605e1981360301821215610182570190565b6121506115f26121498380611f2f565b3690611b61565b5f525f602052600160405f2054036121ec5780612170816121dc93611f2f565b6121d461218f6121946020850135938460408701359384923690611b61565b613035565b6121ac6121a18580611f2f565b946060810190611e8d565b92906121cc604051966121be886119b4565b5f88525f3681373690611b61565b933691611bf4565b92339261307c565b6040810151606090910151600192565b505f905f905f90565b5f5b60808110612203575050565b6060828201526020016121f7565b5f5b82811061221f57505050565b606082820152602001612213565b9291926001600160a01b039081815116828451161461263b57606081018051908361225b6064358094611fd7565b515116906040968787015192866122756084358096611fd7565b5151161480159061260a575b6125f9578785015192866122986044358096611fd7565b515116876122a7878651611fd7565b515116146125e8576122b88661268f565b805f525f602052895f20541561259557506122d28861268f565b998a5f525f602052895f20541561253f57899a5087899a51958c6101203389528060208a01528801612304908b61203f565b888103828a0152612315908d61203f565b958260608a01528960808a01528560a08a01528360a4359d8e60c08c015260c4359a8b60e08201528060e4359a8b610100830152037f6fa7f4c28634b0a9d6831401c45ae468195fb63aed07308935c35374ff5d9e3991a1511691519161237b836119b4565b8a5f8452612389948d61307c565b975116908b5191612399836119b4565b8a5f84526123a7948d61307c565b958951976123b489611968565b5f895260208901995f8b528b8a01965f885260608b01965f88526123d88b8b614710565b8d5289528c6123e78b8d614710565b9091528089528c51906123f9916134a0565b918d518a51612407916134a0565b97612411846133b2565b8015612530575b61251e5789958f8f966124e59f9e9c8f976124e09f9b96978f7fd9fa84dd790c969daa5c33d8050dc06b4a9b59d5b42e2be5f5e8ae20447f618d9f9a60a09f9a8f996124a16124b99f9361249c868f976124a79f6124b09c60609f83879361249685612496946124a79f61249c9961249091516134f4565b516134f4565b51613552565b61383d565b51611fd7565b515116336127e4565b50500151611fd7565b50508a5191338352895160208401528a518c840152516060830152516080820152a1613664565b613664565b6001600160e01b0380915116159182612512575b50506125025750565b516321badf1f60e01b8152600490fd5b51161590505f806124f9565b508e51630d86822160e01b8152600490fd5b5061253a896133b2565b612418565b505095519651338152949096166001600160a01b031660208501525050506040810193909352507fb70c12fa453793fa6818ec07c91e74363a47aa6a6829dcd9533937fdf30314f391905080606081015b0390a1565b95519851338152969098166001600160a01b031660208701525050505060408201527fb70c12fa453793fa6818ec07c91e74363a47aa6a6829dcd9533937fdf30314f39350915081905060608101612590565b8851631cd2f1c760e21b8152600490fd5b875163936bb5ad60e01b8152600490fd5b508561261d606089015160a43590611fd7565b515116866126318a88015160443590611fd7565b5151161415612281565b604051630a98f1f360e21b8152600490fd5b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00600281541461267d5760029055565b604051633ee5aeb560e01b8152600490fd5b6040516126ba816126ac602082019460208652604083019061203f565b03601f1981018352826119d0565b51902090565b9091156126cb575050565b6040516305dbdfd960e41b81526001600160a01b03918216600482015291166024820152604490fd5b612713905f60e01d906001600160e01b038160e01d9116601b0b614773565b1290565b90612713916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b6147f4565b92919261274a82613a38565b93612754816133b2565b6127d25784816001600160e01b036127739360e01d9116601b0b614873565b92908093156127a9575b5082908161278d575b5050509190565b6127a1926001600160a01b03309216612f08565b5f8181612786565b9092505f1981146127be57600101915f61277d565b634e487b7160e01b5f52601160045260245ffd5b604051632eaefac360e21b8152600490fd5b939291936127f1836133b2565b61288f578461280d57612805939450612fcc565b50505f905f90565b6001600160a01b039392919380911694855f52602060018152604092835f20961695865f528152825f20825f52815261284a835f205494856134ca565b95612854876133b2565b612877575f97885260018252838820908852815282872091875252909320829055565b835163c5e12af560e01b815260048101889052602490fd5b60405163793a8f5560e01b815260048101849052602490fd5b919060408382031261018257825167ffffffffffffffff908181116101825784019082601f830112156101825781516020926128e382611ab4565b916128f160405193846119d0565b808352848084019160051b830101918683116101825785809101915b8383106129805750505050948281015191821161018257019180601f8401121561018257825161293c81611ab4565b9361294a60405195866119d0565b818552838086019260051b820101928311610182578301905b828210612971575050505090565b81518152908301908301612963565b825181529181019186910161290d565b90808251908181526020809101926020808460051b8301019501935f915b8483106129be5750505050505090565b90919293949584806129dc600193601f198682030187528a516120be565b98019301930191949392906129ae565b91906020928381526001600160a01b0382511684820152838201516040820152612a26604083015160e060608401526101008301906118dc565b9060608301516080820152612a4d608084015192601f1993848483030160a0850152612990565b9260a081015193838382030160c08401528680865192838152019501905f5b818110612a9057505050611a5394955060c060e091015192828503019101526120be565b825187529588019591880191600101612a6c565b90604082019082526020606081936040838201528551809452019301915f5b828110612ad1575050505090565b835185529381019392810192600101612ac3565b916040805191612af483611900565b60048084526020612b068186016121f5565b5f5b8751811015612b3b5780612b1e6001928a611fd7565b51612b298289611fd7565b52612b348188611fd7565b5001612b08565b5092955092939093335f52308352855f2091865190612b598261194c565b612b61611ec3565b8252606085819301528751612b75816119b4565b5f8152885191612b84836119b4565b5f83525f3681375f5b8151811015612cf257612ba08183611fd7565b5190888c8b84519189818401518d8d8251612bc8575b50505050505050506001915001612b8d565b5f612c3797948197948c9794612bf58c956001600160a01b039d8e81818d51169c0151169b015190613b17565b94865199612c028b611998565b8a528901528488015286015260808501528a60a08501528b60c08501525180958194829363d04dfe2360e01b845283016129ec565b03915afa938415612ce8578b915f95612cc2575b508451612c60575b50908b8e89838d8d612bb6565b51015116803b1561018257612c8f925f918c8f84905180978195829463012c676d60e21b845233908401612aa4565b03925af1918215612cb857600192612ca9575b8981612c53565b612cb290611984565b5f612ca2565b8c513d5f823e3d90fd5b612cdf9195503d805f833e612cd781836119d0565b8101906128a8565b9050935f612c4b565b8e513d5f823e3d90fd5b5050505050505050509050565b8215612d34576001600160a01b038091165f52600160205260405f2091165f5260205260405f20905f5260205260405f205490565b909150612d4082613d49565b6001600160a01b03809316906040918251946370a0823160e01b86528416938460048701526020928387602481865afa968715612e56575f97612e60575b5083612d97612d9083612dc79a614a28565b50906141b3565b508651636eb1769f60e11b81526001600160a01b0390941660048501523060248501529297889081906044820190565b0381865afa968715612e56575f97612e25575b50612d90612deb91611a5398614a28565b50612df681836133d5565b15612e1d5750935b5f5260018252825f20905f528152815f20905f8052525f2054906134ca565b905093612dfe565b96508387813d8311612e4f575b612e3c81836119d0565b8101031261018257955195612d90612dda565b503d612e32565b85513d5f823e3d90fd5b96508387813d8311612e88575b612e7781836119d0565b810103126101825795519583612d7e565b503d612e6d565b6040519263a9059cbb60e01b5f526001600160a01b0380931660045260245260205f60448180855af160015f5114811615612ee9575b8360405215612ed357505050565b635274afe760e01b835216600482015260249150fd5b6001811516612eff57813b15153d151616612ec5565b833d5f823e3d90fd5b9092604051936323b872dd60e01b5f526001600160a01b0393848092166004521660245260445260205f60648180855af160015f5114811615612f58575b836040525f60605215612ed357505050565b6001811516612eff57813b15153d151616612f46565b93929193612f7b836133b2565b61288f5784612f8f5761280593945061273e565b6001600160a01b039392919380911694855f52602060018152604092835f20961695865f528152825f20825f52815261284a835f205494856134a0565b90929192612fd981613a38565b93612fe3816133b2565b6130235784816001600160e01b036130029360e01d9116601b0b614873565b50809281613011575050509190565b6001600160a01b036127a19316612e8f565b604051632d1671a360e11b8152600490fd5b91613060906060613055936001600160a01b039485916040880151611fd7565b515116940151611fd7565b5151161461306a57565b604051631cd2f1c760e21b8152600490fd5b9491936132bb919360c0915f61324260409283519461309a86611998565b6130a2611ee2565b86526020958487820152848682015260609781868a809401528260808201528660a082015201526131f28551916130d883611900565b600483526130e78884016121f5565b8d6130f18161268f565b9c896001600160a01b039e8f94859182865116908d5194600386528501528c840152168c820152608081018a5261312786611f8a565b5261313185611f8a565b50885161313d81611930565b6002815289368c83013761315086611f97565b5261315a85611f97565b5060ff8a6131bd8b8501936131a78761318081613178858a51611fd7565b515116613d49565b9751168861318f848951611fd7565b5151168561319e858a51611fd7565b51015191612cff565b966131b3828751611fd7565b5151169451611fd7565b51015192169093929190604051946005865260208601526040850152606084015260808301525f60a083015260c08201604052565b6131fb82611fa7565b5261320581611fa7565b506132298a8d8d60ff8a6131bd8d8501936131a78761318081613178858a51611fd7565b61323282611fb7565b5261323c81611fb7565b50613b17565b95878a511697848b0191825191868184511693015116928a85523087528580862091510151865191613273836119b4565b86835287519561328287611998565b86528886015286850152848885015289608085015260a084015260c08301528351808098819463d04dfe2360e01b8352600483016129ec565b03915afa9687156133a8575f945f98613386575b5084516002811061336f575081838601519501516132f56132ef88611fc7565b51611fb7565b5161330081836133d5565b156133675750925b61332a8685919060405192600284526020840152604083015260608201604052565b61333388611fa7565b5261333d87611fa7565b5082519961334a8b611998565b8a52890152870152850152608084015260a083015260c082015290565b905092613308565b602490835190630fbb8e5560e21b82526004820152fd5b90975061339e9194503d805f833e612cd781836119d0565b939093965f6132cf565b50513d5f823e3d90fd5b6133d1905f60e01d906001600160e01b038160e01d9116601b0b614773565b1390565b906133d1916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b6147f4565b6134236001600160e01b0392838316601b0b9260e01d938160e01d9116601b0b8484613f6a565b90637ffffff58213613473575b9061343a916141b3565b929092158061346b575b61344d57505090565b6044925060405191638eba4d0760e01b835260048301526024820152fd5b508215613444565b61347d8282614e53565b1561343057604483856040519163d556b11160e01b835260048301526024820152fd5b611a5391610c15916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b6143b9565b611a5391610c15916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b61457d565b61354e91608081018261351061350a8351611fc7565b51611fc7565b526135476135416001600160a01b038094515116936135386135328551611fc7565b51611f8a565b51169251611fc7565b51611fa7565b5191612f6e565b5050565b9060808101918061356661350a8551611fb7565b526001600160a01b038092515116916135826135328551611fb7565b51166135916135418551611fb7565b51908161362c576135a1836133b2565b61288f579183917f4cb6e22a3e7e651d7cf0376cff48f20f5007a54147777865be7f5f6c38c50f4a9593612590955f52602090600182526135f7604094855f20835f528452855f20855f528452855f20546134ca565b945f5260018252835f20905f528152825f20915f52525f20555b51604051918291338352604060208401526040830190612990565b9161365d917f4cb6e22a3e7e651d7cf0376cff48f20f5007a54147777865be7f5f6c38c50f4a9593612590956127e4565b5050613611565b60c0810151908151915f926137d8575b506137196020918281510151926001600160a01b039081818187511696015116928660a082019485518252308452604097888320898686510151015160808601518b51916136c1836119b4565b8683528c51936136d0856119b4565b8785528d51966136df88611998565b8752898701528c86015260016060860152608085015260a084015260c08301528851808099819463d04dfe2360e01b8352600483016129ec565b03915afa9485156137ce5787956137b0575b50845161373c575b50505050505050565b81905101510151169051813b156137ac57918491849383613771965180978195829463012c676d60e21b845260048401612aa4565b03925af19081156137a3575061378c575b8080808080613733565b6137968291611984565b6137a05780613782565b80fd5b513d84823e3d90fd5b8480fd5b6137c59195503d8089833e612cd781836119d0565b9050935f61372b565b86513d89823e3d90fd5b6001600160a01b03602080845101510151169060a083015190823b156101825761381b925f928360405180968195829463012c676d60e21b845260048401612aa4565b03925af1801561022c571561367457613835919250611984565b5f905f613674565b6080810161384e6135418251611fb7565b5191821561385b57505050565b6138756135326001600160a01b0380935151169351611fb7565b5116815f5260209160018352604092835f20835f528152835f20855f528152835f2054936001600160e01b0385166138b0575b505050505050565b6138d4955f9284845260018152828420868552815282842091845252812055612fcc565b5f8080806138a8565b81156138e7570490565b634e487b7160e01b5f52601260045260245ffd5b6040815110613943576020810151908051603f1981019081116127be5760051c821161392f5760016020920160051b010190565b505060405161393d816119b4565b5f815290565b5060405161393d816119b4565b80511561396057602001515f1a90565b505f90565b905f8091602081519101845af480806139e3575b156139995750506040513d81523d5f602083013e60203d82010160405290565b156139c057604051639996b31560e01b81526001600160a01b039091166004820152602490fd5b3d156139d1576040513d5f823e3d90fd5b60405163d6bda27560e01b8152600490fd5b503d1515806139795750813b1515613979565b60041115613a0057565b634e487b7160e01b5f52602160045260245ffd5b602090939291936001600160a01b036040820195168152613a34836139f6565b0152565b613a40614f41565b6040805163b7bad1b160e01b81526001600160a01b0383166004820152909182826024815f73200e12d10bb0c5e4a17e7018f0f1161919bb93895af1928315613b0e575f925f94613ad9575b50613a96836139f6565b600183141580613ac7575b613aab5750505090565b5163ee07877f60e01b8152918291610725919060048401613a14565b50613ad1836139f6565b821515613aa1565b90809450613afd9293503d8511613b07575b613af581836119d0565b810190614849565b919091925f613a8c565b503d613aeb565b513d5f823e3d90fd5b90805191613b2483611ab4565b91613b3f604094613b37865195866119d0565b808552611ab4565b601f199460209186013686840137835183519095908015613d3e576001613b959101965b6001978891010197613b8c613b778a611ab4565b99613b8486519b8c6119d0565b808b52611ab4565b01848901612211565b85805f9684516002815233878201523086820152606081018652613bb88b611f8a565b52613bc28a611f8a565b505f925b613cfa575b5050508351613bde575b50505050505090565b85809598979692980181613bf28289611fd7565b52613bfd8188611fd7565b505f925b613c10575b5085969750613bd5565b8451831015613cf5576001600160a01b03613c8781613c2f8689611fd7565b51511686613c3d878a611fd7565b51015187815160051b9101207f19457468657265756d205369676e6564204d6573736167653a0a3332000000005f52601c52603c5f208c613c7e888b611fd7565b5101519161499f565b15613cdd57868098999a928192613c9e878a611fd7565b515116613cab8787611fd7565b52019385613cb98289611fd7565b510151613cc6868c611fd7565b52613cd1858b611fd7565b50019290989796613c01565b8951630a57f30960e31b815260048101859052602490fd5b613c06565b9091968151881015613d35578280910197613d158184611fd7565b51613d208a8d611fd7565b52613d2b898c611fd7565b5001919081613bc6565b96829150613bcb565b50613b955f96613b63565b613d51614f41565b60408051630782d7e160e01b81526001600160a01b03831660048201529091828260248173200e12d10bb0c5e4a17e7018f0f1161919bb93895afa928315613b0e575f925f94613ad95750613a96836139f6565b9091939284158215175f14613dbf5750505090505f905f90565b82810192600160fd1b8082019083011760fe1c613ef6575b5050613de281614b18565b93613dec81614b18565b94613df78682614b38565b90918215613ee7575f9083986f0785ee10d5da46d900f436a000000000808611613ed9575b50670de0b6b3a7640000808b11613eca575b50633b9aca00808b11613ebb575b50612710808b11613ead575b5098805b613e9c575081906118d8989982600a0a9109960195817fcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccd0a93838211900382610100031b9203901c170291614b4b565b60019290920191600a900480613e4c565b60049a04998a930192613e48565b600991939a049901915f613e3c565b601291939a049901915f613e2e565b85049950602592505f613e1c565b509290506118d8949550614b4b565b5f821215613f4a57808413613f3c575b7f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb2841315613dd7579092506118d8939491614a56565b9092506118d8939491614abd565b80841215613f06579092506118d8939491614a56565b61343a82826141b3565b92909180613f90576044848460405191637a97930f60e01b835260048301526024820152fd5b90919280155f14613fa557505050505f905f90565b613fbe93613fb291614c05565b92919490938492614c05565b9093919284613fcc88614b18565b91613fd686614b18565b947f161bcca7119915b50764b4abe86529797775a5f171951000000000000000000094604c9186881061417d575b030191600160ff1b98838a018112155f1461414a575050035b5f955f821280614141575b614123575b5f811280614111575b6140f35786820103966001600160ff1b03881490816140e9575b50806140e0575b806140d7575b6140b957509061406d9291614db1565b915f8113614080575b506118d893614b4b565b9091604c82136140ae5761409791600a0a906138dd565b9081156140a4575f614076565b505050505f905f90565b50505050505f905f90565b876044916040519163d556b11160e01b835260048301526024820152fd5b505f851261405d565b50828414614057565b905088145f614050565b604489836040519163d556b11160e01b835260048301526024820152fd5b50806001600160ff1b03018213614036565b955080870186131561413b5786818703015b9561402d565b5f614135565b505f8113614028565b89985090920390506001600160ff1b038190038701821361416e570186019461401d565b5050505050505050505f905f90565b7f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee80000000000000000009650604b9250614004565b81156138e7570590565b8082601b82810b83146143a8577d90e40fbeea1d3a4abc8955e946fe31cdcf66f634e10000000000000000008405614354575b8380820b0361434357507b199999999999999999999999999999999999999999999999999999987b0ccccccccccccccccccccccccccccccccccccccccccccccccccccccc840111156142f4575b838060030b03614278575b80841361425c5750506001600160e01b036001925b60e01b91161791565b8303600a0a80156138e7576001600160e01b0391071592614253565b92915f8413156142c857509061428e8383614e53565b6142aa57637ffffffe1901600a0a810290637fffffff9261423e565b506044916040519163d556b11160e01b835260048301526024820152fd5b637fffffff1992830390604382136140ae576142e791600a0a906141a9565b9182156140a4579261423e565b5f198401808060030b146143085750614233565b90506001600160e01b039293507b7fffffffffffffffffffffffffffffffffffffffffffffffffffffff915060e01b9260ff1d181617905f90565b600190940193600a909305926141e6565b937f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee8000000000000000000840515614395576305f5e100600894058094819201955b9150506141e6565b620186a06005940580948192019561438d565b508261423357505050505f90600190565b919291600160ff1b84016143d1576118d89350614e6c565b906118d8935f039161457d565b919291600160ff1b919080158061456b5750906143fa91614c05565b9490929091905f868585858282138015614562575b614545575b505050508682841860ff1c94860391039081604c03811161452a5701600a0a808205919084614510575b505081019182821860ff1c111561450857826001600160ff1b03146144ea57905f600192135f146144bb57600a9004915b01925b8115811761447f57509190565b80614498575b508015614490579190565b505f91508190565b91926144ae9203600160ff1b01600a0a906141a9565b600160ff1b91905f614485565b600a60037fe666666666666666666666666666666666666666666666666666666666666667920104019161446f565b604490836040519163d556b11160e01b835260048301526024820152fd5b509092614472565b810761451d575b8061443e565b60ff1d600117015f614517565b505050919350614538579190565b60018160ff1d1790039190565b5f9a50909750909550600160ff1b94509250905086808080614414565b50835f1261440f565b156145765750509190565b9350919050565b93929193841581158181176146ce5750509061459891614c05565b91949082956145a982958294614c05565b80969294919693878684821380156146c5575b6146ac575b5050505050508682841860ff1c94860391039081604c03811161452a5701600a0a808205919084614692575b505081019182821860ff1c111561468a57826001600160ff1b03146144ea57905f600192135f1461465b57600a9004915b01925b8115811761462e57509190565b8061463e57508015614490579190565b600160ff1b936146559291038401600a0a906141a9565b5f614485565b600a60037fe666666666666666666666666666666666666666666666666666666666666667920104019161461e565b509092614621565b810761469f575b806145ed565b60ff1d600117015f614699565b929b5098509196509450925090505f80808080806145c1565b508584126145bc565b93959390929190156146e4575050614490579190565b945092915050565b6008815110613960576008015167ffffffffffffffff1667ff0a89c674ee78741490565b916040830192604061474a610c15606087519401938451906001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b613da5565b94519301614759815186612717565b614761575050565b909350611a53919250519251836133fc565b92915f9060018184145f871287151717176147ed575f928082136147df575b03604c81135f8212176147d357600a0a90846147b183820293846141a9565b146147c6575050156147c2575f9190565b5f90565b9093509015611a53579190565b5050156147c2575f9190565b5f9560019450925090614792565b5050505f90565b93929190918083145f83125f87121883158715171717614843575f928082136148365703604c81135f8212176147d357600a0a90846147b183820293846141a9565b9194600193509190614792565b50919050565b919082604091031261018257815160048110156101825760209092015160ff811681036101825790565b91925f83121561489b576044838360405191634a7d166b60e01b835260048301526024820152fd5b9192836148ad57505090505f90600190565b60ff8116820191808312614975575f8312156148e5575050604c198112614490575f03600a0a916148de83826138dd565b9283021490565b909293915f81135f1461496b57604d811361494057600a0a9283156138e757835f190483116149175750500290600190565b60405163c849483b60e01b815260048101849052602481019290925260ff166044820152606490fd5b5060405163c849483b60e01b81526004810192909252602482015260ff919091166044820152606490fd5b5050905090600190565b60405163c849483b60e01b815260048101869052602481019190915260ff82166044820152606490fd5b9091813b6149da576149b19192614faa565b506149bb816139f6565b1591826149c757505090565b6001600160a01b03918216911614919050565b6020918160645f935160405192630b135d3f60e11b9788855260048501526040602485015286820190604485015e8281018201859052601f01601f191601915afa905f5114601f3d11161690565b9060ff165f03916001600160ff1b0382115f14614a4e57600a6001818404940192061590565b909190600190565b909392915f614a66918184613da5565b9490945f8483019182019412159081614ab3575b8115614aa9575b50614a8b57505090565b604492506040519163d556b11160e01b835260048301526024820152fd5b905083125f614a81565b8281129150614a7a565b614ad293600160fe1b90810193920190613da5565b9081815f821215614b09575050604b19821261280557614af7915f03600a0a906141a9565b9081614b01575f90565b600160ff1b90565b93600160ff1b90910192509050565b5f811215611a5357600160ff1b90808203614b31575090565b90505f0390565b905f198183099102908180821091030391565b92939291905f8184181215614be0576001600160ff1b039283831115614bca57600160ff1b93838503614b8057505050509190565b90919293508514614b9a575050600a600191045f03920190565b604051630ed8062160e21b8152600481019190915260248101919091526044810182905260648101849052608490fd5b5090915050600160ff1b81146127be575f039190565b90916001600160ff1b0380841115612786578514614b9a575050600a60019104920190565b9190918015614da757827f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee800000000000000000080830515614cb5575b507f19999999999999999999999999999999999999999999999999999999999999997f0ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc830110614ca6575b8313614c905791905f90565b919060018060ff1b926001600160ff1b03030190565b9290600a02905f190192614c84565b6f4b3b4ca85a86c47a098a22400000000080840515614d95575b507728c87cb5c89a2571ebfdcb54864ada834a00000000000000830515614d7e575b7b097edd871cfda3a5697758bf0e3cbb5ac5741c640000000000000000830515614d6a575b7e3899162693736ac531a5a58f1fbb4b746504382ca7e4000000000000000000830515614d5a57820515614d4b575b5f614c39565b9290600a02905f190192614d45565b9391606402916001190193614d16565b93916402540be40002916009190193614d16565b9391678ac7230489e8000002916012190193614cf1565b6025198301955092909202915f614ccf565b505f915081908190565b90915f198383099280830292838086109503948086039584871015614e2f5714614e27579082910960018219018216809204600280826003021880830282030280830282030280830282030280830282030280830282030280920290030293600183805f03040190848311900302920304170290565b505091500490565b60648386866040519263362ced0960e11b8452600484015260248301526044820152fd5b611a5391905f811215614e67575f03614fe4565b614fe4565b909291600160ff1b91828101614efe5750808414614ef457808413918215614eec578185035b604c811115614edb5750505f915b15614ecc57507f8000000000000000000000000000000000000000000000000000000000000001019190565b92506001600160ff1b03039190565b600a0a9081156138e7570491614ea0565b848203614e92565b505090505f905f90565b93614f0b92945f036143de565b80939180928114614f1f575b50505f039190565b915092506001600160ff1b0383146144ea57600a600191059201915f80614f17565b73200e12d10bb0c5e4a17e7018f0f1161919bb9389803b158015614f7f575b614f675750565b602490604051906373e6d7b360e01b82526004820152fd5b507f1de7d717526cba131d684e312dedbf0852adef9cced9e36798ae4937f7145d41813f1415614f60565b8151919060418303614fda57614fd39250602082015190606060408401519301515f1a90615073565b9192909190565b50505f9160029190565b90637ffffff581131561506d57637ffffffe1981019060438213615066575f82121561503a57637fffffff91505f0301600a0a7b8000000000000000000000000000000000000000000000000000000202111590565b50600a0a80156138e7577b80000000000000000000000000000000000000000000000000000001041090565b5050151590565b50505f90565b91907f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a084116150ea579160209360809260ff5f9560405194855216868401526040830152606082015282805260015afa1561022c575f516001600160a01b038116156150e057905f905f90565b505f906001905f90565b5050505f916003919056"; + hex"6080806040526004361015610012575f80fd5b5f3560e01c90816301ffc9a71461178f575080631f69cb75146115595780632cb77e9f1461152d5780632fbc4ba0146113cb57806341d1514f146113945780635cffe9de14611238578063607461191461109c578063613255ab1461101957806369c728561461072b578063709fb8a5146104375780639235084d146103e3578063ac9650d814610295578063d7e442ec14610237578063d9d98ce4146101865763fa501182146100c1575f80fd5b34610182576101403660031901126101825767ffffffffffffffff600435818111610182576100f4903690600401611b41565b6024358281116101825761010c903690600401611b41565b60c0366043190112610182576101043583811161018257610131903690600401611ce7565b90610124359384116101825761014e61015c943690600401611ce7565b9261015761263d565b61221d565b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055005b5f80fd5b34610182576040366003190112610182576001600160a01b036101a7611813565b166040516370a0823160e01b8152306004820152602081602481855afa90811561022c575f916101fa575b50156101e25760206040515f8152f35b60249060405190633c5bf76960e21b82526004820152fd5b90506020813d602011610224575b81610215602093836119b0565b810103126101825751826101d2565b3d9150610208565b6040513d5f823e3d90fd5b346101825760203660031901126101825760043567ffffffffffffffff81116101825761028f61026e61015c9236906004016117e2565b919061027861263d565b6040519261028584611994565b5f84523691611dbb565b906128f6565b34610182576020806003193601126101825760043567ffffffffffffffff8111610182576102c79036906004016117e2565b9190604051926102d684611994565b5f84528284016102e582611a94565b946102f360405196876119b0565b8286526102ff83611a94565b9361031186880195601f190186612201565b5f5b84811061037557604080518881528951818a018190525f92600582901b83018101918a918c9085015b8287106103495785850386f35b909192938280610365600193603f198a8203018652885161189f565b960192019601959291909261033c565b806103c4886103be61039160019560059d9c9d1b8701876120e1565b929089846040519586938585013782018381015f81528b519283915e015f838201520380845201826119b0565b306139a9565b6103ce828a611fc7565b526103d98189611fc7565b5001969596610313565b3461018257600319602036820112610182576004359067ffffffffffffffff821161018257608090823603011261018257610422606091600401612129565b90604051921515835260208301526040820152f35b34610182576003196040368201126101825760043567ffffffffffffffff8082116101825760c08260040193833603011261018257602435908111610182576104849036906004016117e2565b61048f92919261263d565b6104c06104bb6104b66104af6104a58880612114565b60408101906120e1565b36916119d2565b61393f565b613994565b801561071957600110156107075760248201926104dd8486611f24565b9050156106f55760448301936104f38587611f24565b9050156106e3576105596105219561054d6105186105118a80612114565b948a611f24565b9890928a611f24565b91909261053e60405196610534886118c3565b3388523690611a36565b9960209a8b8801523691611aac565b60408501523691611aac565b6060820152606484013560808201526105718161267f565b90815f525f865260405f209485541595866105b5575b878760017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055604051908152f35b6001905560a46001600160a01b03917f87491344dfbcf91f6cbbc610cbbeedc85313d37a02df0c93527f7ea5f8db717f83855116604051908152868b8201526060604082015280610609606082018861202f565b0390a10191610618838a6120e1565b905061063b575b50505061062e939495506126b0565b8190838080808080610587565b6106486104af848b6120e1565b61065181614730565b156106bc57509761068f7fd46c2c56b35c8210e9e712ec3f02242d5fc90187c0ac8ed80cc33626846ec369936106af9361062e999a9b5116926120e1565b92906040519384938452868c850152606060408501526060840191611d16565b0390a1859493878061061f565b886106df604051928392630c89984b60e31b84526004840152602483019061189f565b0390fd5b60405163540e5f0b60e01b8152600490fd5b604051636c44ef8f60e01b8152600490fd5b604051633c8270bd60e21b8152600490fd5b604051632cff108b60e21b8152600490fd5b34610182576003196020368201126101825767ffffffffffffffff600435116101825760c090600435360301126101825761076461263d565b5f808061077960048035608481019101611e6d565b90501561100757602460043501359261079184612742565b15610ff5576060806040516107a58161192b565b6107ad611ec2565b81525f60208201525f604082015201526107c5611ec2565b506108256108206107ff6107f56107ef6107e9608460043501600435600401611e6d565b90611ef4565b80611f0f565b6040810190611f24565b60206108186107e9608460043501600435600401611e6d565b013591611f5a565b611d02565b936001600160a01b0361087461082061085b6108516107ef6107e9608460043501600435600401611e6d565b6060810190611f24565b60406108186107e9608460043501600435600401611e6d565b8160405197610882896118f3565b16875216602086015260408501526108a4608460043501600435600401611e6d565b9490506001604051950160051b85016040525f905f5b6108ce608460043501600435600401611e6d565b9050811080610fe2575b15610e2f576108f1608460043501600435600401611e6d565b821015610e1b578160051b810135607e198236030181121561018257608081830136031261018257604051916109268361192b565b8181013567ffffffffffffffff81116101825761094890369084840101611b41565b835280820160208181013590850152604080820135908501526060013567ffffffffffffffff8111610182576109819236920101611ce7565b606082015280516001600160a01b036109a36040830151602085015190611fc7565b5151166001600160a01b0385511614801590610de7575b610dd5576109d2602083015160408401519083612e36565b6109db8161267f565b91825f525f60205260405f2054155f14610a3f575051604080513381526001600160a01b039092166020830152810191909152600191907fb70c12fa453793fa6818ec07c91e74363a47aa6a6829dcd9533937fdf30314f390606090a15b016108ba565b9190610a70602084979597015160408501519060608601519060405192610a6584611994565b5f8452339186613079565b925f93610a8860608201516044600435013590612765565b15610aef57505051604080513381526001600160a01b03909216602083015281019190915260019291907fe3151dc8cb7a54ffc4baabd28c1f241c94d510b5e5b502491ac3cad6c16316d590606090a15b8115610ae7575b5092610a39565b905088610ae0565b610afc6040820151612742565b158015610dc2575b15610b5957505051604080513381526001600160a01b03909216602083015281019190915260019291907f500b713857325f9e6dcb52ae832eca9109d107ed1aae9cb4928b4c1e13f051aa90606090a1610ad9565b9250925050600196959691610b72606460043501611fdb565b15610d2f5796610be297610bf260408401516040880151610b9381836133d8565b15610d275750925b610bec848592610bd5610bcf60608a01516001600160e01b03601b918660e01d92828816810b928260e01d9216900b613de9565b90613fa4565b9d8e9260408d01516134a3565b60408c01526134cd565b996134cd565b98610bfd84846134f7565b610c078482613555565b60405192338452608060208501526060610c2d845160808088015261010087019061202f565b93602081015160a0870152604081015160c0870152015192607f198582030160e0860152835180825260208201906020808260051b8501019601925f5b828110610cc957505050505092806001979695937f194f1feb3b4d7076a2c272e774e792e0c48bb8c7aa1a9a3671c1cd6da9e6b4c193610cc496604084015260608301520390a180858c5101808d5260051b8c01526136a8565b610ad9565b9091929396602080610d1a600193601f198782030189528b51906001600160a01b0382511681526040610d098584015160608785015260608401906120ae565b92015190604081840391015261189f565b9901950193929101610c6a565b905092610b9b565b610be290610bf26060840151610bec610d6d610bcf60408801516001600160e01b0394601b90868360e01d9316820b91878260e01d9216900b613de9565b60408a0151610d7c81836133d8565b15610dba5750915b829c8d916060890151908116155f14610dab575060408801515b96879460408d01516134a3565b610db590856133ff565b610d9e565b905091610d84565b50610dd060608201516133b5565b610b04565b60405163936bb5ad60e01b8152600490fd5b506001600160a01b03610e036060830151604085015190611fc7565b5151166001600160a01b0360208601511614156109ba565b634e487b7160e01b5f52603260045260245ffd5b50919390610e41606460043501611fdb565b15610fdc57835b6004356004013590610e5a82826133d8565b610fbe5750508490610e7a856001600160a01b0360208701511633612dcd565b505060a46004350190610e92826004356004016120e1565b905015159081610fb6575b50610f15575b506001600160a01b03610eb9929351163361278c565b50505b8351811015610ee15780610edb610ed560019387611fc7565b51613881565b01610ebc565b5060409160017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f005582519182526020820152f35b90506001600160a01b03602084015116610f3f6001600160a01b03855116926004356004016120e1565b929091333b1561018257610f875f93604051958694859463691f9ed760e01b8652600486015260248501528960448501528a606485015260a0608485015260a4840191611d16565b038183335af190811561022c57859115610ea3579050610fa79150611947565b5f836001600160a01b03610ea3565b905088610e9d565b604492506040519163573b6f4160e01b835260048301526024820152fd5b84610e48565b50610ff06040830151612742565b6108d8565b60405163315f9e2360e21b8152600490fd5b604051639c95219f60e01b8152600490fd5b3461018257602080600319360112610182576024816001600160a01b0361103e611813565b16604051928380926370a0823160e01b82523060048301525afa90811561022c575f9161106f575b50604051908152f35b90508181813d8311611095575b61108681836119b0565b81010312610182575182611066565b503d61107c565b34610182576110aa36611853565b6110b261263d565b6110bd84863361270e565b6110c683612742565b1561120b576110d6848633612b00565b6110e081856133d8565b15611205575082935b6110f585828833612d6f565b9690947f8045c25080b0868951141ed0a91720bcad09a8364a2b3109ee1fd49c1f0bc8b860c0611126898533612dcd565b94906001600160a01b0360405192338452169a8b6020840152876040840152856060840152608083015260a0820152a1836111815760017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055005b6111f89761028f9660ff946040519960078b5260208b015260408a01526060890152608088015260a08701521660c08501523360e0850152610100840193846040526111cc85611977565b600785526111dd61012082016121e5565b6111e685611fb7565b526111f084611fb7565b503691611dbb565b808080808080808061015c565b936110e9565b604051623a3a4d60e21b81523360048201526001600160a01b038616602482015260448101859052606490fd5b34610182576080366003190112610182576004356001600160a01b039081811680910361018257611267611829565b6044359167ffffffffffffffff916064358381116101825736602382011215610182578060040135938411610182573660248583010111610182576112f49560209216936112b6868587612c90565b60405196879283926323e30c8b60e01b84523360048501528760248501528860448501525f606485015260a06084850152602460a485019201611d16565b03815f855af193841561022c575f94611360575b507f439148f0bbc682ca079e46d6e2c2f0c1e3b820f1a291b069d8882abf8cf18dd984036113475761133c93503091612d09565b602060405160018152f35b604051630b6c58a960e31b815260048101859052602490fd5b9093506020813d60201161138c575b8161137c602093836119b0565b8101031261018257519284611308565b3d915061136f565b346101825760603660031901126101825760206113c36113b2611813565b6113ba611829565b60443591612b00565b604051908152f35b34610182576113d936611853565b839493926113e561263d565b6113f084863361270e565b6113f981612742565b156114ff578061140d61145c92873361278c565b9590967f7f9dfa19cf1cc2f806f2f860fbc9c056b601fb1afc0e9b843dfe5c63616268e660806040513381526001600160a01b0384169a8b60208301528560408301526060820152a133612832565b9590938261148a5760017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055005b6114f39661028f9560ff936040519860068a5260208a01526040890152606088015260808701521660a08501523360c085015260e0840193846040526114cf85611977565b600785526114e061010082016121e5565b6114e985611fa7565b526111f084611fa7565b8080808080808061015c565b6040516306dde9c360e41b81523360048201526001600160a01b038616602482015260448101859052606490fd5b34610182576020366003190112610182576004355f525f6020526020600160405f205414604051908152f35b3461018257600319604036820112610182576004359067ffffffffffffffff808311610182578260040160a08436039384011261018257602435828111610182576115a89036906004016117e2565b906115b161263d565b5f946001600160a01b0394856115c686611d02565b16330361176d576115df6115da3687611b41565b61267f565b91825f525f60205260405f20966001885414611627575b60208960017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00556040519015158152f35b9091929394959697505f600198556040519133835284602084015260606040840152816116538961183f565b16606084015260248a013590606219018112156101825789019060a06080840152806116816004840161183f565b166101008401526116946024830161183f565b16610120830152604481013560221982360301811215610182570195602460048801359701928711610182578636038313610182576020986084611750849361170f7f09d18501db0080ca2d6cd7c17fa7255daff4b2d503ea93b76ff68b6752ea8e63976117609c6060610140890152610160880191611d16565b6117416117366117226044880185611d36565b605f198a8603810160a08c01529491611d6b565b926064870190611d36565b918784030160c0880152611d6b565b91013560e08301520390a16126b0565b82808080808080806115f6565b60248661177987611d02565b6040516335252be360e01b815291166004820152fd5b34610182576020366003190112610182576004359063ffffffff60e01b82168092036101825760209163e414309160e01b81149081156117d1575b5015158152f35b6301ffc9a760e01b149050836117ca565b9181601f840112156101825782359167ffffffffffffffff8311610182576020808501948460051b01011161018257565b600435906001600160a01b038216820361018257565b602435906001600160a01b038216820361018257565b35906001600160a01b038216820361018257565b906080600319830112610182576004356001600160a01b0381168103610182579160243591604435916064359067ffffffffffffffff82116101825761189b916004016117e2565b9091565b805180835260209291819084018484015e5f828201840152601f01601f1916010190565b60a0810190811067ffffffffffffffff8211176118df57604052565b634e487b7160e01b5f52604160045260245ffd5b6060810190811067ffffffffffffffff8211176118df57604052565b6040810190811067ffffffffffffffff8211176118df57604052565b6080810190811067ffffffffffffffff8211176118df57604052565b67ffffffffffffffff81116118df57604052565b60e0810190811067ffffffffffffffff8211176118df57604052565b610100810190811067ffffffffffffffff8211176118df57604052565b6020810190811067ffffffffffffffff8211176118df57604052565b90601f8019910116810190811067ffffffffffffffff8211176118df57604052565b92919267ffffffffffffffff82116118df57604051916119fc601f8201601f1916602001846119b0565b829481845281830111610182578281602093845f960137010152565b9080601f8301121561018257816020611a33933591016119d2565b90565b91906060838203126101825760405190611a4f826118f3565b8193611a5a8161183f565b8352611a686020820161183f565b602084015260408101359167ffffffffffffffff831161018257604092611a8f9201611a18565b910152565b67ffffffffffffffff81116118df5760051b60200190565b929192611ab882611a94565b604092611ac860405192836119b0565b819581835260208093019160061b84019381851161018257915b848310611af157505050505050565b8583830312610182578386918251611b088161190f565b611b118661183f565b81528286013583820152815201920191611ae2565b9080601f8301121561018257816020611a3393359101611aac565b91909160a0818403126101825760405190611b5b826118c3565b8193611b668261183f565b835267ffffffffffffffff9160208101358381116101825782611b8a918301611a36565b602085015260408101358381116101825782611ba7918301611b26565b6040850152606081013592831161018257611bc86080939284938301611b26565b60608501520135910152565b909291611be084611a94565b916040611bf060405194856119b0565b839580855260208095019160059160051b8401948086116101825784935b868510611c1f575050505050505050565b67ffffffffffffffff90853582811161018257870190606082850312610182578451611c4a816118f3565b611c538361183f565b81528a83013584811161018257830185601f8201121561018257803590611c7982611a94565b91611c86895193846119b0565b8083528d808401918b1b83010191888311610182578e809101915b838310611cd757509150508201528583013593841161018257611cc8858c95869501611a18565b86820152815201940193611c0e565b82358152918101918f9101611ca1565b9080601f8301121561018257816020611a3393359101611bd4565b356001600160a01b03811681036101825790565b908060209392818452848401375f828201840152601f01601f1916010190565b9035601e198236030181121561018257016020813591019167ffffffffffffffff8211610182578160061b3603831361018257565b9190808252602080920192915f905b828210611d88575050505090565b909192936001906001600160a01b03611da08761183f565b16815285830135838201526040908101950193920190611d7a565b90929192611dc881611a94565b91604091611dd960405194856119b0565b839581855260208095019160051b8301938185116101825783925b858410611e045750505050505050565b67ffffffffffffffff908435828111610182578601908382860312610182578351611e2e8161190f565b82358481116101825786611e43918501611a36565b81528983013593841161018257611e5e868b95869501611ce7565b83820152815201930192611df4565b903590601e1981360301821215610182570180359067ffffffffffffffff821161018257602001918160051b3603831361018257565b60405190611eb0826118f3565b60606040835f81525f60208201520152565b60405190611ecf826118c3565b5f608083828152611ede611ea3565b6020820152606060408201526060808201520152565b9015610e1b57803590607e1981360301821215610182570190565b903590609e1981360301821215610182570190565b903590601e1981360301821215610182570180359067ffffffffffffffff821161018257602001918160061b3603831361018257565b9190811015610e1b5760061b0190565b805115610e1b5760200190565b805160011015610e1b5760400190565b805160021015610e1b5760600190565b805160031015610e1b5760800190565b805160041015610e1b5760a00190565b805160051015610e1b5760c00190565b8051821015610e1b5760209160051b010190565b3580151581036101825790565b9081518082526020808093019301915f5b828110612007575050505090565b835180516001600160a01b031686528201518583015260409094019392810192600101611ff9565b906080806120a561209361208160406001600160a01b0380895116885260208901519060a060208a01528082511660a08a015260208201511660c08901520151606060e088015261010087019061189f565b60408701518682036040880152611fe8565b60608601518582036060870152611fe8565b93015191015290565b9081518082526020808093019301915f5b8281106120cd575050505090565b8351855293810193928101926001016120bf565b903590601e1981360301821215610182570180359067ffffffffffffffff82116101825760200191813603831361018257565b903590605e1981360301821215610182570190565b6121406115da6121398380611f0f565b3690611b41565b5f525f602052600160405f2054036121dc5780612160816121cc93611f0f565b6121c461217f6121846020850135938460408701359384923690611b41565b612e36565b61219c6121918580611f0f565b946060810190611e6d565b92906121bc604051966121ae88611994565b5f88525f3681373690611b41565b933691611bd4565b923392613079565b6040810151606090910151600192565b505f905f905f90565b5f5b60e081106121f3575050565b6060828201526020016121e7565b5f5b82811061220f57505050565b606082820152602001612203565b9291926001600160a01b039081815116828451161461262b57606081018051908361224b6064358094611fc7565b515116906040968787015192866122656084358096611fc7565b515116148015906125fa575b6125e9578785015192866122886044358096611fc7565b51511687612297878651611fc7565b515116146125d8576122a88661267f565b805f525f602052895f20541561258557506122c28861267f565b998a5f525f602052895f20541561252f57899a5087899a51958c6101203389528060208a015288016122f4908b61202f565b888103828a0152612305908d61202f565b958260608a01528960808a01528560a08a01528360a4359d8e60c08c015260c4359a8b60e08201528060e4359a8b610100830152037f6fa7f4c28634b0a9d6831401c45ae468195fb63aed07308935c35374ff5d9e3991a1511691519161236b83611994565b8a5f8452612379948d613079565b975116908b519161238983611994565b8a5f8452612397948d613079565b958951976123a48961192b565b5f895260208901995f8b528b8a01965f885260608b01965f88526123c88b8b614754565b8d5289528c6123d78b8d614754565b9091528089528c51906123e9916134a3565b918d518a516123f7916134a3565b97612401846133b5565b8015612520575b61250e5789958f8f966124d59f9e9c8f976124d09f9b96978f7fd9fa84dd790c969daa5c33d8050dc06b4a9b59d5b42e2be5f5e8ae20447f618d9f9a60a09f9a8f996124916124a99f9361248c868f976124979f6124a09c60609f83879361248685612486946124979f61248c9961248091516134f7565b516134f7565b51613555565b613881565b51611fc7565b51511633612832565b50500151611fc7565b50508a5191338352895160208401528a518c840152516060830152516080820152a16136a8565b6136a8565b6001600160e01b0380915116159182612502575b50506124f25750565b516321badf1f60e01b8152600490fd5b51161590505f806124e9565b508e51630d86822160e01b8152600490fd5b5061252a896133b5565b612408565b505095519651338152949096166001600160a01b031660208501525050506040810193909352507fb70c12fa453793fa6818ec07c91e74363a47aa6a6829dcd9533937fdf30314f391905080606081015b0390a1565b95519851338152969098166001600160a01b031660208701525050505060408201527fb70c12fa453793fa6818ec07c91e74363a47aa6a6829dcd9533937fdf30314f39350915081905060608101612580565b8851631cd2f1c760e21b8152600490fd5b875163936bb5ad60e01b8152600490fd5b508561260d606089015160a43590611fc7565b515116866126218a88015160443590611fc7565b5151161415612271565b604051630a98f1f360e21b8152600490fd5b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00600281541461266d5760029055565b604051633ee5aeb560e01b8152600490fd5b6040516126aa8161269c602082019460208652604083019061202f565b03601f1981018352826119b0565b51902090565b61270c92916126db61028f923390919060405192600284526020840152604083015260608201604052565b92604051936126e985611977565b600785526126f9602086016121e5565b61270285611f6a565b526111f084611f6a565b565b909115612719575050565b6040516305dbdfd960e41b81526001600160a01b03918216600482015291166024820152604490fd5b612761905f60e01d906001600160e01b038160e01d9116601b0b6147b7565b1290565b90612761916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b614838565b92919261279882613a7c565b936127a2816133b5565b6128205784816001600160e01b036127c19360e01d9116601b0b6148b7565b92908093156127f7575b508290816127db575b5050509190565b6127ef926001600160a01b03309216612d09565b5f81816127d4565b9092505f19811461280c57600101915f6127cb565b634e487b7160e01b5f52601160045260245ffd5b604051632eaefac360e21b8152600490fd5b9392919361283f836133b5565b6128dd578461285b57612853939450612dcd565b50505f905f90565b6001600160a01b039392919380911694855f52602060018152604092835f20961695865f528152825f20825f528152612898835f205494856134cd565b956128a2876133b5565b6128c5575f97885260018252838820908852815282872091875252909320829055565b835163c5e12af560e01b815260048101889052602490fd5b60405163793a8f5560e01b815260048101849052602490fd5b60408051929361290584611977565b6007845260206129168186016121e5565b5f5b845181101561294b578061292e60019287611fc7565b516129398289611fc7565b526129448188611fc7565b5001612918565b50925092939093335f52308352845f20928551916129688361190f565b612970611ea3565b83526060828194015286519361298585611994565b5f855287519061299482611994565b5f82525f3681375f5b8151811015612af4576129b08183611fc7565b51908a82510151516129c7575b600191500161299d565b8a89875f6129d8828701518a613bb7565b938651946001600160a01b0394828680895116968901511697015190835197612a008961195b565b88528d88015282870152828d87015260808601528c60a08601528860c086015251809263d04dfe2360e01b82528180612a3d600498898301612fc1565b03915afa948515612aea5789915f96612ac4575b508551612a62575b505050506129bd565b5101511692833b1561018257612a90935f92838f5180978195829463012c676d60e21b845233908401613667565b03925af1918215612aba57600192612aab575b808781612a59565b612ab490611947565b5f612aa3565b8b513d5f823e3d90fd5b612ae19196503d805f833e612ad981836119b0565b810190612e7d565b9050945f612a51565b8e513d5f823e3d90fd5b50505050505050509050565b8215612b35576001600160a01b038091165f52600160205260405f2091165f5260205260405f20905f5260205260405f205490565b909150612b4182613b5b565b6001600160a01b03809316906040918251946370a0823160e01b86528416938460048701526020928387602481865afa968715612c57575f97612c61575b5083612b98612b9183612bc89a6149e3565b50906141f7565b508651636eb1769f60e11b81526001600160a01b0390941660048501523060248501529297889081906044820190565b0381865afa968715612c57575f97612c26575b50612b91612bec91611a33986149e3565b50612bf781836133d8565b15612c1e5750935b5f5260018252825f20905f528152815f20905f8052525f2054906134cd565b905093612bff565b96508387813d8311612c50575b612c3d81836119b0565b8101031261018257955195612b91612bdb565b503d612c33565b85513d5f823e3d90fd5b96508387813d8311612c89575b612c7881836119b0565b810103126101825795519583612b7f565b503d612c6e565b6040519263a9059cbb60e01b5f526001600160a01b0380931660045260245260205f60448180855af160015f5114811615612cea575b8360405215612cd457505050565b635274afe760e01b835216600482015260249150fd5b6001811516612d0057813b15153d151616612cc6565b833d5f823e3d90fd5b9092604051936323b872dd60e01b5f526001600160a01b0393848092166004521660245260445260205f60648180855af160015f5114811615612d59575b836040525f60605215612cd457505050565b6001811516612d0057813b15153d151616612d47565b93929193612d7c836133b5565b6128dd5784612d905761285393945061278c565b6001600160a01b039392919380911694855f52602060018152604092835f20961695865f528152825f20825f528152612898835f205494856134a3565b90929192612dda81613a7c565b93612de4816133b5565b612e245784816001600160e01b03612e039360e01d9116601b0b6148b7565b50809281612e12575050509190565b6001600160a01b036127ef9316612c90565b604051632d1671a360e11b8152600490fd5b91612e61906060612e56936001600160a01b039485916040880151611fc7565b515116940151611fc7565b51511614612e6b57565b604051631cd2f1c760e21b8152600490fd5b919060408382031261018257825167ffffffffffffffff908181116101825784019082601f83011215610182578151602092612eb882611a94565b91612ec660405193846119b0565b808352848084019160051b830101918683116101825785809101915b838310612f555750505050948281015191821161018257019180601f84011215610182578251612f1181611a94565b93612f1f60405195866119b0565b818552838086019260051b820101928311610182578301905b828210612f46575050505090565b81518152908301908301612f38565b8251815291810191869101612ee2565b90808251908181526020809101926020808460051b8301019501935f915b848310612f935750505050505090565b9091929394958480612fb1600193601f198682030187528a516120ae565b9801930193019194939290612f83565b91906020928381526001600160a01b0382511684820152838201516040820152612ffb604083015160e0606084015261010083019061189f565b9060608301516080820152613022608084015192601f1993848483030160a0850152612f65565b9260a081015193838382030160c08401528680865192838152019501905f5b81811061306557505050611a3394955060c060e091015192828503019101526120ae565b825187529588019591880191600101613041565b9491936132be919360c0915f6132456040928351946130978661195b565b61309f611ec2565b86526020958487820152848682015260609781868a809401528260808201528660a082015201526131f58551916130d583611977565b600783526130e48884016121e5565b8d6130ee8161267f565b9c896001600160a01b039e8f94859182865116908d5194600486528501528c840152168c82015233608082015260a081018a5261312a86611f6a565b5261313485611f6a565b508851613140816118f3565b6002815289368c83013761315386611f77565b5261315d85611f77565b5060ff8a6131c08b8501936131aa876131838161317b858a51611fc7565b515116613b5b565b97511688613192848951611fc7565b515116856131a1858a51611fc7565b51015191612b00565b966131b6828751611fc7565b5151169451611fc7565b51015192169093929190604051946005865260208601526040850152606084015260808301525f60a083015260c08201604052565b6131fe82611f87565b5261320881611f87565b5061322c8a8d8d60ff8a6131c08d8501936131aa876131838161317b858a51611fc7565b61323582611f97565b5261323f81611f97565b50613bb7565b95878a511697848b0191825191868184511693015116928a8552308752858086209151015186519161327683611994565b8683528751956132858761195b565b86528886015286850152848885015289608085015260a084015260c08301528351808098819463d04dfe2360e01b835260048301612fc1565b03915afa9687156133ab575f945f98613389575b50845160028110613372575081838601519501516132f86132f288611fa7565b51611f97565b5161330381836133d8565b1561336a5750925b61332d8685919060405192600284526020840152604083015260608201604052565b61333688611f87565b5261334087611f87565b5082519961334d8b61195b565b8a52890152870152850152608084015260a083015260c082015290565b90509261330b565b602490835190630fbb8e5560e21b82526004820152fd5b9097506133a19194503d805f833e612ad981836119b0565b939093965f6132d2565b50513d5f823e3d90fd5b6133d4905f60e01d906001600160e01b038160e01d9116601b0b6147b7565b1390565b906133d4916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b614838565b6134266001600160e01b0392838316601b0b9260e01d938160e01d9116601b0b8484613fae565b90637ffffff58213613476575b9061343d916141f7565b929092158061346e575b61345057505090565b6044925060405191638eba4d0760e01b835260048301526024820152fd5b508215613447565b6134808282614e97565b1561343357604483856040519163d556b11160e01b835260048301526024820152fd5b611a3391610bcf916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b6143fd565b611a3391610bcf916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b6145c1565b61355191608081018261351361350d8351611fa7565b51611fa7565b5261354a6135446001600160a01b0380945151169361353b6135358551611fa7565b51611f6a565b51169251611fa7565b51611f87565b5191612d6f565b5050565b9060808101918061356961350d8551611f97565b526001600160a01b038092515116916135856135358551611f97565b51166135946135448551611f97565b51908161362f576135a4836133b5565b6128dd579183917f4cb6e22a3e7e651d7cf0376cff48f20f5007a54147777865be7f5f6c38c50f4a9593612580955f52602090600182526135fa604094855f20835f528452855f20855f528452855f20546134cd565b945f5260018252835f20905f528152825f20915f52525f20555b51604051918291338352604060208401526040830190612f65565b91613660917f4cb6e22a3e7e651d7cf0376cff48f20f5007a54147777865be7f5f6c38c50f4a959361258095612832565b5050613614565b90604082019082526020606081936040838201528551809452019301915f5b828110613694575050505090565b835185529381019392810192600101613686565b60c0810151908151915f9261381c575b5061375d6020918281510151926001600160a01b039081818187511696015116928660a082019485518252308452604097888320898686510151015160808601518b519161370583611994565b8683528c519361371485611994565b8785528d51966137238861195b565b8752898701528c86015260016060860152608085015260a084015260c08301528851808099819463d04dfe2360e01b835260048301612fc1565b03915afa9485156138125787956137f4575b508451613780575b50505050505050565b81905101510151169051813b156137f0579184918493836137b5965180978195829463012c676d60e21b845260048401613667565b03925af19081156137e757506137d0575b8080808080613777565b6137da8291611947565b6137e457806137c6565b80fd5b513d84823e3d90fd5b8480fd5b6138099195503d8089833e612ad981836119b0565b9050935f61376f565b86513d89823e3d90fd5b6001600160a01b03602080845101510151169060a083015190823b156101825761385f925f928360405180968195829463012c676d60e21b845260048401613667565b03925af1801561022c57156136b857613879919250611947565b5f905f6136b8565b608081016138926135448251611f97565b5191821561389f57505050565b6138b96135356001600160a01b0380935151169351611f97565b5116815f5260209160018352604092835f20835f528152835f20855f528152835f2054936001600160e01b0385166138f4575b505050505050565b613918955f9284845260018152828420868552815282842091845252812055612dcd565b5f8080806138ec565b811561392b570490565b634e487b7160e01b5f52601260045260245ffd5b6040815110613987576020810151908051603f19810190811161280c5760051c82116139735760016020920160051b010190565b505060405161398181611994565b5f815290565b5060405161398181611994565b8051156139a457602001515f1a90565b505f90565b905f8091602081519101845af48080613a27575b156139dd5750506040513d81523d5f602083013e60203d82010160405290565b15613a0457604051639996b31560e01b81526001600160a01b039091166004820152602490fd5b3d15613a15576040513d5f823e3d90fd5b60405163d6bda27560e01b8152600490fd5b503d1515806139bd5750813b15156139bd565b60041115613a4457565b634e487b7160e01b5f52602160045260245ffd5b602090939291936001600160a01b036040820195168152613a7883613a3a565b0152565b613a84614f85565b6040805163b7bad1b160e01b81526001600160a01b0383166004820152909182826024815f73200e12d10bb0c5e4a17e7018f0f1161919bb93895af1928315613b52575f925f94613b1d575b50613ada83613a3a565b600183141580613b0b575b613aef5750505090565b5163ee07877f60e01b81529182916106df919060048401613a58565b50613b1583613a3a565b821515613ae5565b90809450613b419293503d8511613b4b575b613b3981836119b0565b81019061488d565b919091925f613ad0565b503d613b2f565b513d5f823e3d90fd5b613b63614f85565b60408051630782d7e160e01b81526001600160a01b03831660048201529091828260248173200e12d10bb0c5e4a17e7018f0f1161919bb93895afa928315613b52575f925f94613b1d5750613ada83613a3a565b90805191613bc483611a94565b91613bdf604094613bd7865195866119b0565b808552611a94565b601f199460209186013686840137835183519095908015613dde576001613c359101965b6001978891010197613c2c613c178a611a94565b99613c2486519b8c6119b0565b808b52611a94565b01848901612201565b85805f9684516002815233878201523086820152606081018652613c588b611f6a565b52613c628a611f6a565b505f925b613d9a575b5050508351613c7e575b50505050505090565b85809598979692980181613c928289611fc7565b52613c9d8188611fc7565b505f925b613cb0575b5085969750613c75565b8451831015613d95576001600160a01b03613d2781613ccf8689611fc7565b51511686613cdd878a611fc7565b51015187815160051b9101207f19457468657265756d205369676e6564204d6573736167653a0a3332000000005f52601c52603c5f208c613d1e888b611fc7565b51015191614a11565b15613d7d57868098999a928192613d3e878a611fc7565b515116613d4b8787611fc7565b52019385613d598289611fc7565b510151613d66868c611fc7565b52613d71858b611fc7565b50019290989796613ca1565b8951630a57f30960e31b815260048101859052602490fd5b613ca6565b9091968151881015613dd5578280910197613db58184611fc7565b51613dc08a8d611fc7565b52613dcb898c611fc7565b5001919081613c66565b96829150613c6b565b50613c355f96613c03565b9091939284158215175f14613e035750505090505f905f90565b82810192600160fd1b8082019083011760fe1c613f3a575b5050613e2681614b5c565b93613e3081614b5c565b94613e3b8682614b7c565b90918215613f2b575f9083986f0785ee10d5da46d900f436a000000000808611613f1d575b50670de0b6b3a7640000808b11613f0e575b50633b9aca00808b11613eff575b50612710808b11613ef1575b5098805b613ee05750819061189b989982600a0a9109960195817fcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccd0a93838211900382610100031b9203901c170291614b8f565b60019290920191600a900480613e90565b60049a04998a930192613e8c565b600991939a049901915f613e80565b601291939a049901915f613e72565b85049950602592505f613e60565b5092905061189b949550614b8f565b5f821215613f8e57808413613f80575b7f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb2841315613e1b5790925061189b939491614a9a565b90925061189b939491614b01565b80841215613f4a5790925061189b939491614a9a565b61343d82826141f7565b92909180613fd4576044848460405191637a97930f60e01b835260048301526024820152fd5b90919280155f14613fe957505050505f905f90565b61400293613ff691614c49565b92919490938492614c49565b909391928461401088614b5c565b9161401a86614b5c565b947f161bcca7119915b50764b4abe86529797775a5f171951000000000000000000094604c918688106141c1575b030191600160ff1b98838a018112155f1461418e575050035b5f955f821280614185575b614167575b5f811280614155575b6141375786820103966001600160ff1b038814908161412d575b5080614124575b8061411b575b6140fd5750906140b19291614df5565b915f81136140c4575b5061189b93614b8f565b9091604c82136140f2576140db91600a0a90613921565b9081156140e8575f6140ba565b505050505f905f90565b50505050505f905f90565b876044916040519163d556b11160e01b835260048301526024820152fd5b505f85126140a1565b5082841461409b565b905088145f614094565b604489836040519163d556b11160e01b835260048301526024820152fd5b50806001600160ff1b0301821361407a565b955080870186131561417f5786818703015b95614071565b5f614179565b505f811361406c565b89985090920390506001600160ff1b03819003870182136141b25701860194614061565b5050505050505050505f905f90565b7f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee80000000000000000009650604b9250614048565b811561392b570590565b8082601b82810b83146143ec577d90e40fbeea1d3a4abc8955e946fe31cdcf66f634e10000000000000000008405614398575b8380820b0361438757507b199999999999999999999999999999999999999999999999999999987b0ccccccccccccccccccccccccccccccccccccccccccccccccccccccc84011115614338575b838060030b036142bc575b8084136142a05750506001600160e01b036001925b60e01b91161791565b8303600a0a801561392b576001600160e01b0391071592614297565b92915f84131561430c5750906142d28383614e97565b6142ee57637ffffffe1901600a0a810290637fffffff92614282565b506044916040519163d556b11160e01b835260048301526024820152fd5b637fffffff1992830390604382136140f25761432b91600a0a906141ed565b9182156140e85792614282565b5f198401808060030b1461434c5750614277565b90506001600160e01b039293507b7fffffffffffffffffffffffffffffffffffffffffffffffffffffff915060e01b9260ff1d181617905f90565b600190940193600a9093059261422a565b937f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee80000000000000000008405156143d9576305f5e100600894058094819201955b91505061422a565b620186a0600594058094819201956143d1565b508261427757505050505f90600190565b919291600160ff1b84016144155761189b9350614eb0565b9061189b935f03916145c1565b919291600160ff1b91908015806145af57509061443e91614c49565b9490929091905f8685858582821380156145a6575b614589575b505050508682841860ff1c94860391039081604c03811161456e5701600a0a808205919084614554575b505081019182821860ff1c111561454c57826001600160ff1b031461452e57905f600192135f146144ff57600a9004915b01925b811581176144c357509190565b806144dc575b5080156144d4579190565b505f91508190565b91926144f29203600160ff1b01600a0a906141ed565b600160ff1b91905f6144c9565b600a60037fe66666666666666666666666666666666666666666666666666666666666666792010401916144b3565b604490836040519163d556b11160e01b835260048301526024820152fd5b5090926144b6565b8107614561575b80614482565b60ff1d600117015f61455b565b50505091935061457c579190565b60018160ff1d1790039190565b5f9a50909750909550600160ff1b94509250905086808080614458565b50835f12614453565b156145ba5750509190565b9350919050565b9392919384158115818117614712575050906145dc91614c49565b91949082956145ed82958294614c49565b8096929491969387868482138015614709575b6146f0575b5050505050508682841860ff1c94860391039081604c03811161456e5701600a0a8082059190846146d6575b505081019182821860ff1c11156146ce57826001600160ff1b031461452e57905f600192135f1461469f57600a9004915b01925b8115811761467257509190565b80614682575080156144d4579190565b600160ff1b936146999291038401600a0a906141ed565b5f6144c9565b600a60037fe6666666666666666666666666666666666666666666666666666666666666679201040191614662565b509092614665565b81076146e3575b80614631565b60ff1d600117015f6146dd565b929b5098509196509450925090505f8080808080614605565b50858412614600565b93959390929190156147285750506144d4579190565b945092915050565b60088151106139a4576008015167ffffffffffffffff1667ff0a89c674ee78741490565b916040830192604061478e610bcf606087519401938451906001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b613de9565b9451930161479d815186612765565b6147a5575050565b909350611a33919250519251836133ff565b92915f9060018184145f87128715171717614831575f92808213614823575b03604c81135f82121761481757600a0a90846147f583820293846141ed565b1461480a57505015614806575f9190565b5f90565b9093509015611a33579190565b505015614806575f9190565b5f95600194509250906147d6565b5050505f90565b93929190918083145f83125f87121883158715171717614887575f9280821361487a5703604c81135f82121761481757600a0a90846147f583820293846141ed565b91946001935091906147d6565b50919050565b919082604091031261018257815160048110156101825760209092015160ff811681036101825790565b91925f8312156148df576044838360405191634a7d166b60e01b835260048301526024820152fd5b9192836148f157505090505f90600190565b60ff81168201918083126149b9575f831215614929575050604c1981126144d4575f03600a0a916149228382613921565b9283021490565b909293915f81135f146149af57604d811361498457600a0a92831561392b57835f1904831161495b5750500290600190565b60405163c849483b60e01b815260048101849052602481019290925260ff166044820152606490fd5b5060405163c849483b60e01b81526004810192909252602482015260ff919091166044820152606490fd5b5050905090600190565b60405163c849483b60e01b815260048101869052602481019190915260ff82166044820152606490fd5b9060ff165f03916001600160ff1b0382115f14614a0957600a6001818404940192061590565b909190600190565b9091813b614a4c57614a239192614fee565b50614a2d81613a3a565b159182614a3957505090565b6001600160a01b03918216911614919050565b6020918160645f935160405192630b135d3f60e11b9788855260048501526040602485015286820190604485015e8281018201859052601f01601f191601915afa905f5114601f3d11161690565b909392915f614aaa918184613de9565b9490945f8483019182019412159081614af7575b8115614aed575b50614acf57505090565b604492506040519163d556b11160e01b835260048301526024820152fd5b905083125f614ac5565b8281129150614abe565b614b1693600160fe1b90810193920190613de9565b9081815f821215614b4d575050604b19821261285357614b3b915f03600a0a906141ed565b9081614b45575f90565b600160ff1b90565b93600160ff1b90910192509050565b5f811215611a3357600160ff1b90808203614b75575090565b90505f0390565b905f198183099102908180821091030391565b92939291905f8184181215614c24576001600160ff1b039283831115614c0e57600160ff1b93838503614bc457505050509190565b90919293508514614bde575050600a600191045f03920190565b604051630ed8062160e21b8152600481019190915260248101919091526044810182905260648101849052608490fd5b5090915050600160ff1b811461280c575f039190565b90916001600160ff1b03808411156127d4578514614bde575050600a60019104920190565b9190918015614deb57827f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee800000000000000000080830515614cf9575b507f19999999999999999999999999999999999999999999999999999999999999997f0ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc830110614cea575b8313614cd45791905f90565b919060018060ff1b926001600160ff1b03030190565b9290600a02905f190192614cc8565b6f4b3b4ca85a86c47a098a22400000000080840515614dd9575b507728c87cb5c89a2571ebfdcb54864ada834a00000000000000830515614dc2575b7b097edd871cfda3a5697758bf0e3cbb5ac5741c640000000000000000830515614dae575b7e3899162693736ac531a5a58f1fbb4b746504382ca7e4000000000000000000830515614d9e57820515614d8f575b5f614c7d565b9290600a02905f190192614d89565b9391606402916001190193614d5a565b93916402540be40002916009190193614d5a565b9391678ac7230489e8000002916012190193614d35565b6025198301955092909202915f614d13565b505f915081908190565b90915f198383099280830292838086109503948086039584871015614e735714614e6b579082910960018219018216809204600280826003021880830282030280830282030280830282030280830282030280830282030280920290030293600183805f03040190848311900302920304170290565b505091500490565b60648386866040519263362ced0960e11b8452600484015260248301526044820152fd5b611a3391905f811215614eab575f03615028565b615028565b909291600160ff1b91828101614f425750808414614f3857808413918215614f30578185035b604c811115614f1f5750505f915b15614f1057507f8000000000000000000000000000000000000000000000000000000000000001019190565b92506001600160ff1b03039190565b600a0a90811561392b570491614ee4565b848203614ed6565b505090505f905f90565b93614f4f92945f03614422565b80939180928114614f63575b50505f039190565b915092506001600160ff1b03831461452e57600a600191059201915f80614f5b565b73200e12d10bb0c5e4a17e7018f0f1161919bb9389803b158015614fc3575b614fab5750565b602490604051906373e6d7b360e01b82526004820152fd5b507f1de7d717526cba131d684e312dedbf0852adef9cced9e36798ae4937f7145d41813f1415614fa4565b815191906041830361501e576150179250602082015190606060408401519301515f1a906150b7565b9192909190565b50505f9160029190565b90637ffffff58113156150b157637ffffffe19810190604382136150aa575f82121561507e57637fffffff91505f0301600a0a7b8000000000000000000000000000000000000000000000000000000202111590565b50600a0a801561392b577b80000000000000000000000000000000000000000000000000000001041090565b5050151590565b50505f90565b91907f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0841161512e579160209360809260ff5f9560405194855216868401526040830152606082015282805260015afa1561022c575f516001600160a01b0381161561512457905f905f90565b505f906001905f90565b5050505f916003919056"; /// @dev What MUST already be on a network before this release can be /// broadcast there: an address, and the runtime code that belongs at it. diff --git a/src/generated/candidate/RaindexV6SubParser.sol b/src/generated/candidate/RaindexV6SubParser.sol index 22d2dee823..523a8702f0 100644 --- a/src/generated/candidate/RaindexV6SubParser.sol +++ b/src/generated/candidate/RaindexV6SubParser.sol @@ -5,19 +5,19 @@ pragma solidity ^0.8.25; // THIS FILE IS AUTOGENERATED BY THE BUILD SCRIPT. DO NOT EDIT BY HAND. /// @dev Hash of the known bytecode. -bytes32 constant BYTECODE_HASH = bytes32(0xb5f18596862c369ecb1bc3cf69399785a578427214d9372d94d0fde2ed0ecaeb); +bytes32 constant BYTECODE_HASH = bytes32(0xb1b4649132a7ad03265562c1a423ea9c47c1c19d24882c98827e8f5c9b3fd439); /// @dev The deterministic deploy address of the contract when deployed via /// the Zoltu factory. -address constant DEPLOYED_ADDRESS = address(0x1E01A5C29679C9155468B331f0258F56EAF6Ea5F); +address constant DEPLOYED_ADDRESS = address(0x69776bB0d73bF514a20bbCD4B8534fE3ee90A829); /// @dev The creation bytecode of the contract. bytes constant CREATION_CODE = - hex"6080604052348015600e575f80fd5b506126378061001c5f395ff3fe608060405234801561000f575f80fd5b506004361061007a575f3560e01c80636f5aa28d116100585780636f5aa28d146100dd578063c6c0cbb61461010b578063ccf4477514610135578063d6d8c9a814610148575f80fd5b806301ffc9a71461007e578063336284d4146100a6578063570c7a63146100bb575b5f80fd5b61009161008c3660046122f2565b610150565b60405190151581526020015b60405180910390f35b6100ae6101d7565b60405161009d919061234e565b6100ce6100c9366004612374565b610bc5565b60405161009d9392919061241e565b6040517ff2d0eca454c544ab10f9991c019349475a416e38494f112a50807174c3000d0b815260200161009d565b61011e610119366004612374565b610d09565b60408051921515835260208301919091520161009d565b60408051602081019091525f81526100ae565b6100ae610d41565b5f6001600160e01b031982166391ccb1d560e01b148061018057506001600160e01b03198216636f5aa28d60e01b145b8061019b57506001600160e01b03198216631a2c8edd60e01b145b806101b657506001600160e01b03198216630cd8a13560e21b145b806101d157506301ffc9a760e01b6001600160e01b03198316145b92915050565b60605f6101e66004600161248f565b6101f190600261248f565b6101fc90600161248f565b61020790600161248f565b6001600160401b0381111561021e5761021e612360565b60405190808252806020026020018201604052801561025157816020015b606081526020019060019003908161023c5790505b50604080516002808252606082019092529192505f9190816020015b6122e881526020019060019003908161026d5790505090506116cc815f8151811061029a5761029a6124a2565b60200260200101906001600160401b031690816001600160401b0316815250506116e9816001815181106102d0576102d06124a2565b6001600160401b039290921660209283029190910190910152604080516003808252608082019092525f91816020015b6122e88152602001906001900390816103005790505090506116f8815f8151811061032d5761032d6124a2565b60200260200101906001600160401b031690816001600160401b03168152505061170781600181518110610363576103636124a2565b60200260200101906001600160401b031690816001600160401b03168152505061171681600281518110610399576103996124a2565b6001600160401b039290921660209283029190910190910152604080516002808252606082019092525f91816020015b6122e88152602001906001900390816103c9579050509050611726815f815181106103f6576103f66124a2565b60200260200101906001600160401b031690816001600160401b0316815250506117358160018151811061042c5761042c6124a2565b6001600160401b03929092166020928302919091019091015260408051600580825260c082019092525f91816020015b6122e881526020019060019003908161045c579050509050611745815f81518110610489576104896124a2565b60200260200101906001600160401b031690816001600160401b031681525050611754816001815181106104bf576104bf6124a2565b60200260200101906001600160401b031690816001600160401b031681525050611764816002815181106104f5576104f56124a2565b60200260200101906001600160401b031690816001600160401b0316815250506117748160038151811061052b5761052b6124a2565b60200260200101906001600160401b031690816001600160401b03168152505061178381600481518110610561576105616124a2565b6001600160401b03929092166020928302919091019091015260408051600580825260c082019092525f91816020015b6122e8815260200190600190039081610591579050509050611793815f815181106105be576105be6124a2565b60200260200101906001600160401b031690816001600160401b0316815250506117a2816001815181106105f4576105f46124a2565b60200260200101906001600160401b031690816001600160401b0316815250506117b28160028151811061062a5761062a6124a2565b60200260200101906001600160401b031690816001600160401b0316815250506117c281600381518110610660576106606124a2565b60200260200101906001600160401b031690816001600160401b0316815250506117d281600481518110610696576106966124a2565b6001600160401b0392909216602092830291909101909101526040805160018082528183019092525f91816020015b6122e88152602001906001900390816106c55790505090506117e1815f815181106106f2576106f26124a2565b6001600160401b0392909216602092830291909101909101526040805160018082528183019092525f91816020015b6122e88152602001906001900390816107215790505090506117f0815f8151811061074e5761074e6124a2565b60200260200101906001600160401b031690816001600160401b03168152505086885f81518110610781576107816124a2565b602002602001018190525085886001815181106107a0576107a06124a2565b602002602001018190525084886002815181106107bf576107bf6124a2565b602002602001018190525083886003815181106107de576107de6124a2565b602002602001018190525082886004815181106107fd576107fd6124a2565b6020026020010181905250818860058151811061081c5761081c6124a2565b6020026020010181905250808860068151811061083b5761083b6124a2565b602090810291909101015260408051600680825260e082019092525f91816020015b6122e881526020019060019003908161085d5790505090506116cc815f8151811061088a5761088a6124a2565b60200260200101906001600160401b031690816001600160401b0316815250506116f8816001815181106108c0576108c06124a2565b60200260200101906001600160401b031690816001600160401b031681525050611707816002815181106108f6576108f66124a2565b60200260200101906001600160401b031690816001600160401b0316815250506117168160038151811061092c5761092c6124a2565b60200260200101906001600160401b031690816001600160401b03168152505061182581600481518110610962576109626124a2565b60200260200101906001600160401b031690816001600160401b03168152505061183581600581518110610998576109986124a2565b6001600160401b039092166020928302919091019091015280896109be6006600161248f565b815181106109ce576109ce6124a2565b602090810291909101015260408051600780825261010082019092525f91816020015b6122e88152602001906001900390816109f15790505090506116cc815f81518110610a1e57610a1e6124a2565b60200260200101906001600160401b031690816001600160401b0316815250506116f881600181518110610a5457610a546124a2565b60200260200101906001600160401b031690816001600160401b03168152505061170781600281518110610a8a57610a8a6124a2565b60200260200101906001600160401b031690816001600160401b03168152505061171681600381518110610ac057610ac06124a2565b60200260200101906001600160401b031690816001600160401b03168152505061182581600481518110610af657610af66124a2565b60200260200101906001600160401b031690816001600160401b03168152505061183581600581518110610b2c57610b2c6124a2565b60200260200101906001600160401b031690816001600160401b03168152505061184581600681518110610b6257610b626124a2565b6001600160401b0390921660209283029190910190910152808a610b886006600261248f565b81518110610b9857610b986124a2565b602090810291909101015289610bb5610bb082611855565b61186a565b9b50505050505050505050505090565b5f6060805f805f610be587610bd86118f9565b610be0611919565b611939565b9250925092505f610bfb82610220015160200190565b90505f8261022001515182610c10919061248f565b90505f610c2e83836f07fffffe0000000003ff200000000000611a2a565b80925081945050505f80610c4786610240015184611ac6565b915091508115610cdc575f610c5c8783611b9d565b90506122e85f610c6a611bcc565b90505f60028251610c7b91906124ca565b9050808510610cac576040516303bdd1b160e51b815260048101869052602481018290526044015b60405180910390fd5b6001850160020282015161ffff169250610cc58c8c8686565b9e509e509e50505050505050505050505050610d02565b5050604080515f80825281830190925260208101828152919a5090985096505050505050505b9193909250565b5f805f805f610d31866002810151815160228084019461ffff93909316840101920160200190565b505f988998509650505050505050565b60605f610d506004600161248f565b610d5b90600261248f565b610d6690600161248f565b610d7190600161248f565b6001600160401b03811115610d8857610d88612360565b604051908082528060200260200182016040528015610dbb57816020015b6060815260200190600190039081610da65790505b50604080516002808252606082019092529192505f9190816020015b6122e8815260200190600190039081610dd7579050509050611bec815f81518110610e0457610e046124a2565b60200260200101906001600160401b031690816001600160401b031681525050611bec81600181518110610e3a57610e3a6124a2565b6001600160401b039290921660209283029190910190910152604080516003808252608082019092525f91816020015b6122e8815260200190600190039081610e6a579050509050611bec815f81518110610e9757610e976124a2565b60200260200101906001600160401b031690816001600160401b031681525050611bec81600181518110610ecd57610ecd6124a2565b60200260200101906001600160401b031690816001600160401b031681525050611bec81600281518110610f0357610f036124a2565b6001600160401b039290921660209283029190910190910152604080516002808252606082019092525f91816020015b6122e8815260200190600190039081610f33579050509050611bec815f81518110610f6057610f606124a2565b60200260200101906001600160401b031690816001600160401b031681525050611bec81600181518110610f9657610f966124a2565b6001600160401b03929092166020928302919091019091015260408051600580825260c082019092525f91816020015b6122e8815260200190600190039081610fc6579050509050611bec815f81518110610ff357610ff36124a2565b60200260200101906001600160401b031690816001600160401b031681525050611bec81600181518110611029576110296124a2565b60200260200101906001600160401b031690816001600160401b031681525050611bec8160028151811061105f5761105f6124a2565b60200260200101906001600160401b031690816001600160401b031681525050611bec81600381518110611095576110956124a2565b60200260200101906001600160401b031690816001600160401b031681525050611bec816004815181106110cb576110cb6124a2565b6001600160401b03929092166020928302919091019091015260408051600580825260c082019092525f91816020015b6122e88152602001906001900390816110fb579050509050611bec815f81518110611128576111286124a2565b60200260200101906001600160401b031690816001600160401b031681525050611bec8160018151811061115e5761115e6124a2565b60200260200101906001600160401b031690816001600160401b031681525050611bec81600281518110611194576111946124a2565b60200260200101906001600160401b031690816001600160401b031681525050611bec816003815181106111ca576111ca6124a2565b60200260200101906001600160401b031690816001600160401b031681525050611bec81600481518110611200576112006124a2565b6001600160401b0392909216602092830291909101909101526040805160018082528183019092525f91816020015b6122e881526020019060019003908161122f579050509050611c15815f8151811061125c5761125c6124a2565b6001600160401b0392909216602092830291909101909101526040805160018082528183019092525f91816020015b6122e881526020019060019003908161128b579050509050611cb1815f815181106112b8576112b86124a2565b60200260200101906001600160401b031690816001600160401b03168152505086885f815181106112eb576112eb6124a2565b6020026020010181905250858860018151811061130a5761130a6124a2565b60200260200101819052508488600281518110611329576113296124a2565b60200260200101819052508388600381518110611348576113486124a2565b60200260200101819052508288600481518110611367576113676124a2565b60200260200101819052508188600581518110611386576113866124a2565b602002602001018190525080886006815181106113a5576113a56124a2565b602090810291909101015260408051600680825260e082019092525f91816020015b6122e88152602001906001900390816113c7579050509050611bec815f815181106113f4576113f46124a2565b60200260200101906001600160401b031690816001600160401b031681525050611bec8160018151811061142a5761142a6124a2565b60200260200101906001600160401b031690816001600160401b031681525050611bec81600281518110611460576114606124a2565b60200260200101906001600160401b031690816001600160401b031681525050611bec81600381518110611496576114966124a2565b60200260200101906001600160401b031690816001600160401b031681525050611bec816004815181106114cc576114cc6124a2565b60200260200101906001600160401b031690816001600160401b031681525050611bec81600581518110611502576115026124a2565b6001600160401b039092166020928302919091019091015280896115286006600161248f565b81518110611538576115386124a2565b602090810291909101015260408051600780825261010082019092525f91816020015b6122e881526020019060019003908161155b579050509050611bec815f81518110611588576115886124a2565b60200260200101906001600160401b031690816001600160401b031681525050611bec816001815181106115be576115be6124a2565b60200260200101906001600160401b031690816001600160401b031681525050611bec816002815181106115f4576115f46124a2565b60200260200101906001600160401b031690816001600160401b031681525050611bec8160038151811061162a5761162a6124a2565b60200260200101906001600160401b031690816001600160401b031681525050611bec81600481518110611660576116606124a2565b60200260200101906001600160401b031690816001600160401b031681525050611bec81600581518110611696576116966124a2565b60200260200101906001600160401b031690816001600160401b031681525050611bec81600681518110610b6257610b626124a2565b5f6060806116da5f80611d69565b92509250925093509350939050565b5f6060806116da5f6001611d69565b5f6060806116da60015f611d69565b5f6060806116da600180611d69565b5f6060806116da60016002611d69565b5f6060806116da60025f611d69565b5f6060806116da60026001611d69565b5f6060806116da60035f611d69565b5f6060806116da60036001611d69565b5f6060806116da60036002611d69565b5f6060806116da600380611d69565b5f6060806116da60036004611d69565b5f6060806116da60045f611d69565b5f6060806116da60046001611d69565b5f6060806116da60046002611d69565b5f6060806116da60046003611d69565b5f6060806116da600480611d69565b5f6060806116da600585611d69565b5f60608060ff80851690600886901c1661181461180e83600661248f565b82611d69565b945094509450505093509350939050565b5f6060806116da60016003611d69565b5f6060806116da60016004611d69565b5f6060806116da60016005611d69565b6060815f61186282611deb565b949350505050565b60605f82516002026001600160401b0381111561188957611889612360565b6040519080825280601f01601f1916602001820160405280156118b3576020820181803683370190505b50905061ffff80196020850160208651028101600285015b818310156118ed578051835186169085161781526020909201916002016118cb565b50939695505050505050565b60606040518060e0016040528060a2815260200161259560a29139905090565b606060405180606001604052806040815260200161251560409139905090565b5f806119c86040518061026001604052805f81526020015f81526020015f81526020015f81526020015f81526020015f81526020015f80191681526020015f81526020015f81526020015f81526020015f81526020015f81526020015f80191681526020016060815260200160608152602001606081526020015f815260200160608152602001606081525090565b606061ffff600288015116935060ff600388015116925061ffff600588015116600588019750808852602081018801915050611a1487878760405180602001604052805f815250611e59565b915080826101e001819052505093509350939050565b5f808060018187870360208111611a415780611a44565b60205b915050875192505b8519600184841a1b16158183101615611a6a57600182019150611a4c565b9681019660208290036008810293841c90931b92611ab55760408051602081018590520160408051601f198184030181529082905263e47fe8b760e01b8252610ca39160040161234e565b50869350909150505b935093915050565b600182810180515f928392600560ff93909316602102870192830192909101835b81831015611b8b5760018301516021909301805190935f90819060ff168180611b10838e61200a565b915091508186165f03611b32575f809b509b5050505050505050505050611b96565b5f87611b42600185038916612035565b016004028b015195505062ffffff9081169350841683039150611b769050575060019750601c1a9550611b96945050505050565b611b7f83612035565b84019350505050611ae7565b5f8095509550505050505b9250929050565b6101c08201516002828102820101516101e08401515f9261ffff9092169190611bc39083565b95945050505050565b606060405180606001604052806040815260200161255560409139905090565b5f81515f14611c0e576040516304f8b58160e51b815260040160405180910390fd5b505f919050565b5f8151600103611c72575060208101516001600160e01b038116601b0b60e082901d5f611c438383836120ee565b905061ffff811115611c6857604051631e4e01d760e21b815260040160405180910390fd5b9250611cac915050565b81515f03611c9357604051630f16066b60e41b815260040160405180910390fd5b604051630358cd2160e31b815260040160405180910390fd5b919050565b5f8151600203611d4657602082015160408301516001600160e01b038216601b0b60e083901d5f611ce38383836120ee565b6001600160e01b038516601b0b935060e085901d925090505f611d078484836120ee565b905060ff821180611d18575060ff81115b15611d3657604051631e4e01d760e21b815260040160405180910390fd5b60081b179450611cac9350505050565b600282511015611c9357604051630f16066b60e41b815260040160405180910390fd5b5f60608060ff851180611d7c575060ff84115b15611da457604051639b0f326160e01b81526004810186905260248101859052604401610ca3565b6040805160248101909152600386602383015385602283015360106021830153806020830153506004815260408051602081019091525f8152600197919650945092505050565b60605f611df783612130565b90505f611e058260206124e9565b9050606060405190508160200181016040528281526020850160208651028101602083015b81831015611e4d57602083515102806020855101835e6020939093019201611e2a565b50919695505050505050565b611ee66040518061026001604052805f81526020015f81526020015f81526020015f81526020015f81526020015f81526020015f80191681526020015f81526020015f81526020015f81526020015f81526020015f81526020015f80191681526020016060815260200160608152602001606081526020015f815260200160608152602001606081525090565b5f6040518061026001604052805f81526020015f81526020015f81526020015f81526020015f81526020015f81526020015f801b81526020015f8152602001600481526020015f81526020015f81526020015f81526020015f801b815260200184815260200185815260200160046001600160401b03811115611f6b57611f6b612360565b604051908082528060200260200182016040528015611f94578160200160208202803683370190505b5081525f602080830182905260408084018b905260609384018a90528051601f01601f19168281528083018252835161ffff191681178452855290840182905283018190529082018190526080820181905260a08201819052610120820181905261014082018190526102008201529050611bc3565b5f80825f528360205360215f2090506001815f1a1b915062ffffff8116611b96575060019250929050565b5f5f1982036120475750610100919050565b507f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f7f5555555555555555555555555555555555555555555555555555555555555555600183901c16909103600281901c7f3333333333333333333333333333333333333333333333333333333333333333908116911601600481901c01167f01010101010101010101010101010101010101010101010101010101010101010260f81c90565b5f805f6120fc868686612179565b91509150806121275760405162bc8ecf60e31b81526004810187905260248101869052604401610ca3565b50949350505050565b5f60208201602083510281015b8082101561217257815151928301928084101561216657634e487b715f5260116020526024601cfd5b5060208201915061213d565b5050919050565b5f805f8512156121a657604051634a7d166b60e01b81526004810186905260248101859052604401610ca3565b845f036121b857505f90506001611abe565b8460ff84168501858112156121f35760405163c849483b60e01b8152600481018890526024810187905260ff86166044820152606401610ca3565b5f805f83121561223f57604c19831215612216575f809550955050505050611abe565b825f03600a0a915081848161222d5761222d6124b6565b0495505084029091149150611abe9050565b5f8313156122d857604d83131561227c5760405163c849483b60e01b8152600481018a90526024810189905260ff88166044820152606401610ca3565b82600a0a9150815f1981612292576122926124b6565b048411156122c65760405163c849483b60e01b8152600481018a90526024810189905260ff88166044820152606401610ca3565b5091909102925060019150611abe9050565b8360019550955050505050611abe565b6122f0612500565b565b5f60208284031215612302575f80fd5b81356001600160e01b031981168114612319575f80fd5b9392505050565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f6123196020830184612320565b634e487b7160e01b5f52604160045260245ffd5b5f60208284031215612384575f80fd5b81356001600160401b038082111561239a575f80fd5b818401915084601f8301126123ad575f80fd5b8135818111156123bf576123bf612360565b604051601f8201601f19908116603f011681019083821181831017156123e7576123e7612360565b816040528281528760208487010111156123ff575f80fd5b826020860160208301375f928101602001929092525095945050505050565b83151581525f60206060602084015261243a6060840186612320565b8381036040850152845180825260208087019201905f5b8181101561246d57835183529284019291840191600101612451565b509098975050505050505050565b634e487b7160e01b5f52601160045260245ffd5b808201808211156101d1576101d161247b565b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52601260045260245ffd5b5f826124e457634e487b7160e01b5f52601260045260245ffd5b500490565b80820281158282048414176101d1576101d161247b565b634e487b7160e01b5f52605160045260245ffdfe1bec1bec1bec1bec1bec1bec1bec1bec1bec1bec1bec1bec1bec1bec1bec1bec1bec1c151cb11bec1bec1bec1bec1bec1bec1bec1bec1bec1bec1bec1bec1bec16cc16e916f8170717161726173517451754176417741783179317a217b217c217d217e117f016cc16f8170717161825183516cc16f8170717161825183518450101180010800082000100010480300038412a001810000010020004200004002038038ff54900cc66c61ff3dcab0616592209895f0b16fec9301b02e0920c5bfe561d21609201e959460b1974270f844db208bcd3bf1e989376111049db13b934301a0ae9a00af82a7805c138f40d28083f0742ef2104d561fd1415a13317716a6119d260cc107b9bfc0eec7ade15cba2891c6b14a512792bdb02e0f14718565589"; + hex"6080604052348015600e575f80fd5b506126888061001c5f395ff3fe608060405234801561000f575f80fd5b506004361061007a575f3560e01c80636f5aa28d116100585780636f5aa28d146100dd578063c6c0cbb61461010b578063ccf4477514610135578063d6d8c9a814610148575f80fd5b806301ffc9a71461007e578063336284d4146100a6578063570c7a63146100bb575b5f80fd5b61009161008c366004612343565b610150565b60405190151581526020015b60405180910390f35b6100ae6101d7565b60405161009d919061239f565b6100ce6100c93660046123c5565b610b9f565b60405161009d9392919061246f565b6040517fe43208b51e17b3d887e8f3535d75526c0744eee6a200dac603462c6b3ca46511815260200161009d565b61011e6101193660046123c5565b610ce3565b60408051921515835260208301919091520161009d565b60408051602081019091525f81526100ae565b6100ae610d1b565b5f6001600160e01b031982166391ccb1d560e01b148061018057506001600160e01b03198216636f5aa28d60e01b145b8061019b57506001600160e01b03198216631a2c8edd60e01b145b806101b657506001600160e01b03198216630cd8a13560e21b145b806101d157506301ffc9a760e01b6001600160e01b03198316145b92915050565b60605f6101e6600960016124e0565b6001600160401b038111156101fd576101fd6123b1565b60405190808252806020026020018201604052801561023057816020015b606081526020019060019003908161021b5790505b506040805160018082528183019092529192505f9190816020015b61233981526020019060019003908161024b579050509050611682815f81518110610278576102786124f3565b6001600160401b03929092166020928302919091019091015260408051600480825260a082019092525f91816020015b6123398152602001906001900390816102a85790505090506116a0815f815181106102d5576102d56124f3565b60200260200101906001600160401b031690816001600160401b0316815250506116af8160018151811061030b5761030b6124f3565b60200260200101906001600160401b031690816001600160401b0316815250506116be81600281518110610341576103416124f3565b60200260200101906001600160401b031690816001600160401b0316815250506116ce81600381518110610377576103776124f3565b6001600160401b039290921660209283029190910190910152604080516002808252606082019092525f91816020015b6123398152602001906001900390816103a75790505090506116de815f815181106103d4576103d46124f3565b60200260200101906001600160401b031690816001600160401b0316815250506116ed8160018151811061040a5761040a6124f3565b6001600160401b03929092166020928302919091019091015260408051600580825260c082019092525f91816020015b61233981526020019060019003908161043a5790505090506116fd815f81518110610467576104676124f3565b60200260200101906001600160401b031690816001600160401b03168152505061170c8160018151811061049d5761049d6124f3565b60200260200101906001600160401b031690816001600160401b03168152505061171c816002815181106104d3576104d36124f3565b60200260200101906001600160401b031690816001600160401b03168152505061172c81600381518110610509576105096124f3565b60200260200101906001600160401b031690816001600160401b03168152505061173b8160048151811061053f5761053f6124f3565b6001600160401b03929092166020928302919091019091015260408051600580825260c082019092525f91816020015b61233981526020019060019003908161056f57905050905061174b815f8151811061059c5761059c6124f3565b60200260200101906001600160401b031690816001600160401b03168152505061175a816001815181106105d2576105d26124f3565b60200260200101906001600160401b031690816001600160401b03168152505061176a81600281518110610608576106086124f3565b60200260200101906001600160401b031690816001600160401b03168152505061177a8160038151811061063e5761063e6124f3565b60200260200101906001600160401b031690816001600160401b03168152505061178a81600481518110610674576106746124f3565b6001600160401b0392909216602092830291909101909101526040805160018082528183019092525f91816020015b6123398152602001906001900390816106a3579050509050611799815f815181106106d0576106d06124f3565b6001600160401b0392909216602092830291909101909101526040805160018082528183019092525f91816020015b6123398152602001906001900390816106ff5790505090506117a8815f8151811061072c5761072c6124f3565b60200260200101906001600160401b031690816001600160401b03168152505086885f8151811061075f5761075f6124f3565b6020026020010181905250858860018151811061077e5761077e6124f3565b6020026020010181905250848860028151811061079d5761079d6124f3565b602002602001018190525083886003815181106107bc576107bc6124f3565b602002602001018190525082886004815181106107db576107db6124f3565b602002602001018190525081886008815181106107fa576107fa6124f3565b60200260200101819052508088600981518110610819576108196124f3565b602090810291909101015260408051600680825260e082019092525f91816020015b61233981526020019060019003908161083b5790505090506117da815f81518110610868576108686124f3565b60200260200101906001600160401b031690816001600160401b0316815250506117e98160018151811061089e5761089e6124f3565b60200260200101906001600160401b031690816001600160401b0316815250506117f8816002815181106108d4576108d46124f3565b60200260200101906001600160401b031690816001600160401b0316815250506118088160038151811061090a5761090a6124f3565b60200260200101906001600160401b031690816001600160401b03168152505061181881600481518110610940576109406124f3565b60200260200101906001600160401b031690816001600160401b03168152505061182881600581518110610976576109766124f3565b60200260200101906001600160401b031690816001600160401b03168152505080896005815181106109aa576109aa6124f3565b602090810291909101015260408051600780825261010082019092525f91816020015b6123398152602001906001900390816109cd579050509050611838815f815181106109fa576109fa6124f3565b60200260200101906001600160401b031690816001600160401b03168152505061184781600181518110610a3057610a306124f3565b60200260200101906001600160401b031690816001600160401b03168152505061185681600281518110610a6657610a666124f3565b60200260200101906001600160401b031690816001600160401b03168152505061186681600381518110610a9c57610a9c6124f3565b60200260200101906001600160401b031690816001600160401b03168152505061187681600481518110610ad257610ad26124f3565b60200260200101906001600160401b031690816001600160401b03168152505061188681600581518110610b0857610b086124f3565b60200260200101906001600160401b031690816001600160401b03168152505061189681600681518110610b3e57610b3e6124f3565b60200260200101906001600160401b031690816001600160401b031681525050808a600681518110610b7257610b726124f3565b602090810291909101015289610b8f610b8a826118a6565b6118bb565b9b50505050505050505050505090565b5f6060805f805f610bbf87610bb261194a565b610bba61196a565b61198a565b9250925092505f610bd582610220015160200190565b90505f8261022001515182610bea91906124e0565b90505f610c0883836f07fffffe0000000003ff200000000000611a7b565b80925081945050505f80610c2186610240015184611b17565b915091508115610cb6575f610c368783611bee565b90506123395f610c44611c1d565b90505f60028251610c55919061251b565b9050808510610c86576040516303bdd1b160e51b815260048101869052602481018290526044015b60405180910390fd5b6001850160020282015161ffff169250610c9f8c8c8686565b9e509e509e50505050505050505050505050610cdc565b5050604080515f80825281830190925260208101828152919a5090985096505050505050505b9193909250565b5f805f805f610d0b866002810151815160228084019461ffff93909316840101920160200190565b505f988998509650505050505050565b60605f610d2a600960016124e0565b6001600160401b03811115610d4157610d416123b1565b604051908082528060200260200182016040528015610d7457816020015b6060815260200190600190039081610d5f5790505b506040805160018082528183019092529192505f9190816020015b612339815260200190600190039081610d8f579050509050611c3d815f81518110610dbc57610dbc6124f3565b6001600160401b03929092166020928302919091019091015260408051600480825260a082019092525f91816020015b612339815260200190600190039081610dec579050509050611c3d815f81518110610e1957610e196124f3565b60200260200101906001600160401b031690816001600160401b031681525050611c3d81600181518110610e4f57610e4f6124f3565b60200260200101906001600160401b031690816001600160401b031681525050611c3d81600281518110610e8557610e856124f3565b60200260200101906001600160401b031690816001600160401b031681525050611c3d81600381518110610ebb57610ebb6124f3565b6001600160401b039290921660209283029190910190910152604080516002808252606082019092525f91816020015b612339815260200190600190039081610eeb579050509050611c3d815f81518110610f1857610f186124f3565b60200260200101906001600160401b031690816001600160401b031681525050611c3d81600181518110610f4e57610f4e6124f3565b6001600160401b03929092166020928302919091019091015260408051600580825260c082019092525f91816020015b612339815260200190600190039081610f7e579050509050611c3d815f81518110610fab57610fab6124f3565b60200260200101906001600160401b031690816001600160401b031681525050611c3d81600181518110610fe157610fe16124f3565b60200260200101906001600160401b031690816001600160401b031681525050611c3d81600281518110611017576110176124f3565b60200260200101906001600160401b031690816001600160401b031681525050611c3d8160038151811061104d5761104d6124f3565b60200260200101906001600160401b031690816001600160401b031681525050611c3d81600481518110611083576110836124f3565b6001600160401b03929092166020928302919091019091015260408051600580825260c082019092525f91816020015b6123398152602001906001900390816110b3579050509050611c3d815f815181106110e0576110e06124f3565b60200260200101906001600160401b031690816001600160401b031681525050611c3d81600181518110611116576111166124f3565b60200260200101906001600160401b031690816001600160401b031681525050611c3d8160028151811061114c5761114c6124f3565b60200260200101906001600160401b031690816001600160401b031681525050611c3d81600381518110611182576111826124f3565b60200260200101906001600160401b031690816001600160401b031681525050611c3d816004815181106111b8576111b86124f3565b6001600160401b0392909216602092830291909101909101526040805160018082528183019092525f91816020015b6123398152602001906001900390816111e7579050509050611c66815f81518110611214576112146124f3565b6001600160401b0392909216602092830291909101909101526040805160018082528183019092525f91816020015b612339815260200190600190039081611243579050509050611d02815f81518110611270576112706124f3565b60200260200101906001600160401b031690816001600160401b03168152505086885f815181106112a3576112a36124f3565b602002602001018190525085886001815181106112c2576112c26124f3565b602002602001018190525084886002815181106112e1576112e16124f3565b60200260200101819052508388600381518110611300576113006124f3565b6020026020010181905250828860048151811061131f5761131f6124f3565b6020026020010181905250818860088151811061133e5761133e6124f3565b6020026020010181905250808860098151811061135d5761135d6124f3565b602090810291909101015260408051600680825260e082019092525f91816020015b61233981526020019060019003908161137f579050509050611c3d815f815181106113ac576113ac6124f3565b60200260200101906001600160401b031690816001600160401b031681525050611c3d816001815181106113e2576113e26124f3565b60200260200101906001600160401b031690816001600160401b031681525050611c3d81600281518110611418576114186124f3565b60200260200101906001600160401b031690816001600160401b031681525050611c3d8160038151811061144e5761144e6124f3565b60200260200101906001600160401b031690816001600160401b031681525050611c3d81600481518110611484576114846124f3565b60200260200101906001600160401b031690816001600160401b031681525050611c3d816005815181106114ba576114ba6124f3565b60200260200101906001600160401b031690816001600160401b03168152505080896005815181106114ee576114ee6124f3565b602090810291909101015260408051600780825261010082019092525f91816020015b612339815260200190600190039081611511579050509050611c3d815f8151811061153e5761153e6124f3565b60200260200101906001600160401b031690816001600160401b031681525050611c3d81600181518110611574576115746124f3565b60200260200101906001600160401b031690816001600160401b031681525050611c3d816002815181106115aa576115aa6124f3565b60200260200101906001600160401b031690816001600160401b031681525050611c3d816003815181106115e0576115e06124f3565b60200260200101906001600160401b031690816001600160401b031681525050611c3d81600481518110611616576116166124f3565b60200260200101906001600160401b031690816001600160401b031681525050611c3d8160058151811061164c5761164c6124f3565b60200260200101906001600160401b031690816001600160401b031681525050611c3d81600681518110610b3e57610b3e6124f3565b5f6060806116915f6001611dba565b92509250925093509350939050565b5f60608061169160015f611dba565b5f606080611691600180611dba565b5f60608061169160016002611dba565b5f60608061169160016003611dba565b5f60608061169160025f611dba565b5f60608061169160026001611dba565b5f60608061169160035f611dba565b5f60608061169160036001611dba565b5f60608061169160036002611dba565b5f606080611691600380611dba565b5f60608061169160036004611dba565b5f60608061169160045f611dba565b5f60608061169160046001611dba565b5f60608061169160046002611dba565b5f60608061169160046003611dba565b5f606080611691600480611dba565b5f606080611691600885611dba565b5f60608060ff8416600885901c6117c96117c38360096124e0565b82611dba565b945094509450505093509350939050565b5f606080611691600580611dba565b5f60608061169160055f611dba565b5f60608061169160056001611dba565b5f60608061169160056002611dba565b5f60608061169160056003611dba565b5f60608061169160056004611dba565b5f606080611691600680611dba565b5f60608061169160065f611dba565b5f60608061169160066001611dba565b5f60608061169160066002611dba565b5f60608061169160066003611dba565b5f60608061169160066004611dba565b5f60608061169160066005611dba565b6060815f6118b382611e3c565b949350505050565b60605f82516002026001600160401b038111156118da576118da6123b1565b6040519080825280601f01601f191660200182016040528015611904576020820181803683370190505b50905061ffff80196020850160208651028101600285015b8183101561193e5780518351861690851617815260209092019160020161191c565b50939695505050505050565b60606040518060e0016040528060a2815260200161256660a29139905090565b606060405180606001604052806040815260200161260860409139905090565b5f80611a196040518061026001604052805f81526020015f81526020015f81526020015f81526020015f81526020015f81526020015f80191681526020015f81526020015f81526020015f81526020015f81526020015f81526020015f80191681526020016060815260200160608152602001606081526020015f815260200160608152602001606081525090565b606061ffff600288015116935060ff600388015116925061ffff600588015116600588019750808852602081018801915050611a6587878760405180602001604052805f815250611eaa565b915080826101e001819052505093509350939050565b5f808060018187870360208111611a925780611a95565b60205b915050875192505b8519600184841a1b16158183101615611abb57600182019150611a9d565b9681019660208290036008810293841c90931b92611b065760408051602081018590520160408051601f198184030181529082905263e47fe8b760e01b8252610c7d9160040161239f565b50869350909150505b935093915050565b600182810180515f928392600560ff93909316602102870192830192909101835b81831015611bdc5760018301516021909301805190935f90819060ff168180611b61838e61205b565b915091508186165f03611b83575f809b509b5050505050505050505050611be7565b5f87611b93600185038916612086565b016004028b015195505062ffffff9081169350841683039150611bc79050575060019750601c1a9550611be7945050505050565b611bd083612086565b84019350505050611b38565b5f8095509550505050505b9250929050565b6101c08201516002828102820101516101e08401515f9261ffff9092169190611c149083565b95945050505050565b606060405180606001604052806040815260200161264860409139905090565b5f81515f14611c5f576040516304f8b58160e51b815260040160405180910390fd5b505f919050565b5f8151600103611cc3575060208101516001600160e01b038116601b0b60e082901d5f611c9483838361213f565b905061ffff811115611cb957604051631e4e01d760e21b815260040160405180910390fd5b9250611cfd915050565b81515f03611ce457604051630f16066b60e41b815260040160405180910390fd5b604051630358cd2160e31b815260040160405180910390fd5b919050565b5f8151600203611d9757602082015160408301516001600160e01b038216601b0b60e083901d5f611d3483838361213f565b6001600160e01b038516601b0b935060e085901d925090505f611d5884848361213f565b905060ff821180611d69575060ff81115b15611d8757604051631e4e01d760e21b815260040160405180910390fd5b60081b179450611cfd9350505050565b600282511015611ce457604051630f16066b60e41b815260040160405180910390fd5b5f60608060ff851180611dcd575060ff84115b15611df557604051639b0f326160e01b81526004810186905260248101859052604401610c7d565b6040805160248101909152600386602383015385602283015360106021830153806020830153506004815260408051602081019091525f8152600197919650945092505050565b60605f611e4883612181565b90505f611e5682602061253a565b9050606060405190508160200181016040528281526020850160208651028101602083015b81831015611e9e57602083515102806020855101835e6020939093019201611e7b565b50919695505050505050565b611f376040518061026001604052805f81526020015f81526020015f81526020015f81526020015f81526020015f81526020015f80191681526020015f81526020015f81526020015f81526020015f81526020015f81526020015f80191681526020016060815260200160608152602001606081526020015f815260200160608152602001606081525090565b5f6040518061026001604052805f81526020015f81526020015f81526020015f81526020015f81526020015f81526020015f801b81526020015f8152602001600481526020015f81526020015f81526020015f81526020015f801b815260200184815260200185815260200160046001600160401b03811115611fbc57611fbc6123b1565b604051908082528060200260200182016040528015611fe5578160200160208202803683370190505b5081525f602080830182905260408084018b905260609384018a90528051601f01601f19168281528083018252835161ffff191681178452855290840182905283018190529082018190526080820181905260a08201819052610120820181905261014082018190526102008201529050611c14565b5f80825f528360205360215f2090506001815f1a1b915062ffffff8116611be7575060019250929050565b5f5f1982036120985750610100919050565b507f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f7f5555555555555555555555555555555555555555555555555555555555555555600183901c16909103600281901c7f3333333333333333333333333333333333333333333333333333333333333333908116911601600481901c01167f01010101010101010101010101010101010101010101010101010101010101010260f81c90565b5f805f61214d8686866121ca565b91509150806121785760405162bc8ecf60e31b81526004810187905260248101869052604401610c7d565b50949350505050565b5f60208201602083510281015b808210156121c35781515192830192808410156121b757634e487b715f5260116020526024601cfd5b5060208201915061218e565b5050919050565b5f805f8512156121f757604051634a7d166b60e01b81526004810186905260248101859052604401610c7d565b845f0361220957505f90506001611b0f565b8460ff84168501858112156122445760405163c849483b60e01b8152600481018890526024810187905260ff86166044820152606401610c7d565b5f805f83121561229057604c19831215612267575f809550955050505050611b0f565b825f03600a0a915081848161227e5761227e612507565b0495505084029091149150611b0f9050565b5f83131561232957604d8313156122cd5760405163c849483b60e01b8152600481018a90526024810189905260ff88166044820152606401610c7d565b82600a0a9150815f19816122e3576122e3612507565b048411156123175760405163c849483b60e01b8152600481018a90526024810189905260ff88166044820152606401610c7d565b5091909102925060019150611b0f9050565b8360019550955050505050611b0f565b612341612551565b565b5f60208284031215612353575f80fd5b81356001600160e01b03198116811461236a575f80fd5b9392505050565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f61236a6020830184612371565b634e487b7160e01b5f52604160045260245ffd5b5f602082840312156123d5575f80fd5b81356001600160401b03808211156123eb575f80fd5b818401915084601f8301126123fe575f80fd5b813581811115612410576124106123b1565b604051601f8201601f19908116603f01168101908382118183101715612438576124386123b1565b81604052828152876020848701011115612450575f80fd5b826020860160208301375f928101602001929092525095945050505050565b83151581525f60206060602084015261248b6060840186612371565b8381036040850152845180825260208087019201905f5b818110156124be578351835292840192918401916001016124a2565b509098975050505050505050565b634e487b7160e01b5f52601160045260245ffd5b808201808211156101d1576101d16124cc565b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52601260045260245ffd5b5f8261253557634e487b7160e01b5f52601260045260245ffd5b500490565b80820281158282048414176101d1576101d16124cc565b634e487b7160e01b5f52605160045260245ffdfe0101180010800082000100010480300038412a001810000010020004200004002038028ff54904cc66c61df3dcab0616592209895f0b14fec9301902e0920c5bfe561b21609200e959460b1974270f844db208bcd3bf1c9893761e1049db11b93430180ae9a00af82a7805c138f40d28083f0742ef2103d561fd1215a13315716a6117d260cc107b9bfc0eec7ade13cba2891a6b14a51f792bdb01e0f147165655891c3d1c3d1c3d1c3d1c3d1c3d1c3d1c3d1c3d1c3d1c3d1c3d1c3d1c3d1c3d1c3d1c3d1c3d1c3d1c3d1c3d1c3d1c3d1c3d1c3d1c3d1c3d1c3d1c3d1c3d1c661d02168216a016af16be16ce16de16ed16fd170c171c172c173b174b175a176a177a178a17da17e917f81808181818281838184718561866187618861896179917a8"; /// @dev The runtime bytecode of the contract. bytes constant RUNTIME_CODE = - hex"608060405234801561000f575f80fd5b506004361061007a575f3560e01c80636f5aa28d116100585780636f5aa28d146100dd578063c6c0cbb61461010b578063ccf4477514610135578063d6d8c9a814610148575f80fd5b806301ffc9a71461007e578063336284d4146100a6578063570c7a63146100bb575b5f80fd5b61009161008c3660046122f2565b610150565b60405190151581526020015b60405180910390f35b6100ae6101d7565b60405161009d919061234e565b6100ce6100c9366004612374565b610bc5565b60405161009d9392919061241e565b6040517ff2d0eca454c544ab10f9991c019349475a416e38494f112a50807174c3000d0b815260200161009d565b61011e610119366004612374565b610d09565b60408051921515835260208301919091520161009d565b60408051602081019091525f81526100ae565b6100ae610d41565b5f6001600160e01b031982166391ccb1d560e01b148061018057506001600160e01b03198216636f5aa28d60e01b145b8061019b57506001600160e01b03198216631a2c8edd60e01b145b806101b657506001600160e01b03198216630cd8a13560e21b145b806101d157506301ffc9a760e01b6001600160e01b03198316145b92915050565b60605f6101e66004600161248f565b6101f190600261248f565b6101fc90600161248f565b61020790600161248f565b6001600160401b0381111561021e5761021e612360565b60405190808252806020026020018201604052801561025157816020015b606081526020019060019003908161023c5790505b50604080516002808252606082019092529192505f9190816020015b6122e881526020019060019003908161026d5790505090506116cc815f8151811061029a5761029a6124a2565b60200260200101906001600160401b031690816001600160401b0316815250506116e9816001815181106102d0576102d06124a2565b6001600160401b039290921660209283029190910190910152604080516003808252608082019092525f91816020015b6122e88152602001906001900390816103005790505090506116f8815f8151811061032d5761032d6124a2565b60200260200101906001600160401b031690816001600160401b03168152505061170781600181518110610363576103636124a2565b60200260200101906001600160401b031690816001600160401b03168152505061171681600281518110610399576103996124a2565b6001600160401b039290921660209283029190910190910152604080516002808252606082019092525f91816020015b6122e88152602001906001900390816103c9579050509050611726815f815181106103f6576103f66124a2565b60200260200101906001600160401b031690816001600160401b0316815250506117358160018151811061042c5761042c6124a2565b6001600160401b03929092166020928302919091019091015260408051600580825260c082019092525f91816020015b6122e881526020019060019003908161045c579050509050611745815f81518110610489576104896124a2565b60200260200101906001600160401b031690816001600160401b031681525050611754816001815181106104bf576104bf6124a2565b60200260200101906001600160401b031690816001600160401b031681525050611764816002815181106104f5576104f56124a2565b60200260200101906001600160401b031690816001600160401b0316815250506117748160038151811061052b5761052b6124a2565b60200260200101906001600160401b031690816001600160401b03168152505061178381600481518110610561576105616124a2565b6001600160401b03929092166020928302919091019091015260408051600580825260c082019092525f91816020015b6122e8815260200190600190039081610591579050509050611793815f815181106105be576105be6124a2565b60200260200101906001600160401b031690816001600160401b0316815250506117a2816001815181106105f4576105f46124a2565b60200260200101906001600160401b031690816001600160401b0316815250506117b28160028151811061062a5761062a6124a2565b60200260200101906001600160401b031690816001600160401b0316815250506117c281600381518110610660576106606124a2565b60200260200101906001600160401b031690816001600160401b0316815250506117d281600481518110610696576106966124a2565b6001600160401b0392909216602092830291909101909101526040805160018082528183019092525f91816020015b6122e88152602001906001900390816106c55790505090506117e1815f815181106106f2576106f26124a2565b6001600160401b0392909216602092830291909101909101526040805160018082528183019092525f91816020015b6122e88152602001906001900390816107215790505090506117f0815f8151811061074e5761074e6124a2565b60200260200101906001600160401b031690816001600160401b03168152505086885f81518110610781576107816124a2565b602002602001018190525085886001815181106107a0576107a06124a2565b602002602001018190525084886002815181106107bf576107bf6124a2565b602002602001018190525083886003815181106107de576107de6124a2565b602002602001018190525082886004815181106107fd576107fd6124a2565b6020026020010181905250818860058151811061081c5761081c6124a2565b6020026020010181905250808860068151811061083b5761083b6124a2565b602090810291909101015260408051600680825260e082019092525f91816020015b6122e881526020019060019003908161085d5790505090506116cc815f8151811061088a5761088a6124a2565b60200260200101906001600160401b031690816001600160401b0316815250506116f8816001815181106108c0576108c06124a2565b60200260200101906001600160401b031690816001600160401b031681525050611707816002815181106108f6576108f66124a2565b60200260200101906001600160401b031690816001600160401b0316815250506117168160038151811061092c5761092c6124a2565b60200260200101906001600160401b031690816001600160401b03168152505061182581600481518110610962576109626124a2565b60200260200101906001600160401b031690816001600160401b03168152505061183581600581518110610998576109986124a2565b6001600160401b039092166020928302919091019091015280896109be6006600161248f565b815181106109ce576109ce6124a2565b602090810291909101015260408051600780825261010082019092525f91816020015b6122e88152602001906001900390816109f15790505090506116cc815f81518110610a1e57610a1e6124a2565b60200260200101906001600160401b031690816001600160401b0316815250506116f881600181518110610a5457610a546124a2565b60200260200101906001600160401b031690816001600160401b03168152505061170781600281518110610a8a57610a8a6124a2565b60200260200101906001600160401b031690816001600160401b03168152505061171681600381518110610ac057610ac06124a2565b60200260200101906001600160401b031690816001600160401b03168152505061182581600481518110610af657610af66124a2565b60200260200101906001600160401b031690816001600160401b03168152505061183581600581518110610b2c57610b2c6124a2565b60200260200101906001600160401b031690816001600160401b03168152505061184581600681518110610b6257610b626124a2565b6001600160401b0390921660209283029190910190910152808a610b886006600261248f565b81518110610b9857610b986124a2565b602090810291909101015289610bb5610bb082611855565b61186a565b9b50505050505050505050505090565b5f6060805f805f610be587610bd86118f9565b610be0611919565b611939565b9250925092505f610bfb82610220015160200190565b90505f8261022001515182610c10919061248f565b90505f610c2e83836f07fffffe0000000003ff200000000000611a2a565b80925081945050505f80610c4786610240015184611ac6565b915091508115610cdc575f610c5c8783611b9d565b90506122e85f610c6a611bcc565b90505f60028251610c7b91906124ca565b9050808510610cac576040516303bdd1b160e51b815260048101869052602481018290526044015b60405180910390fd5b6001850160020282015161ffff169250610cc58c8c8686565b9e509e509e50505050505050505050505050610d02565b5050604080515f80825281830190925260208101828152919a5090985096505050505050505b9193909250565b5f805f805f610d31866002810151815160228084019461ffff93909316840101920160200190565b505f988998509650505050505050565b60605f610d506004600161248f565b610d5b90600261248f565b610d6690600161248f565b610d7190600161248f565b6001600160401b03811115610d8857610d88612360565b604051908082528060200260200182016040528015610dbb57816020015b6060815260200190600190039081610da65790505b50604080516002808252606082019092529192505f9190816020015b6122e8815260200190600190039081610dd7579050509050611bec815f81518110610e0457610e046124a2565b60200260200101906001600160401b031690816001600160401b031681525050611bec81600181518110610e3a57610e3a6124a2565b6001600160401b039290921660209283029190910190910152604080516003808252608082019092525f91816020015b6122e8815260200190600190039081610e6a579050509050611bec815f81518110610e9757610e976124a2565b60200260200101906001600160401b031690816001600160401b031681525050611bec81600181518110610ecd57610ecd6124a2565b60200260200101906001600160401b031690816001600160401b031681525050611bec81600281518110610f0357610f036124a2565b6001600160401b039290921660209283029190910190910152604080516002808252606082019092525f91816020015b6122e8815260200190600190039081610f33579050509050611bec815f81518110610f6057610f606124a2565b60200260200101906001600160401b031690816001600160401b031681525050611bec81600181518110610f9657610f966124a2565b6001600160401b03929092166020928302919091019091015260408051600580825260c082019092525f91816020015b6122e8815260200190600190039081610fc6579050509050611bec815f81518110610ff357610ff36124a2565b60200260200101906001600160401b031690816001600160401b031681525050611bec81600181518110611029576110296124a2565b60200260200101906001600160401b031690816001600160401b031681525050611bec8160028151811061105f5761105f6124a2565b60200260200101906001600160401b031690816001600160401b031681525050611bec81600381518110611095576110956124a2565b60200260200101906001600160401b031690816001600160401b031681525050611bec816004815181106110cb576110cb6124a2565b6001600160401b03929092166020928302919091019091015260408051600580825260c082019092525f91816020015b6122e88152602001906001900390816110fb579050509050611bec815f81518110611128576111286124a2565b60200260200101906001600160401b031690816001600160401b031681525050611bec8160018151811061115e5761115e6124a2565b60200260200101906001600160401b031690816001600160401b031681525050611bec81600281518110611194576111946124a2565b60200260200101906001600160401b031690816001600160401b031681525050611bec816003815181106111ca576111ca6124a2565b60200260200101906001600160401b031690816001600160401b031681525050611bec81600481518110611200576112006124a2565b6001600160401b0392909216602092830291909101909101526040805160018082528183019092525f91816020015b6122e881526020019060019003908161122f579050509050611c15815f8151811061125c5761125c6124a2565b6001600160401b0392909216602092830291909101909101526040805160018082528183019092525f91816020015b6122e881526020019060019003908161128b579050509050611cb1815f815181106112b8576112b86124a2565b60200260200101906001600160401b031690816001600160401b03168152505086885f815181106112eb576112eb6124a2565b6020026020010181905250858860018151811061130a5761130a6124a2565b60200260200101819052508488600281518110611329576113296124a2565b60200260200101819052508388600381518110611348576113486124a2565b60200260200101819052508288600481518110611367576113676124a2565b60200260200101819052508188600581518110611386576113866124a2565b602002602001018190525080886006815181106113a5576113a56124a2565b602090810291909101015260408051600680825260e082019092525f91816020015b6122e88152602001906001900390816113c7579050509050611bec815f815181106113f4576113f46124a2565b60200260200101906001600160401b031690816001600160401b031681525050611bec8160018151811061142a5761142a6124a2565b60200260200101906001600160401b031690816001600160401b031681525050611bec81600281518110611460576114606124a2565b60200260200101906001600160401b031690816001600160401b031681525050611bec81600381518110611496576114966124a2565b60200260200101906001600160401b031690816001600160401b031681525050611bec816004815181106114cc576114cc6124a2565b60200260200101906001600160401b031690816001600160401b031681525050611bec81600581518110611502576115026124a2565b6001600160401b039092166020928302919091019091015280896115286006600161248f565b81518110611538576115386124a2565b602090810291909101015260408051600780825261010082019092525f91816020015b6122e881526020019060019003908161155b579050509050611bec815f81518110611588576115886124a2565b60200260200101906001600160401b031690816001600160401b031681525050611bec816001815181106115be576115be6124a2565b60200260200101906001600160401b031690816001600160401b031681525050611bec816002815181106115f4576115f46124a2565b60200260200101906001600160401b031690816001600160401b031681525050611bec8160038151811061162a5761162a6124a2565b60200260200101906001600160401b031690816001600160401b031681525050611bec81600481518110611660576116606124a2565b60200260200101906001600160401b031690816001600160401b031681525050611bec81600581518110611696576116966124a2565b60200260200101906001600160401b031690816001600160401b031681525050611bec81600681518110610b6257610b626124a2565b5f6060806116da5f80611d69565b92509250925093509350939050565b5f6060806116da5f6001611d69565b5f6060806116da60015f611d69565b5f6060806116da600180611d69565b5f6060806116da60016002611d69565b5f6060806116da60025f611d69565b5f6060806116da60026001611d69565b5f6060806116da60035f611d69565b5f6060806116da60036001611d69565b5f6060806116da60036002611d69565b5f6060806116da600380611d69565b5f6060806116da60036004611d69565b5f6060806116da60045f611d69565b5f6060806116da60046001611d69565b5f6060806116da60046002611d69565b5f6060806116da60046003611d69565b5f6060806116da600480611d69565b5f6060806116da600585611d69565b5f60608060ff80851690600886901c1661181461180e83600661248f565b82611d69565b945094509450505093509350939050565b5f6060806116da60016003611d69565b5f6060806116da60016004611d69565b5f6060806116da60016005611d69565b6060815f61186282611deb565b949350505050565b60605f82516002026001600160401b0381111561188957611889612360565b6040519080825280601f01601f1916602001820160405280156118b3576020820181803683370190505b50905061ffff80196020850160208651028101600285015b818310156118ed578051835186169085161781526020909201916002016118cb565b50939695505050505050565b60606040518060e0016040528060a2815260200161259560a29139905090565b606060405180606001604052806040815260200161251560409139905090565b5f806119c86040518061026001604052805f81526020015f81526020015f81526020015f81526020015f81526020015f81526020015f80191681526020015f81526020015f81526020015f81526020015f81526020015f81526020015f80191681526020016060815260200160608152602001606081526020015f815260200160608152602001606081525090565b606061ffff600288015116935060ff600388015116925061ffff600588015116600588019750808852602081018801915050611a1487878760405180602001604052805f815250611e59565b915080826101e001819052505093509350939050565b5f808060018187870360208111611a415780611a44565b60205b915050875192505b8519600184841a1b16158183101615611a6a57600182019150611a4c565b9681019660208290036008810293841c90931b92611ab55760408051602081018590520160408051601f198184030181529082905263e47fe8b760e01b8252610ca39160040161234e565b50869350909150505b935093915050565b600182810180515f928392600560ff93909316602102870192830192909101835b81831015611b8b5760018301516021909301805190935f90819060ff168180611b10838e61200a565b915091508186165f03611b32575f809b509b5050505050505050505050611b96565b5f87611b42600185038916612035565b016004028b015195505062ffffff9081169350841683039150611b769050575060019750601c1a9550611b96945050505050565b611b7f83612035565b84019350505050611ae7565b5f8095509550505050505b9250929050565b6101c08201516002828102820101516101e08401515f9261ffff9092169190611bc39083565b95945050505050565b606060405180606001604052806040815260200161255560409139905090565b5f81515f14611c0e576040516304f8b58160e51b815260040160405180910390fd5b505f919050565b5f8151600103611c72575060208101516001600160e01b038116601b0b60e082901d5f611c438383836120ee565b905061ffff811115611c6857604051631e4e01d760e21b815260040160405180910390fd5b9250611cac915050565b81515f03611c9357604051630f16066b60e41b815260040160405180910390fd5b604051630358cd2160e31b815260040160405180910390fd5b919050565b5f8151600203611d4657602082015160408301516001600160e01b038216601b0b60e083901d5f611ce38383836120ee565b6001600160e01b038516601b0b935060e085901d925090505f611d078484836120ee565b905060ff821180611d18575060ff81115b15611d3657604051631e4e01d760e21b815260040160405180910390fd5b60081b179450611cac9350505050565b600282511015611c9357604051630f16066b60e41b815260040160405180910390fd5b5f60608060ff851180611d7c575060ff84115b15611da457604051639b0f326160e01b81526004810186905260248101859052604401610ca3565b6040805160248101909152600386602383015385602283015360106021830153806020830153506004815260408051602081019091525f8152600197919650945092505050565b60605f611df783612130565b90505f611e058260206124e9565b9050606060405190508160200181016040528281526020850160208651028101602083015b81831015611e4d57602083515102806020855101835e6020939093019201611e2a565b50919695505050505050565b611ee66040518061026001604052805f81526020015f81526020015f81526020015f81526020015f81526020015f81526020015f80191681526020015f81526020015f81526020015f81526020015f81526020015f81526020015f80191681526020016060815260200160608152602001606081526020015f815260200160608152602001606081525090565b5f6040518061026001604052805f81526020015f81526020015f81526020015f81526020015f81526020015f81526020015f801b81526020015f8152602001600481526020015f81526020015f81526020015f81526020015f801b815260200184815260200185815260200160046001600160401b03811115611f6b57611f6b612360565b604051908082528060200260200182016040528015611f94578160200160208202803683370190505b5081525f602080830182905260408084018b905260609384018a90528051601f01601f19168281528083018252835161ffff191681178452855290840182905283018190529082018190526080820181905260a08201819052610120820181905261014082018190526102008201529050611bc3565b5f80825f528360205360215f2090506001815f1a1b915062ffffff8116611b96575060019250929050565b5f5f1982036120475750610100919050565b507f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f7f5555555555555555555555555555555555555555555555555555555555555555600183901c16909103600281901c7f3333333333333333333333333333333333333333333333333333333333333333908116911601600481901c01167f01010101010101010101010101010101010101010101010101010101010101010260f81c90565b5f805f6120fc868686612179565b91509150806121275760405162bc8ecf60e31b81526004810187905260248101869052604401610ca3565b50949350505050565b5f60208201602083510281015b8082101561217257815151928301928084101561216657634e487b715f5260116020526024601cfd5b5060208201915061213d565b5050919050565b5f805f8512156121a657604051634a7d166b60e01b81526004810186905260248101859052604401610ca3565b845f036121b857505f90506001611abe565b8460ff84168501858112156121f35760405163c849483b60e01b8152600481018890526024810187905260ff86166044820152606401610ca3565b5f805f83121561223f57604c19831215612216575f809550955050505050611abe565b825f03600a0a915081848161222d5761222d6124b6565b0495505084029091149150611abe9050565b5f8313156122d857604d83131561227c5760405163c849483b60e01b8152600481018a90526024810189905260ff88166044820152606401610ca3565b82600a0a9150815f1981612292576122926124b6565b048411156122c65760405163c849483b60e01b8152600481018a90526024810189905260ff88166044820152606401610ca3565b5091909102925060019150611abe9050565b8360019550955050505050611abe565b6122f0612500565b565b5f60208284031215612302575f80fd5b81356001600160e01b031981168114612319575f80fd5b9392505050565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f6123196020830184612320565b634e487b7160e01b5f52604160045260245ffd5b5f60208284031215612384575f80fd5b81356001600160401b038082111561239a575f80fd5b818401915084601f8301126123ad575f80fd5b8135818111156123bf576123bf612360565b604051601f8201601f19908116603f011681019083821181831017156123e7576123e7612360565b816040528281528760208487010111156123ff575f80fd5b826020860160208301375f928101602001929092525095945050505050565b83151581525f60206060602084015261243a6060840186612320565b8381036040850152845180825260208087019201905f5b8181101561246d57835183529284019291840191600101612451565b509098975050505050505050565b634e487b7160e01b5f52601160045260245ffd5b808201808211156101d1576101d161247b565b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52601260045260245ffd5b5f826124e457634e487b7160e01b5f52601260045260245ffd5b500490565b80820281158282048414176101d1576101d161247b565b634e487b7160e01b5f52605160045260245ffdfe1bec1bec1bec1bec1bec1bec1bec1bec1bec1bec1bec1bec1bec1bec1bec1bec1bec1c151cb11bec1bec1bec1bec1bec1bec1bec1bec1bec1bec1bec1bec1bec16cc16e916f8170717161726173517451754176417741783179317a217b217c217d217e117f016cc16f8170717161825183516cc16f8170717161825183518450101180010800082000100010480300038412a001810000010020004200004002038038ff54900cc66c61ff3dcab0616592209895f0b16fec9301b02e0920c5bfe561d21609201e959460b1974270f844db208bcd3bf1e989376111049db13b934301a0ae9a00af82a7805c138f40d28083f0742ef2104d561fd1415a13317716a6119d260cc107b9bfc0eec7ade15cba2891c6b14a512792bdb02e0f14718565589"; + hex"608060405234801561000f575f80fd5b506004361061007a575f3560e01c80636f5aa28d116100585780636f5aa28d146100dd578063c6c0cbb61461010b578063ccf4477514610135578063d6d8c9a814610148575f80fd5b806301ffc9a71461007e578063336284d4146100a6578063570c7a63146100bb575b5f80fd5b61009161008c366004612343565b610150565b60405190151581526020015b60405180910390f35b6100ae6101d7565b60405161009d919061239f565b6100ce6100c93660046123c5565b610b9f565b60405161009d9392919061246f565b6040517fe43208b51e17b3d887e8f3535d75526c0744eee6a200dac603462c6b3ca46511815260200161009d565b61011e6101193660046123c5565b610ce3565b60408051921515835260208301919091520161009d565b60408051602081019091525f81526100ae565b6100ae610d1b565b5f6001600160e01b031982166391ccb1d560e01b148061018057506001600160e01b03198216636f5aa28d60e01b145b8061019b57506001600160e01b03198216631a2c8edd60e01b145b806101b657506001600160e01b03198216630cd8a13560e21b145b806101d157506301ffc9a760e01b6001600160e01b03198316145b92915050565b60605f6101e6600960016124e0565b6001600160401b038111156101fd576101fd6123b1565b60405190808252806020026020018201604052801561023057816020015b606081526020019060019003908161021b5790505b506040805160018082528183019092529192505f9190816020015b61233981526020019060019003908161024b579050509050611682815f81518110610278576102786124f3565b6001600160401b03929092166020928302919091019091015260408051600480825260a082019092525f91816020015b6123398152602001906001900390816102a85790505090506116a0815f815181106102d5576102d56124f3565b60200260200101906001600160401b031690816001600160401b0316815250506116af8160018151811061030b5761030b6124f3565b60200260200101906001600160401b031690816001600160401b0316815250506116be81600281518110610341576103416124f3565b60200260200101906001600160401b031690816001600160401b0316815250506116ce81600381518110610377576103776124f3565b6001600160401b039290921660209283029190910190910152604080516002808252606082019092525f91816020015b6123398152602001906001900390816103a75790505090506116de815f815181106103d4576103d46124f3565b60200260200101906001600160401b031690816001600160401b0316815250506116ed8160018151811061040a5761040a6124f3565b6001600160401b03929092166020928302919091019091015260408051600580825260c082019092525f91816020015b61233981526020019060019003908161043a5790505090506116fd815f81518110610467576104676124f3565b60200260200101906001600160401b031690816001600160401b03168152505061170c8160018151811061049d5761049d6124f3565b60200260200101906001600160401b031690816001600160401b03168152505061171c816002815181106104d3576104d36124f3565b60200260200101906001600160401b031690816001600160401b03168152505061172c81600381518110610509576105096124f3565b60200260200101906001600160401b031690816001600160401b03168152505061173b8160048151811061053f5761053f6124f3565b6001600160401b03929092166020928302919091019091015260408051600580825260c082019092525f91816020015b61233981526020019060019003908161056f57905050905061174b815f8151811061059c5761059c6124f3565b60200260200101906001600160401b031690816001600160401b03168152505061175a816001815181106105d2576105d26124f3565b60200260200101906001600160401b031690816001600160401b03168152505061176a81600281518110610608576106086124f3565b60200260200101906001600160401b031690816001600160401b03168152505061177a8160038151811061063e5761063e6124f3565b60200260200101906001600160401b031690816001600160401b03168152505061178a81600481518110610674576106746124f3565b6001600160401b0392909216602092830291909101909101526040805160018082528183019092525f91816020015b6123398152602001906001900390816106a3579050509050611799815f815181106106d0576106d06124f3565b6001600160401b0392909216602092830291909101909101526040805160018082528183019092525f91816020015b6123398152602001906001900390816106ff5790505090506117a8815f8151811061072c5761072c6124f3565b60200260200101906001600160401b031690816001600160401b03168152505086885f8151811061075f5761075f6124f3565b6020026020010181905250858860018151811061077e5761077e6124f3565b6020026020010181905250848860028151811061079d5761079d6124f3565b602002602001018190525083886003815181106107bc576107bc6124f3565b602002602001018190525082886004815181106107db576107db6124f3565b602002602001018190525081886008815181106107fa576107fa6124f3565b60200260200101819052508088600981518110610819576108196124f3565b602090810291909101015260408051600680825260e082019092525f91816020015b61233981526020019060019003908161083b5790505090506117da815f81518110610868576108686124f3565b60200260200101906001600160401b031690816001600160401b0316815250506117e98160018151811061089e5761089e6124f3565b60200260200101906001600160401b031690816001600160401b0316815250506117f8816002815181106108d4576108d46124f3565b60200260200101906001600160401b031690816001600160401b0316815250506118088160038151811061090a5761090a6124f3565b60200260200101906001600160401b031690816001600160401b03168152505061181881600481518110610940576109406124f3565b60200260200101906001600160401b031690816001600160401b03168152505061182881600581518110610976576109766124f3565b60200260200101906001600160401b031690816001600160401b03168152505080896005815181106109aa576109aa6124f3565b602090810291909101015260408051600780825261010082019092525f91816020015b6123398152602001906001900390816109cd579050509050611838815f815181106109fa576109fa6124f3565b60200260200101906001600160401b031690816001600160401b03168152505061184781600181518110610a3057610a306124f3565b60200260200101906001600160401b031690816001600160401b03168152505061185681600281518110610a6657610a666124f3565b60200260200101906001600160401b031690816001600160401b03168152505061186681600381518110610a9c57610a9c6124f3565b60200260200101906001600160401b031690816001600160401b03168152505061187681600481518110610ad257610ad26124f3565b60200260200101906001600160401b031690816001600160401b03168152505061188681600581518110610b0857610b086124f3565b60200260200101906001600160401b031690816001600160401b03168152505061189681600681518110610b3e57610b3e6124f3565b60200260200101906001600160401b031690816001600160401b031681525050808a600681518110610b7257610b726124f3565b602090810291909101015289610b8f610b8a826118a6565b6118bb565b9b50505050505050505050505090565b5f6060805f805f610bbf87610bb261194a565b610bba61196a565b61198a565b9250925092505f610bd582610220015160200190565b90505f8261022001515182610bea91906124e0565b90505f610c0883836f07fffffe0000000003ff200000000000611a7b565b80925081945050505f80610c2186610240015184611b17565b915091508115610cb6575f610c368783611bee565b90506123395f610c44611c1d565b90505f60028251610c55919061251b565b9050808510610c86576040516303bdd1b160e51b815260048101869052602481018290526044015b60405180910390fd5b6001850160020282015161ffff169250610c9f8c8c8686565b9e509e509e50505050505050505050505050610cdc565b5050604080515f80825281830190925260208101828152919a5090985096505050505050505b9193909250565b5f805f805f610d0b866002810151815160228084019461ffff93909316840101920160200190565b505f988998509650505050505050565b60605f610d2a600960016124e0565b6001600160401b03811115610d4157610d416123b1565b604051908082528060200260200182016040528015610d7457816020015b6060815260200190600190039081610d5f5790505b506040805160018082528183019092529192505f9190816020015b612339815260200190600190039081610d8f579050509050611c3d815f81518110610dbc57610dbc6124f3565b6001600160401b03929092166020928302919091019091015260408051600480825260a082019092525f91816020015b612339815260200190600190039081610dec579050509050611c3d815f81518110610e1957610e196124f3565b60200260200101906001600160401b031690816001600160401b031681525050611c3d81600181518110610e4f57610e4f6124f3565b60200260200101906001600160401b031690816001600160401b031681525050611c3d81600281518110610e8557610e856124f3565b60200260200101906001600160401b031690816001600160401b031681525050611c3d81600381518110610ebb57610ebb6124f3565b6001600160401b039290921660209283029190910190910152604080516002808252606082019092525f91816020015b612339815260200190600190039081610eeb579050509050611c3d815f81518110610f1857610f186124f3565b60200260200101906001600160401b031690816001600160401b031681525050611c3d81600181518110610f4e57610f4e6124f3565b6001600160401b03929092166020928302919091019091015260408051600580825260c082019092525f91816020015b612339815260200190600190039081610f7e579050509050611c3d815f81518110610fab57610fab6124f3565b60200260200101906001600160401b031690816001600160401b031681525050611c3d81600181518110610fe157610fe16124f3565b60200260200101906001600160401b031690816001600160401b031681525050611c3d81600281518110611017576110176124f3565b60200260200101906001600160401b031690816001600160401b031681525050611c3d8160038151811061104d5761104d6124f3565b60200260200101906001600160401b031690816001600160401b031681525050611c3d81600481518110611083576110836124f3565b6001600160401b03929092166020928302919091019091015260408051600580825260c082019092525f91816020015b6123398152602001906001900390816110b3579050509050611c3d815f815181106110e0576110e06124f3565b60200260200101906001600160401b031690816001600160401b031681525050611c3d81600181518110611116576111166124f3565b60200260200101906001600160401b031690816001600160401b031681525050611c3d8160028151811061114c5761114c6124f3565b60200260200101906001600160401b031690816001600160401b031681525050611c3d81600381518110611182576111826124f3565b60200260200101906001600160401b031690816001600160401b031681525050611c3d816004815181106111b8576111b86124f3565b6001600160401b0392909216602092830291909101909101526040805160018082528183019092525f91816020015b6123398152602001906001900390816111e7579050509050611c66815f81518110611214576112146124f3565b6001600160401b0392909216602092830291909101909101526040805160018082528183019092525f91816020015b612339815260200190600190039081611243579050509050611d02815f81518110611270576112706124f3565b60200260200101906001600160401b031690816001600160401b03168152505086885f815181106112a3576112a36124f3565b602002602001018190525085886001815181106112c2576112c26124f3565b602002602001018190525084886002815181106112e1576112e16124f3565b60200260200101819052508388600381518110611300576113006124f3565b6020026020010181905250828860048151811061131f5761131f6124f3565b6020026020010181905250818860088151811061133e5761133e6124f3565b6020026020010181905250808860098151811061135d5761135d6124f3565b602090810291909101015260408051600680825260e082019092525f91816020015b61233981526020019060019003908161137f579050509050611c3d815f815181106113ac576113ac6124f3565b60200260200101906001600160401b031690816001600160401b031681525050611c3d816001815181106113e2576113e26124f3565b60200260200101906001600160401b031690816001600160401b031681525050611c3d81600281518110611418576114186124f3565b60200260200101906001600160401b031690816001600160401b031681525050611c3d8160038151811061144e5761144e6124f3565b60200260200101906001600160401b031690816001600160401b031681525050611c3d81600481518110611484576114846124f3565b60200260200101906001600160401b031690816001600160401b031681525050611c3d816005815181106114ba576114ba6124f3565b60200260200101906001600160401b031690816001600160401b03168152505080896005815181106114ee576114ee6124f3565b602090810291909101015260408051600780825261010082019092525f91816020015b612339815260200190600190039081611511579050509050611c3d815f8151811061153e5761153e6124f3565b60200260200101906001600160401b031690816001600160401b031681525050611c3d81600181518110611574576115746124f3565b60200260200101906001600160401b031690816001600160401b031681525050611c3d816002815181106115aa576115aa6124f3565b60200260200101906001600160401b031690816001600160401b031681525050611c3d816003815181106115e0576115e06124f3565b60200260200101906001600160401b031690816001600160401b031681525050611c3d81600481518110611616576116166124f3565b60200260200101906001600160401b031690816001600160401b031681525050611c3d8160058151811061164c5761164c6124f3565b60200260200101906001600160401b031690816001600160401b031681525050611c3d81600681518110610b3e57610b3e6124f3565b5f6060806116915f6001611dba565b92509250925093509350939050565b5f60608061169160015f611dba565b5f606080611691600180611dba565b5f60608061169160016002611dba565b5f60608061169160016003611dba565b5f60608061169160025f611dba565b5f60608061169160026001611dba565b5f60608061169160035f611dba565b5f60608061169160036001611dba565b5f60608061169160036002611dba565b5f606080611691600380611dba565b5f60608061169160036004611dba565b5f60608061169160045f611dba565b5f60608061169160046001611dba565b5f60608061169160046002611dba565b5f60608061169160046003611dba565b5f606080611691600480611dba565b5f606080611691600885611dba565b5f60608060ff8416600885901c6117c96117c38360096124e0565b82611dba565b945094509450505093509350939050565b5f606080611691600580611dba565b5f60608061169160055f611dba565b5f60608061169160056001611dba565b5f60608061169160056002611dba565b5f60608061169160056003611dba565b5f60608061169160056004611dba565b5f606080611691600680611dba565b5f60608061169160065f611dba565b5f60608061169160066001611dba565b5f60608061169160066002611dba565b5f60608061169160066003611dba565b5f60608061169160066004611dba565b5f60608061169160066005611dba565b6060815f6118b382611e3c565b949350505050565b60605f82516002026001600160401b038111156118da576118da6123b1565b6040519080825280601f01601f191660200182016040528015611904576020820181803683370190505b50905061ffff80196020850160208651028101600285015b8183101561193e5780518351861690851617815260209092019160020161191c565b50939695505050505050565b60606040518060e0016040528060a2815260200161256660a29139905090565b606060405180606001604052806040815260200161260860409139905090565b5f80611a196040518061026001604052805f81526020015f81526020015f81526020015f81526020015f81526020015f81526020015f80191681526020015f81526020015f81526020015f81526020015f81526020015f81526020015f80191681526020016060815260200160608152602001606081526020015f815260200160608152602001606081525090565b606061ffff600288015116935060ff600388015116925061ffff600588015116600588019750808852602081018801915050611a6587878760405180602001604052805f815250611eaa565b915080826101e001819052505093509350939050565b5f808060018187870360208111611a925780611a95565b60205b915050875192505b8519600184841a1b16158183101615611abb57600182019150611a9d565b9681019660208290036008810293841c90931b92611b065760408051602081018590520160408051601f198184030181529082905263e47fe8b760e01b8252610c7d9160040161239f565b50869350909150505b935093915050565b600182810180515f928392600560ff93909316602102870192830192909101835b81831015611bdc5760018301516021909301805190935f90819060ff168180611b61838e61205b565b915091508186165f03611b83575f809b509b5050505050505050505050611be7565b5f87611b93600185038916612086565b016004028b015195505062ffffff9081169350841683039150611bc79050575060019750601c1a9550611be7945050505050565b611bd083612086565b84019350505050611b38565b5f8095509550505050505b9250929050565b6101c08201516002828102820101516101e08401515f9261ffff9092169190611c149083565b95945050505050565b606060405180606001604052806040815260200161264860409139905090565b5f81515f14611c5f576040516304f8b58160e51b815260040160405180910390fd5b505f919050565b5f8151600103611cc3575060208101516001600160e01b038116601b0b60e082901d5f611c9483838361213f565b905061ffff811115611cb957604051631e4e01d760e21b815260040160405180910390fd5b9250611cfd915050565b81515f03611ce457604051630f16066b60e41b815260040160405180910390fd5b604051630358cd2160e31b815260040160405180910390fd5b919050565b5f8151600203611d9757602082015160408301516001600160e01b038216601b0b60e083901d5f611d3483838361213f565b6001600160e01b038516601b0b935060e085901d925090505f611d5884848361213f565b905060ff821180611d69575060ff81115b15611d8757604051631e4e01d760e21b815260040160405180910390fd5b60081b179450611cfd9350505050565b600282511015611ce457604051630f16066b60e41b815260040160405180910390fd5b5f60608060ff851180611dcd575060ff84115b15611df557604051639b0f326160e01b81526004810186905260248101859052604401610c7d565b6040805160248101909152600386602383015385602283015360106021830153806020830153506004815260408051602081019091525f8152600197919650945092505050565b60605f611e4883612181565b90505f611e5682602061253a565b9050606060405190508160200181016040528281526020850160208651028101602083015b81831015611e9e57602083515102806020855101835e6020939093019201611e7b565b50919695505050505050565b611f376040518061026001604052805f81526020015f81526020015f81526020015f81526020015f81526020015f81526020015f80191681526020015f81526020015f81526020015f81526020015f81526020015f81526020015f80191681526020016060815260200160608152602001606081526020015f815260200160608152602001606081525090565b5f6040518061026001604052805f81526020015f81526020015f81526020015f81526020015f81526020015f81526020015f801b81526020015f8152602001600481526020015f81526020015f81526020015f81526020015f801b815260200184815260200185815260200160046001600160401b03811115611fbc57611fbc6123b1565b604051908082528060200260200182016040528015611fe5578160200160208202803683370190505b5081525f602080830182905260408084018b905260609384018a90528051601f01601f19168281528083018252835161ffff191681178452855290840182905283018190529082018190526080820181905260a08201819052610120820181905261014082018190526102008201529050611c14565b5f80825f528360205360215f2090506001815f1a1b915062ffffff8116611be7575060019250929050565b5f5f1982036120985750610100919050565b507f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f7f5555555555555555555555555555555555555555555555555555555555555555600183901c16909103600281901c7f3333333333333333333333333333333333333333333333333333333333333333908116911601600481901c01167f01010101010101010101010101010101010101010101010101010101010101010260f81c90565b5f805f61214d8686866121ca565b91509150806121785760405162bc8ecf60e31b81526004810187905260248101869052604401610c7d565b50949350505050565b5f60208201602083510281015b808210156121c35781515192830192808410156121b757634e487b715f5260116020526024601cfd5b5060208201915061218e565b5050919050565b5f805f8512156121f757604051634a7d166b60e01b81526004810186905260248101859052604401610c7d565b845f0361220957505f90506001611b0f565b8460ff84168501858112156122445760405163c849483b60e01b8152600481018890526024810187905260ff86166044820152606401610c7d565b5f805f83121561229057604c19831215612267575f809550955050505050611b0f565b825f03600a0a915081848161227e5761227e612507565b0495505084029091149150611b0f9050565b5f83131561232957604d8313156122cd5760405163c849483b60e01b8152600481018a90526024810189905260ff88166044820152606401610c7d565b82600a0a9150815f19816122e3576122e3612507565b048411156123175760405163c849483b60e01b8152600481018a90526024810189905260ff88166044820152606401610c7d565b5091909102925060019150611b0f9050565b8360019550955050505050611b0f565b612341612551565b565b5f60208284031215612353575f80fd5b81356001600160e01b03198116811461236a575f80fd5b9392505050565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f61236a6020830184612371565b634e487b7160e01b5f52604160045260245ffd5b5f602082840312156123d5575f80fd5b81356001600160401b03808211156123eb575f80fd5b818401915084601f8301126123fe575f80fd5b813581811115612410576124106123b1565b604051601f8201601f19908116603f01168101908382118183101715612438576124386123b1565b81604052828152876020848701011115612450575f80fd5b826020860160208301375f928101602001929092525095945050505050565b83151581525f60206060602084015261248b6060840186612371565b8381036040850152845180825260208087019201905f5b818110156124be578351835292840192918401916001016124a2565b509098975050505050505050565b634e487b7160e01b5f52601160045260245ffd5b808201808211156101d1576101d16124cc565b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52601260045260245ffd5b5f8261253557634e487b7160e01b5f52601260045260245ffd5b500490565b80820281158282048414176101d1576101d16124cc565b634e487b7160e01b5f52605160045260245ffdfe0101180010800082000100010480300038412a001810000010020004200004002038028ff54904cc66c61df3dcab0616592209895f0b14fec9301902e0920c5bfe561b21609200e959460b1974270f844db208bcd3bf1c9893761e1049db11b93430180ae9a00af82a7805c138f40d28083f0742ef2103d561fd1215a13315716a6117d260cc107b9bfc0eec7ade13cba2891a6b14a51f792bdb01e0f147165655891c3d1c3d1c3d1c3d1c3d1c3d1c3d1c3d1c3d1c3d1c3d1c3d1c3d1c3d1c3d1c3d1c3d1c3d1c3d1c3d1c3d1c3d1c3d1c3d1c3d1c3d1c3d1c3d1c3d1c3d1c661d02168216a016af16be16ce16de16ed16fd170c171c172c173b174b175a176a177a178a17da17e917f81808181818281838184718561866187618861896179917a8"; /// @dev What MUST already be on a network before this release can be /// broadcast there: an address, and the runtime code that belongs at it. diff --git a/src/generated/candidate/RouteProcessorRaindexV6ArbOrderTaker.sol b/src/generated/candidate/RouteProcessorRaindexV6ArbOrderTaker.sol index ca0962fcb6..6ef11c1d87 100644 --- a/src/generated/candidate/RouteProcessorRaindexV6ArbOrderTaker.sol +++ b/src/generated/candidate/RouteProcessorRaindexV6ArbOrderTaker.sol @@ -5,19 +5,19 @@ pragma solidity ^0.8.25; // THIS FILE IS AUTOGENERATED BY THE BUILD SCRIPT. DO NOT EDIT BY HAND. /// @dev Hash of the known bytecode. -bytes32 constant BYTECODE_HASH = bytes32(0x006d7f55c1070315ad8844299fa1a3876c0a15de48d2edb485ea796ad7c186e0); +bytes32 constant BYTECODE_HASH = bytes32(0xfe252c1f34a2b8ecb516ee2bb658e1d9b22a06f7c8739d2c495c48e3869c2b2e); /// @dev The deterministic deploy address of the contract when deployed via /// the Zoltu factory. -address constant DEPLOYED_ADDRESS = address(0x95F6C77A40F73Fe6CC876671B11f323e91723776); +address constant DEPLOYED_ADDRESS = address(0x6c029C6d6C7c9067F41d856c8EB1B53399652f1C); /// @dev The creation bytecode of the contract. bytes constant CREATION_CODE = - hex"6080604052348015600e575f80fd5b5060017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f005561245a806100405f395ff3fe608060405260043610610034575f3560e01c806301ffc9a71461003d578063691f9ed714610070578063b17c83c11461008f57005b3661003b57005b005b348015610048575f80fd5b5061005c6100573660046116fe565b6100a2565b604051901515815260200160405180910390f35b34801561007b575f80fd5b5061003b61008a366004611739565b6100f3565b61003b61009d3660046117db565b610200565b5f6001600160e01b0319821663691f9ed760e01b14806100d257506001600160e01b0319821663b17c83c160e01b145b806100ed57506301ffc9a760e01b6001600160e01b03198316145b92915050565b736e2d0e71d900474b262e545bc4c98b71ab368d2161011d6001600160a01b038816825f196104c2565b5f61012a83850185611956565b90505f61013f8761013a8b61053c565b6105c0565b5090505f806101518861013a8c61053c565b9150915080610168578161016481611988565b9250505b604051632646478b60e01b81526001600160a01b03861690632646478b9061019e908e9087908f90889030908c906004016119da565b6020604051808303815f875af11580156101ba573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906101de9190611a25565b506101f36001600160a01b038c16865f6104c2565b5050505050505050505050565b6102086105ed565b61021761021482611ba8565b50565b6102246080830183611c64565b90505f0361024557604051639c95219f60e01b815260040160405180910390fd5b6001600160a01b03831673834e1da0d2e04ab48f9efa6a7b9bbdb6ff62839e146102925760405163516e822d60e01b81526001600160a01b03841660048201526024015b60405180910390fd5b5f6102a06080840184611c64565b5f8181106102b0576102b0611caa565b90506020028101906102c29190611cbe565b6102cc9080611cdc565b6102da906040810190611cf0565b6102e76080860186611c64565b5f8181106102f7576102f7611caa565b90506020028101906103099190611cbe565b6020013581811061031c5761031c611caa565b6103329260206040909202019081019150611d36565b90505f6103426080850185611c64565b5f81811061035257610352611caa565b90506020028101906103649190611cbe565b61036e9080611cdc565b61037c906060810190611cf0565b6103896080870187611c64565b5f81811061039957610399611caa565b90506020028101906103ab9190611cbe565b604001358181106103be576103be611caa565b6103d49260206040909202019081019150611d36565b90506103eb6001600160a01b038316865f196104c2565b6040516334e3942b60e11b81526001600160a01b038616906369c7285690610417908790600401611f9a565b60408051808303815f875af1158015610432573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610456919061219a565b5061046d90506001600160a01b038316865f6104c2565b61049261047984611ba8565b836104838561053c565b8461048d8661053c565b61061b565b50506104bd60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b505050565b6104ce8383835f6108ba565b6104bd576104df83835f60016108ba565b61050757604051635274afe760e01b81526001600160a01b0384166004820152602401610289565b61051483838360016108ba565b6104bd57604051635274afe760e01b81526001600160a01b0384166004820152602401610289565b5f61054561091c565b6040516354636d2b60e01b81526001600160a01b038316600482015273200e12d10bb0c5e4a17e7018f0f1161919bb9389906354636d2b906024016020604051808303815f875af115801561059c573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906100ed91906121bc565b5f806001600160e01b038416601b0b60e085901d6105df8282876109a9565b9350935050505b9250929050565b6105f5610b1b565b60027f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b6040805160018082528183019092525f91816020015b6060815260200190600190039081610631575050604080516003808252608082019092529192505f919060208201606080368337019050506040516370a0823160e01b81523060048201529091505f906001600160a01b038816906370a0823190602401602060405180830381865afa1580156106b0573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106d49190611a25565b905080156106f0576106f06001600160a01b0388163383610b5d565b5f6106fb8288610b6a565b50905080835f8151811061071157610711611caa565b602090810291909101015250506040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa158015610762573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107869190611a25565b905080156107a2576107a26001600160a01b0386163383610b5d565b5f6107ad8286610b6a565b50905080836001815181106107c4576107c4611caa565b60209081029190910101525047905080156107e3576107e33382610baa565b5f6107ef826012610b6a565b509050808360028151811061080657610806611caa565b602002602001018181525050505080825f8151811061082757610827611caa565b60209081029190910101526040805160018082528183019092525f91816020015b6040805160a0810182525f918101828152606080830193909352608082018390528152602081019190915281526020019060019003908161084857905050905087815f8151811061089b5761089b611caa565b60200260200101819052506108b08382610c21565b5050505050505050565b60405163095ea7b360e01b5f8181526001600160a01b038616600452602485905291602083604481808b5af1925060015f51148316610910578383151615610904573d5f823e3d81fd5b5f873b113d1516831692505b60405250949350505050565b73200e12d10bb0c5e4a17e7018f0f1161919bb93893b1580610973575073200e12d10bb0c5e4a17e7018f0f1161919bb93893f7f1de7d717526cba131d684e312dedbf0852adef9cced9e36798ae4937f7145d4114155b156109a7576040516373e6d7b360e01b815273200e12d10bb0c5e4a17e7018f0f1161919bb93896004820152602401610289565b565b5f805f8512156109d657604051634a7d166b60e01b81526004810186905260248101859052604401610289565b845f036109e857505f90506001610b13565b8460ff8416850185811215610a235760405163c849483b60e01b8152600481018890526024810187905260ff86166044820152606401610289565b5f805f831215610a6f57604c19831215610a46575f809550955050505050610b13565b825f03600a0a9150818481610a5d57610a5d6121dc565b0495505084029091149150610b139050565b5f831315610b0857604d831315610aac5760405163c849483b60e01b8152600481018a90526024810189905260ff88166044820152606401610289565b82600a0a9150815f1981610ac257610ac26121dc565b04841115610af65760405163c849483b60e01b8152600481018a90526024810189905260ff88166044820152606401610289565b5091909102925060019150610b139050565b509193506001925050505b935093915050565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00546002036109a757604051633ee5aeb560e01b815260040160405180910390fd5b6105148383836001610e69565b5f805f805f610b798787610eb3565b9250925092505f80610b8b8585610f0f565b9150915081838015610b9a5750815b9650965050505050509250929050565b80471015610bd45760405163cf47918160e01b815247600482015260248101829052604401610289565b610bed828260405180602001604052805f815250611158565b15610bf6575050565b3d15610c0857610c0461116d565b5050565b60405163d6bda27560e01b815260040160405180910390fd5b60408051600480825260a082019092525f91816020015b6060815260200190600190039081610c385790505090505f5b8351811015610c9957838181518110610c6c57610c6c611caa565b6020026020010151828281518110610c8657610c86611caa565b6020908102919091010152600101610c51565b50335f8181523060209081526040808320815160a0810183528083018581526060808301879052608083018190529082528185015282518581529384018581528484019093529093909291905b8751811015610e5e57878181518110610d0157610d01611caa565b602002602001015193505f845f015160400151511115610e56575f845f01515f01516001600160a01b031663d04dfe236040518060e00160405280885f0151602001516001600160a01b03168152602001898152602001885f01516040015181526020015f8152602001610d798c8a60200151611178565b8152602001878152602001868152506040518263ffffffff1660e01b8152600401610da49190612277565b5f60405180830381865afa158015610dbe573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610de59190810190612378565b9150505f81511115610e545784516020015160405163012c676d60e21b81526001600160a01b03909116906304b19db490610e26908a90859060040161242e565b5f604051808303815f87803b158015610e3d575f80fd5b505af1158015610e4f573d5f803e3d5ffd5b505050505b505b600101610ce6565b505050505050505050565b60405163a9059cbb60e01b5f8181526001600160a01b038616600452602485905291602083604481808b5af1925060015f51148316610910578383151615610904573d5f823e3d81fd5b5f808060ff841681037f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff861115610efe57600a860460018201600a88065f1493509350935050610f08565b8593509150600190505b9250925092565b5f808383601b82900b821480611045577d90e40fbeea1d3a4abc8955e946fe31cdcf66f634e1000000000000000000870515610f90577f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee8000000000000000000870515610f81576305f5e10087059650600886019550610f90565b620186a0870596506005860195505b8687601b0b14610fab57600a87059650856001019550610f90565b7b0ccccccccccccccccccccccccccccccccccccccccccccccccccccccc7b199999999999999999999999999999999999999999999999999999988882011161103f575f600188039050808160030b0361103d5760e01b6001600160e01b037b7fffffffffffffffffffffffffffffffffffffffffffffffffffffff60ff8b901d18161795505f94506105e69350505050565b505b5061105c565b865f0361105c57505f9350600192506105e6915050565b858660030b14611113575f8213156110bb57611078838361145a565b156110a05760405163d556b11160e01b81526004810184905260248101839052604401610289565b637ffffffe19909501600a0a82029550637fffffff94611113565b637fffffff1986900360438113156110dd57505f94508493506105e692505050565b80600a0a88816110ef576110ef6121dc565b059750875f0361110957505f94508493506105e692505050565b50637fffffff1995505b818613611123576001935061113c565b818603600a0a8381611137576111376121dc565b071593505b5050506001600160e01b03841660e084901b1791509250929050565b5f805f83516020850186885af1949350505050565b6040513d5f823e3d81fd5b60605f825167ffffffffffffffff81111561119557611195611859565b6040519080825280602002602001820160405280156111be578160200160208202803683370190505b5090505f808451116111d0575f6111d6565b83516001015b85516001010190505f8167ffffffffffffffff8111156111f8576111f8611859565b60405190808252806020026020018201604052801561122b57816020015b60608152602001906001900390816112165790505b5090505f61124f604080516002815233602082015230818301526060810190915290565b82828151811061126157611261611caa565b60200260200101819052505f5b87518110156112be57818060010192505087818151811061129157611291611caa565b60200260200101518383815181106112ab576112ab611caa565b602090810291909101015260010161126e565b50855115611450578080600101915050838282815181106112e1576112e1611caa565b60200260200101819052505f5b865181101561144e5761139d87828151811061130c5761130c611caa565b60200260200101515f015161137a6113488a858151811061132f5761132f611caa565b6020026020010151602001518051602090810291012090565b7f19457468657265756d205369676e6564204d6573736167653a0a3332000000005f908152601c91909152603c902090565b89848151811061138c5761138c611caa565b60200260200101516040015161147c565b6113bd57604051630a57f30960e31b815260048101829052602401610289565b8681815181106113cf576113cf611caa565b60200260200101515f01516001600160a01b03165f1b8582815181106113f7576113f7611caa565b602002602001018181525050818060010192505086818151811061141d5761141d611caa565b60200260200101516020015183838151811061143b5761143b611caa565b60209081029190910101526001016112ee565b505b5095945050505050565b5f6114755f841261146b578361146f565b835f035b836114ed565b9392505050565b5f836001600160a01b03163b5f036114da575f8061149a858561158b565b5090925090505f8160038111156114b3576114b3612446565b1480156114d15750856001600160a01b0316826001600160a01b0316145b92505050611475565b6114e58484846115d1565b949350505050565b5f637ffffff5821361150057505f6100ed565b637ffffffe198201604381131561151b5750508115156100ed565b5f811261155b5780600a0a7b8000000000000000000000000000000000000000000000000000000181611550576115506121dc565b0484119150506100ed565b805f03600a0a7b800000000000000000000000000000000000000000000000000000020284101591505092915050565b5f805f83516041036115c2576020840151604085015160608601515f1a6115b488828585611636565b955095509550505050610f08565b505081515f9150600290610f08565b805160408051630b135d3f60e11b8082526004820186905260248201929092525f92906020820185604483015e5f82606483010152601f820160051c60051b915060205f60648401838a5afa9050825f5114601f3d1116811693505050509392505050565b5f80807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a084111561166f57505f915060039050826116f4565b604080515f808252602082018084528a905260ff891692820192909252606081018790526080810186905260019060a0016020604051602081039080840390855afa1580156116c0573d5f803e3d5ffd5b5050604051601f1901519150506001600160a01b0381166116eb57505f9250600191508290506116f4565b92505f91508190505b9450945094915050565b5f6020828403121561170e575f80fd5b81356001600160e01b031981168114611475575f80fd5b6001600160a01b0381168114610214575f80fd5b5f805f805f8060a0878903121561174e575f80fd5b863561175981611725565b9550602087013561176981611725565b94506040870135935060608701359250608087013567ffffffffffffffff80821115611793575f80fd5b818901915089601f8301126117a6575f80fd5b8135818111156117b4575f80fd5b8a60208285010111156117c5575f80fd5b6020830194508093505050509295509295509295565b5f805f606084860312156117ed575f80fd5b83356117f881611725565b9250602084013567ffffffffffffffff80821115611814575f80fd5b9085019060c08288031215611827575f80fd5b9092506040850135908082111561183c575f80fd5b5084016040818703121561184e575f80fd5b809150509250925092565b634e487b7160e01b5f52604160045260245ffd5b6040516060810167ffffffffffffffff8111828210171561189057611890611859565b60405290565b6040805190810167ffffffffffffffff8111828210171561189057611890611859565b604051601f8201601f1916810167ffffffffffffffff811182821017156118e2576118e2611859565b604052919050565b5f82601f8301126118f9575f80fd5b813567ffffffffffffffff81111561191357611913611859565b611926601f8201601f19166020016118b9565b81815284602083860101111561193a575f80fd5b816020850160208301375f918101602001919091529392505050565b5f60208284031215611966575f80fd5b813567ffffffffffffffff81111561197c575f80fd5b6114e5848285016118ea565b5f600182016119a557634e487b7160e01b5f52601160045260245ffd5b5060010190565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b5f6001600160a01b038089168352876020840152808716604084015285606084015280851660808401525060c060a0830152611a1960c08301846119ac565b98975050505050505050565b5f60208284031215611a35575f80fd5b5051919050565b5f67ffffffffffffffff821115611a5557611a55611859565b5060051b60200190565b5f82601f830112611a6e575f80fd5b81356020611a83611a7e83611a3c565b6118b9565b82815260059290921b84018101918181019086841115611aa1575f80fd5b8286015b84811015611b9d57803567ffffffffffffffff80821115611ac4575f80fd5b908801906060828b03601f19011215611adb575f80fd5b611ae361186d565b86830135611af081611725565b815260408381013583811115611b04575f80fd5b8401603f81018d13611b14575f80fd5b88810135611b24611a7e82611a3c565b81815260059190911b82018301908a8101908f831115611b42575f80fd5b928401925b82841015611b605783358252928b0192908b0190611b47565b858c0152505050606084013583811115611b78575f80fd5b611b868d8a838801016118ea565b918301919091525085525050918301918301611aa5565b509695505050505050565b5f60408236031215611bb8575f80fd5b611bc0611896565b823567ffffffffffffffff80821115611bd7575f80fd5b818501915060608236031215611beb575f80fd5b611bf361186d565b8235611bfe81611725565b81526020830135611c0e81611725565b6020820152604083013582811115611c24575f80fd5b611c30368286016118ea565b60408301525083526020850135915080821115611c4b575f80fd5b50611c5836828601611a5f565b60208301525092915050565b5f808335601e19843603018112611c79575f80fd5b83018035915067ffffffffffffffff821115611c93575f80fd5b6020019150600581901b36038213156105e6575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235607e19833603018112611cd2575f80fd5b9190910192915050565b5f8235609e19833603018112611cd2575f80fd5b5f808335601e19843603018112611d05575f80fd5b83018035915067ffffffffffffffff821115611d1f575f80fd5b6020019150600681901b36038213156105e6575f80fd5b5f60208284031215611d46575f80fd5b813561147581611725565b5f808335601e19843603018112611d66575f80fd5b830160208101925035905067ffffffffffffffff811115611d85575f80fd5b8060051b36038213156105e6575f80fd5b5f8235605e19833603018112611daa575f80fd5b90910192915050565b5f808335601e19843603018112611dc8575f80fd5b830160208101925035905067ffffffffffffffff811115611de7575f80fd5b8036038213156105e6575f80fd5b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b5f808335601e19843603018112611e32575f80fd5b830160208101925035905067ffffffffffffffff811115611e51575f80fd5b8060061b36038213156105e6575f80fd5b8183525f60208085019450825f5b85811015611ea8578135611e8381611725565b6001600160a01b03168752818301358388015260409687019690910190600101611e70565b509495945050505050565b8183526020808401935f91600585811b8301820185855b88811015611f8c57858303601f19018a52611ee58289611d96565b60608135611ef281611725565b6001600160a01b03168552611f0982880183611d51565b82898801528083880152608092507f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811115611f43575f80fd5b871b808288850137860190506040611f5d84820185611db3565b9450838884030182890152611f758484018683611df5565b9e8a019e9750505093870193505050600101611eca565b509098975050505050505050565b5f602080835260e08301843582850152604082860135818601526060818701358187015280870135801515808214611fd0575f80fd5b8060808901525050611fe56080880188611d51565b60c060a08901529384905261010093848801600582901b89018601835f5b84811015612161578b830360ff19018452813536879003607e19018112612028575f80fd5b8601803536829003609e1901811261203e575f80fd5b608085528101803561204f81611725565b6001600160a01b03808216608088015261206b8e840184611d96565b915060a080880152813561207e81611725565b8116610120880152818e013561209381611725565b166101408701526120a6818c0182611db3565b91508a6101608801526120be61018088018383611df5565b9150506120cd8b830183611e1d565b607f19808985030160c08a01526120e5848385611e62565b93506120f38d860186611e1d565b93509150808985030160e08a01525061210d838383611e62565b9250505060808201358c8701528c8301358d8701528a8301358b8701526121368a840184611d51565b935091508581038a87015261214c818484611eb3565b968d019695505050918a019150600101612003565b505061217060a08c018c611db3565b8b8303601f190160c08d01529850965061218b818989611df5565b9b9a5050505050505050505050565b5f80604083850312156121ab575f80fd5b505080516020909101519092909150565b5f602082840312156121cc575f80fd5b815160ff81168114611475575f80fd5b634e487b7160e01b5f52601260045260245ffd5b5f815180845260208085019450602084015f5b83811015611ea857815187529582019590820190600101612203565b5f8282518085526020808601955060208260051b840101602086015f5b8481101561226a57601f198684030189526122588383516121f0565b9884019892509083019060010161223c565b5090979650505050505050565b602081526001600160a01b038251166020820152602082015160408201525f604083015160e060608401526122b06101008401826119ac565b9050606084015160808401526080840151601f19808584030160a08601526122d8838361221f565b925060a08601519150808584030160c08601526122f583836121f0565b925060c08601519150808584030160e08601525061231382826121f0565b95945050505050565b5f82601f83011261232b575f80fd5b8151602061233b611a7e83611a3c565b8083825260208201915060208460051b87010193508684111561235c575f80fd5b602086015b84811015611b9d5780518352918301918301612361565b5f8060408385031215612389575f80fd5b825167ffffffffffffffff808211156123a0575f80fd5b818501915085601f8301126123b3575f80fd5b815160206123c3611a7e83611a3c565b82815260059290921b840181019181810190898411156123e1575f80fd5b948201945b838610156123ff578551825294820194908201906123e6565b91880151919650909350505080821115612417575f80fd5b506124248582860161231c565b9150509250929050565b828152604060208201525f6114e560408301846121f0565b634e487b7160e01b5f52602160045260245ffd"; + hex"6080604052348015600e575f80fd5b5060017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f005561250a806100405f395ff3fe608060405260043610610034575f3560e01c806301ffc9a71461003d578063691f9ed714610070578063b17c83c11461008f57005b3661003b57005b005b348015610048575f80fd5b5061005c610057366004611793565b6100a2565b604051901515815260200160405180910390f35b34801561007b575f80fd5b5061003b61008a3660046117ce565b6100f3565b61003b61009d366004611870565b610200565b5f6001600160e01b0319821663691f9ed760e01b14806100d257506001600160e01b0319821663b17c83c160e01b145b806100ed57506301ffc9a760e01b6001600160e01b03198316145b92915050565b736e2d0e71d900474b262e545bc4c98b71ab368d2161011d6001600160a01b038816825f196104c2565b5f61012a838501856119eb565b90505f61013f8761013a8b61053c565b6105c0565b5090505f806101518861013a8c61053c565b9150915080610168578161016481611a31565b9250505b604051632646478b60e01b81526001600160a01b03861690632646478b9061019e908e9087908f90889030908c90600401611a77565b6020604051808303815f875af11580156101ba573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906101de9190611ac2565b506101f36001600160a01b038c16865f6104c2565b5050505050505050505050565b6102086105ed565b61021761021482611c45565b50565b6102246080830183611d01565b90505f0361024557604051639c95219f60e01b815260040160405180910390fd5b6001600160a01b03831673d31af42aafee144967be4b5688ecf09592258d7b146102925760405163516e822d60e01b81526001600160a01b03841660048201526024015b60405180910390fd5b5f6102a06080840184611d01565b5f8181106102b0576102b0611d47565b90506020028101906102c29190611d5b565b6102cc9080611d79565b6102da906040810190611d8d565b6102e76080860186611d01565b5f8181106102f7576102f7611d47565b90506020028101906103099190611d5b565b6020013581811061031c5761031c611d47565b6103329260206040909202019081019150611dd3565b90505f6103426080850185611d01565b5f81811061035257610352611d47565b90506020028101906103649190611d5b565b61036e9080611d79565b61037c906060810190611d8d565b6103896080870187611d01565b5f81811061039957610399611d47565b90506020028101906103ab9190611d5b565b604001358181106103be576103be611d47565b6103d49260206040909202019081019150611dd3565b90506103eb6001600160a01b038316865f196104c2565b6040516334e3942b60e11b81526001600160a01b038616906369c7285690610417908790600401612037565b60408051808303815f875af1158015610432573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104569190612237565b5061046d90506001600160a01b038316865f6104c2565b61049261047984611c45565b836104838561053c565b8461048d8661053c565b61061b565b50506104bd60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b505050565b6104ce8383835f61086c565b6104bd576104df83835f600161086c565b61050757604051635274afe760e01b81526001600160a01b0384166004820152602401610289565b610514838383600161086c565b6104bd57604051635274afe760e01b81526001600160a01b0384166004820152602401610289565b5f6105456108ce565b6040516354636d2b60e01b81526001600160a01b038316600482015273200e12d10bb0c5e4a17e7018f0f1161919bb9389906354636d2b906024016020604051808303815f875af115801561059c573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906100ed9190612259565b5f806001600160e01b038416601b0b60e085901d6105df82828761095b565b9350935050505b9250929050565b6105f5610acd565b60027f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b604080516003808252608082019092525f9160208201606080368337019050506040516370a0823160e01b81523060048201529091505f906001600160a01b038716906370a0823190602401602060405180830381865afa158015610682573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106a69190611ac2565b905080156106c2576106c26001600160a01b0387163383610b0f565b5f6106cd8287610b1c565b50905080835f815181106106e3576106e3611d47565b602090810291909101015250506040516370a0823160e01b81523060048201525f906001600160a01b038516906370a0823190602401602060405180830381865afa158015610734573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107589190611ac2565b90508015610774576107746001600160a01b0385163383610b0f565b5f61077f8285610b1c565b509050808360018151811061079657610796611d47565b60209081029190910101525047905080156107b5576107b53382610b5c565b5f6107c1826012610b1c565b50905080836002815181106107d8576107d8611d47565b602090810291909101015250506040805160018082528183019092525f91816020015b6040805160a0810182525f91810182815260608083019390935260808201839052815260208101919091528152602001906001900390816107fb57905050905086815f8151811061084e5761084e611d47565b60200260200101819052506108638282610bd3565b50505050505050565b60405163095ea7b360e01b5f8181526001600160a01b038616600452602485905291602083604481808b5af1925060015f511483166108c25783831516156108b6573d5f823e3d81fd5b5f873b113d1516831692505b60405250949350505050565b73200e12d10bb0c5e4a17e7018f0f1161919bb93893b1580610925575073200e12d10bb0c5e4a17e7018f0f1161919bb93893f7f1de7d717526cba131d684e312dedbf0852adef9cced9e36798ae4937f7145d4114155b15610959576040516373e6d7b360e01b815273200e12d10bb0c5e4a17e7018f0f1161919bb93896004820152602401610289565b565b5f805f85121561098857604051634a7d166b60e01b81526004810186905260248101859052604401610289565b845f0361099a57505f90506001610ac5565b8460ff84168501858112156109d55760405163c849483b60e01b8152600481018890526024810187905260ff86166044820152606401610289565b5f805f831215610a2157604c198312156109f8575f809550955050505050610ac5565b825f03600a0a9150818481610a0f57610a0f612279565b0495505084029091149150610ac59050565b5f831315610aba57604d831315610a5e5760405163c849483b60e01b8152600481018a90526024810189905260ff88166044820152606401610289565b82600a0a9150815f1981610a7457610a74612279565b04841115610aa85760405163c849483b60e01b8152600481018a90526024810189905260ff88166044820152606401610289565b5091909102925060019150610ac59050565b509193506001925050505b935093915050565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f005460020361095957604051633ee5aeb560e01b815260040160405180910390fd5b6105148383836001610be8565b5f805f805f610b2b8787610c32565b9250925092505f80610b3d8585610c8e565b9150915081838015610b4c5750815b9650965050505050509250929050565b80471015610b865760405163cf47918160e01b815247600482015260248101829052604401610289565b610b9f828260405180602001604052805f815250610ed7565b15610ba8575050565b3d15610bba57610bb6610eec565b5050565b60405163d6bda27560e01b815260040160405180910390fd5b610bb6610be1600784610ef7565b825f610f59565b60405163a9059cbb60e01b5f8181526001600160a01b038616600452602485905291602083604481808b5af1925060015f511483166108c25783831516156108b6573d5f823e3d81fd5b5f808060ff841681037f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff861115610c7d57600a860460018201600a88065f1493509350935050610c87565b8593509150600190505b9250925092565b5f808383601b82900b821480610dc4577d90e40fbeea1d3a4abc8955e946fe31cdcf66f634e1000000000000000000870515610d0f577f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee8000000000000000000870515610d00576305f5e10087059650600886019550610d0f565b620186a0870596506005860195505b8687601b0b14610d2a57600a87059650856001019550610d0f565b7b0ccccccccccccccccccccccccccccccccccccccccccccccccccccccc7b1999999999999999999999999999999999999999999999999999999888820111610dbe575f600188039050808160030b03610dbc5760e01b6001600160e01b037b7fffffffffffffffffffffffffffffffffffffffffffffffffffffff60ff8b901d18161795505f94506105e69350505050565b505b50610ddb565b865f03610ddb57505f9350600192506105e6915050565b858660030b14610e92575f821315610e3a57610df7838361120d565b15610e1f5760405163d556b11160e01b81526004810184905260248101839052604401610289565b637ffffffe19909501600a0a82029550637fffffff94610e92565b637fffffff198690036043811315610e5c57505f94508493506105e692505050565b80600a0a8881610e6e57610e6e612279565b059750875f03610e8857505f94508493506105e692505050565b50637fffffff1995505b818613610ea25760019350610ebb565b818603600a0a8381610eb657610eb6612279565b071593505b5050506001600160e01b03841660e084901b1791509250929050565b5f805f83516020850186885af1949350505050565b6040513d5f823e3d81fd5b60408051600780825261010082019092526060915f9190816020015b6060815260200190600190039081610f135790505090508281610f3760018761228d565b81518110610f4757610f47611d47565b60209081029190910101529392505050565b60408051600780825261010082019092525f91816020015b6060815260200190600190039081610f715790505090505f5b8451811015610fd257848181518110610fa557610fa5611d47565b6020026020010151828281518110610fbf57610fbf611d47565b6020908102919091010152600101610f8a565b50335f8181523060209081526040808320815160a0810183528083018581526060808301879052608083018190529082528185015282518581529384018581528484019093529093909291905b88518110156112015788818151811061103a5761103a611d47565b602002602001015193505f845f0151604001515111156111f9575f61106388866020015161122f565b9050886110d6576110b8815f8151811061107f5761107f611d47565b60200260200101515f8151811061109857611098611d47565b602002602001015160408051600181526020810192909252818101905290565b815f815181106110ca576110ca611d47565b60200260200101819052505b8451516040805160e08101825287516020908101516001600160a01b0390811683529082018a90528851830151828401525f606083018190526080830186905260a0830189905260c08301889052925163d04dfe2360e01b81529293169163d04dfe239161114691600401612327565b5f60405180830381865afa158015611160573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526111879190810190612428565b9150505f815111156111f65785516020015160405163012c676d60e21b81526001600160a01b03909116906304b19db4906111c8908b9085906004016124de565b5f604051808303815f87803b1580156111df575f80fd5b505af11580156111f1573d5f803e3d5ffd5b505050505b50505b60010161101f565b50505050505050505050565b5f6112285f841261121e5783611222565b835f035b83611511565b9392505050565b60605f825167ffffffffffffffff81111561124c5761124c6118ee565b604051908082528060200260200182016040528015611275578160200160208202803683370190505b5090505f80845111611287575f61128d565b83516001015b85516001010190505f8167ffffffffffffffff8111156112af576112af6118ee565b6040519080825280602002602001820160405280156112e257816020015b60608152602001906001900390816112cd5790505b5090505f611306604080516002815233602082015230818301526060810190915290565b82828151811061131857611318611d47565b60200260200101819052505f5b875181101561137557818060010192505087818151811061134857611348611d47565b602002602001015183838151811061136257611362611d47565b6020908102919091010152600101611325565b508551156115075780806001019150508382828151811061139857611398611d47565b60200260200101819052505f5b8651811015611505576114548782815181106113c3576113c3611d47565b60200260200101515f01516114316113ff8a85815181106113e6576113e6611d47565b6020026020010151602001518051602090810291012090565b7f19457468657265756d205369676e6564204d6573736167653a0a3332000000005f908152601c91909152603c902090565b89848151811061144357611443611d47565b6020026020010151604001516115af565b61147457604051630a57f30960e31b815260048101829052602401610289565b86818151811061148657611486611d47565b60200260200101515f01516001600160a01b03165f1b8582815181106114ae576114ae611d47565b60200260200101818152505081806001019250508681815181106114d4576114d4611d47565b6020026020010151602001518383815181106114f2576114f2611d47565b60209081029190910101526001016113a5565b505b5095945050505050565b5f637ffffff5821361152457505f6100ed565b637ffffffe198201604381131561153f5750508115156100ed565b5f811261157f5780600a0a7b800000000000000000000000000000000000000000000000000000018161157457611574612279565b0484119150506100ed565b805f03600a0a7b800000000000000000000000000000000000000000000000000000020284101591505092915050565b5f836001600160a01b03163b5f0361160d575f806115cd8585611620565b5090925090505f8160038111156115e6576115e66124f6565b1480156116045750856001600160a01b0316826001600160a01b0316145b92505050611228565b611618848484611666565b949350505050565b5f805f8351604103611657576020840151604085015160608601515f1a611649888285856116cb565b955095509550505050610c87565b505081515f9150600290610c87565b805160408051630b135d3f60e11b8082526004820186905260248201929092525f92906020820185604483015e5f82606483010152601f820160051c60051b915060205f60648401838a5afa9050825f5114601f3d1116811693505050509392505050565b5f80807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a084111561170457505f91506003905082611789565b604080515f808252602082018084528a905260ff891692820192909252606081018790526080810186905260019060a0016020604051602081039080840390855afa158015611755573d5f803e3d5ffd5b5050604051601f1901519150506001600160a01b03811661178057505f925060019150829050611789565b92505f91508190505b9450945094915050565b5f602082840312156117a3575f80fd5b81356001600160e01b031981168114611228575f80fd5b6001600160a01b0381168114610214575f80fd5b5f805f805f8060a087890312156117e3575f80fd5b86356117ee816117ba565b955060208701356117fe816117ba565b94506040870135935060608701359250608087013567ffffffffffffffff80821115611828575f80fd5b818901915089601f83011261183b575f80fd5b813581811115611849575f80fd5b8a602082850101111561185a575f80fd5b6020830194508093505050509295509295509295565b5f805f60608486031215611882575f80fd5b833561188d816117ba565b9250602084013567ffffffffffffffff808211156118a9575f80fd5b9085019060c082880312156118bc575f80fd5b909250604085013590808211156118d1575f80fd5b508401604081870312156118e3575f80fd5b809150509250925092565b634e487b7160e01b5f52604160045260245ffd5b6040516060810167ffffffffffffffff81118282101715611925576119256118ee565b60405290565b6040805190810167ffffffffffffffff81118282101715611925576119256118ee565b604051601f8201601f1916810167ffffffffffffffff81118282101715611977576119776118ee565b604052919050565b5f82601f83011261198e575f80fd5b813567ffffffffffffffff8111156119a8576119a86118ee565b6119bb601f8201601f191660200161194e565b8181528460208386010111156119cf575f80fd5b816020850160208301375f918101602001919091529392505050565b5f602082840312156119fb575f80fd5b813567ffffffffffffffff811115611a11575f80fd5b6116188482850161197f565b634e487b7160e01b5f52601160045260245ffd5b5f60018201611a4257611a42611a1d565b5060010190565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b5f6001600160a01b038089168352876020840152808716604084015285606084015280851660808401525060c060a0830152611ab660c0830184611a49565b98975050505050505050565b5f60208284031215611ad2575f80fd5b5051919050565b5f67ffffffffffffffff821115611af257611af26118ee565b5060051b60200190565b5f82601f830112611b0b575f80fd5b81356020611b20611b1b83611ad9565b61194e565b82815260059290921b84018101918181019086841115611b3e575f80fd5b8286015b84811015611c3a57803567ffffffffffffffff80821115611b61575f80fd5b908801906060828b03601f19011215611b78575f80fd5b611b80611902565b86830135611b8d816117ba565b815260408381013583811115611ba1575f80fd5b8401603f81018d13611bb1575f80fd5b88810135611bc1611b1b82611ad9565b81815260059190911b82018301908a8101908f831115611bdf575f80fd5b928401925b82841015611bfd5783358252928b0192908b0190611be4565b858c0152505050606084013583811115611c15575f80fd5b611c238d8a8388010161197f565b918301919091525085525050918301918301611b42565b509695505050505050565b5f60408236031215611c55575f80fd5b611c5d61192b565b823567ffffffffffffffff80821115611c74575f80fd5b818501915060608236031215611c88575f80fd5b611c90611902565b8235611c9b816117ba565b81526020830135611cab816117ba565b6020820152604083013582811115611cc1575f80fd5b611ccd3682860161197f565b60408301525083526020850135915080821115611ce8575f80fd5b50611cf536828601611afc565b60208301525092915050565b5f808335601e19843603018112611d16575f80fd5b83018035915067ffffffffffffffff821115611d30575f80fd5b6020019150600581901b36038213156105e6575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235607e19833603018112611d6f575f80fd5b9190910192915050565b5f8235609e19833603018112611d6f575f80fd5b5f808335601e19843603018112611da2575f80fd5b83018035915067ffffffffffffffff821115611dbc575f80fd5b6020019150600681901b36038213156105e6575f80fd5b5f60208284031215611de3575f80fd5b8135611228816117ba565b5f808335601e19843603018112611e03575f80fd5b830160208101925035905067ffffffffffffffff811115611e22575f80fd5b8060051b36038213156105e6575f80fd5b5f8235605e19833603018112611e47575f80fd5b90910192915050565b5f808335601e19843603018112611e65575f80fd5b830160208101925035905067ffffffffffffffff811115611e84575f80fd5b8036038213156105e6575f80fd5b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b5f808335601e19843603018112611ecf575f80fd5b830160208101925035905067ffffffffffffffff811115611eee575f80fd5b8060061b36038213156105e6575f80fd5b8183525f60208085019450825f5b85811015611f45578135611f20816117ba565b6001600160a01b03168752818301358388015260409687019690910190600101611f0d565b509495945050505050565b8183526020808401935f91600585811b8301820185855b8881101561202957858303601f19018a52611f828289611e33565b60608135611f8f816117ba565b6001600160a01b03168552611fa682880183611dee565b82898801528083880152608092507f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811115611fe0575f80fd5b871b808288850137860190506040611ffa84820185611e50565b94508388840301828901526120128484018683611e92565b9e8a019e9750505093870193505050600101611f67565b509098975050505050505050565b5f602080835260e0830184358285015260408286013581860152606081870135818701528087013580151580821461206d575f80fd5b80608089015250506120826080880188611dee565b60c060a08901529384905261010093848801600582901b89018601835f5b848110156121fe578b830360ff19018452813536879003607e190181126120c5575f80fd5b8601803536829003609e190181126120db575f80fd5b60808552810180356120ec816117ba565b6001600160a01b0380821660808801526121088e840184611e33565b915060a080880152813561211b816117ba565b8116610120880152818e0135612130816117ba565b16610140870152612143818c0182611e50565b91508a61016088015261215b61018088018383611e92565b91505061216a8b830183611eba565b607f19808985030160c08a0152612182848385611eff565b93506121908d860186611eba565b93509150808985030160e08a0152506121aa838383611eff565b9250505060808201358c8701528c8301358d8701528a8301358b8701526121d38a840184611dee565b935091508581038a8701526121e9818484611f50565b968d019695505050918a0191506001016120a0565b505061220d60a08c018c611e50565b8b8303601f190160c08d015298509650612228818989611e92565b9b9a5050505050505050505050565b5f8060408385031215612248575f80fd5b505080516020909101519092909150565b5f60208284031215612269575f80fd5b815160ff81168114611228575f80fd5b634e487b7160e01b5f52601260045260245ffd5b818103818111156100ed576100ed611a1d565b5f815180845260208085019450602084015f5b83811015611f45578151875295820195908201906001016122b3565b5f8282518085526020808601955060208260051b840101602086015f5b8481101561231a57601f198684030189526123088383516122a0565b988401989250908301906001016122ec565b5090979650505050505050565b602081526001600160a01b038251166020820152602082015160408201525f604083015160e06060840152612360610100840182611a49565b9050606084015160808401526080840151601f19808584030160a086015261238883836122cf565b925060a08601519150808584030160c08601526123a583836122a0565b925060c08601519150808584030160e0860152506123c382826122a0565b95945050505050565b5f82601f8301126123db575f80fd5b815160206123eb611b1b83611ad9565b8083825260208201915060208460051b87010193508684111561240c575f80fd5b602086015b84811015611c3a5780518352918301918301612411565b5f8060408385031215612439575f80fd5b825167ffffffffffffffff80821115612450575f80fd5b818501915085601f830112612463575f80fd5b81516020612473611b1b83611ad9565b82815260059290921b84018101918181019089841115612491575f80fd5b948201945b838610156124af57855182529482019490820190612496565b918801519196509093505050808211156124c7575f80fd5b506124d4858286016123cc565b9150509250929050565b828152604060208201525f61161860408301846122a0565b634e487b7160e01b5f52602160045260245ffd"; /// @dev The runtime bytecode of the contract. bytes constant RUNTIME_CODE = - hex"608060405260043610610034575f3560e01c806301ffc9a71461003d578063691f9ed714610070578063b17c83c11461008f57005b3661003b57005b005b348015610048575f80fd5b5061005c6100573660046116fe565b6100a2565b604051901515815260200160405180910390f35b34801561007b575f80fd5b5061003b61008a366004611739565b6100f3565b61003b61009d3660046117db565b610200565b5f6001600160e01b0319821663691f9ed760e01b14806100d257506001600160e01b0319821663b17c83c160e01b145b806100ed57506301ffc9a760e01b6001600160e01b03198316145b92915050565b736e2d0e71d900474b262e545bc4c98b71ab368d2161011d6001600160a01b038816825f196104c2565b5f61012a83850185611956565b90505f61013f8761013a8b61053c565b6105c0565b5090505f806101518861013a8c61053c565b9150915080610168578161016481611988565b9250505b604051632646478b60e01b81526001600160a01b03861690632646478b9061019e908e9087908f90889030908c906004016119da565b6020604051808303815f875af11580156101ba573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906101de9190611a25565b506101f36001600160a01b038c16865f6104c2565b5050505050505050505050565b6102086105ed565b61021761021482611ba8565b50565b6102246080830183611c64565b90505f0361024557604051639c95219f60e01b815260040160405180910390fd5b6001600160a01b03831673834e1da0d2e04ab48f9efa6a7b9bbdb6ff62839e146102925760405163516e822d60e01b81526001600160a01b03841660048201526024015b60405180910390fd5b5f6102a06080840184611c64565b5f8181106102b0576102b0611caa565b90506020028101906102c29190611cbe565b6102cc9080611cdc565b6102da906040810190611cf0565b6102e76080860186611c64565b5f8181106102f7576102f7611caa565b90506020028101906103099190611cbe565b6020013581811061031c5761031c611caa565b6103329260206040909202019081019150611d36565b90505f6103426080850185611c64565b5f81811061035257610352611caa565b90506020028101906103649190611cbe565b61036e9080611cdc565b61037c906060810190611cf0565b6103896080870187611c64565b5f81811061039957610399611caa565b90506020028101906103ab9190611cbe565b604001358181106103be576103be611caa565b6103d49260206040909202019081019150611d36565b90506103eb6001600160a01b038316865f196104c2565b6040516334e3942b60e11b81526001600160a01b038616906369c7285690610417908790600401611f9a565b60408051808303815f875af1158015610432573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610456919061219a565b5061046d90506001600160a01b038316865f6104c2565b61049261047984611ba8565b836104838561053c565b8461048d8661053c565b61061b565b50506104bd60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b505050565b6104ce8383835f6108ba565b6104bd576104df83835f60016108ba565b61050757604051635274afe760e01b81526001600160a01b0384166004820152602401610289565b61051483838360016108ba565b6104bd57604051635274afe760e01b81526001600160a01b0384166004820152602401610289565b5f61054561091c565b6040516354636d2b60e01b81526001600160a01b038316600482015273200e12d10bb0c5e4a17e7018f0f1161919bb9389906354636d2b906024016020604051808303815f875af115801561059c573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906100ed91906121bc565b5f806001600160e01b038416601b0b60e085901d6105df8282876109a9565b9350935050505b9250929050565b6105f5610b1b565b60027f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b6040805160018082528183019092525f91816020015b6060815260200190600190039081610631575050604080516003808252608082019092529192505f919060208201606080368337019050506040516370a0823160e01b81523060048201529091505f906001600160a01b038816906370a0823190602401602060405180830381865afa1580156106b0573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106d49190611a25565b905080156106f0576106f06001600160a01b0388163383610b5d565b5f6106fb8288610b6a565b50905080835f8151811061071157610711611caa565b602090810291909101015250506040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa158015610762573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107869190611a25565b905080156107a2576107a26001600160a01b0386163383610b5d565b5f6107ad8286610b6a565b50905080836001815181106107c4576107c4611caa565b60209081029190910101525047905080156107e3576107e33382610baa565b5f6107ef826012610b6a565b509050808360028151811061080657610806611caa565b602002602001018181525050505080825f8151811061082757610827611caa565b60209081029190910101526040805160018082528183019092525f91816020015b6040805160a0810182525f918101828152606080830193909352608082018390528152602081019190915281526020019060019003908161084857905050905087815f8151811061089b5761089b611caa565b60200260200101819052506108b08382610c21565b5050505050505050565b60405163095ea7b360e01b5f8181526001600160a01b038616600452602485905291602083604481808b5af1925060015f51148316610910578383151615610904573d5f823e3d81fd5b5f873b113d1516831692505b60405250949350505050565b73200e12d10bb0c5e4a17e7018f0f1161919bb93893b1580610973575073200e12d10bb0c5e4a17e7018f0f1161919bb93893f7f1de7d717526cba131d684e312dedbf0852adef9cced9e36798ae4937f7145d4114155b156109a7576040516373e6d7b360e01b815273200e12d10bb0c5e4a17e7018f0f1161919bb93896004820152602401610289565b565b5f805f8512156109d657604051634a7d166b60e01b81526004810186905260248101859052604401610289565b845f036109e857505f90506001610b13565b8460ff8416850185811215610a235760405163c849483b60e01b8152600481018890526024810187905260ff86166044820152606401610289565b5f805f831215610a6f57604c19831215610a46575f809550955050505050610b13565b825f03600a0a9150818481610a5d57610a5d6121dc565b0495505084029091149150610b139050565b5f831315610b0857604d831315610aac5760405163c849483b60e01b8152600481018a90526024810189905260ff88166044820152606401610289565b82600a0a9150815f1981610ac257610ac26121dc565b04841115610af65760405163c849483b60e01b8152600481018a90526024810189905260ff88166044820152606401610289565b5091909102925060019150610b139050565b509193506001925050505b935093915050565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00546002036109a757604051633ee5aeb560e01b815260040160405180910390fd5b6105148383836001610e69565b5f805f805f610b798787610eb3565b9250925092505f80610b8b8585610f0f565b9150915081838015610b9a5750815b9650965050505050509250929050565b80471015610bd45760405163cf47918160e01b815247600482015260248101829052604401610289565b610bed828260405180602001604052805f815250611158565b15610bf6575050565b3d15610c0857610c0461116d565b5050565b60405163d6bda27560e01b815260040160405180910390fd5b60408051600480825260a082019092525f91816020015b6060815260200190600190039081610c385790505090505f5b8351811015610c9957838181518110610c6c57610c6c611caa565b6020026020010151828281518110610c8657610c86611caa565b6020908102919091010152600101610c51565b50335f8181523060209081526040808320815160a0810183528083018581526060808301879052608083018190529082528185015282518581529384018581528484019093529093909291905b8751811015610e5e57878181518110610d0157610d01611caa565b602002602001015193505f845f015160400151511115610e56575f845f01515f01516001600160a01b031663d04dfe236040518060e00160405280885f0151602001516001600160a01b03168152602001898152602001885f01516040015181526020015f8152602001610d798c8a60200151611178565b8152602001878152602001868152506040518263ffffffff1660e01b8152600401610da49190612277565b5f60405180830381865afa158015610dbe573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610de59190810190612378565b9150505f81511115610e545784516020015160405163012c676d60e21b81526001600160a01b03909116906304b19db490610e26908a90859060040161242e565b5f604051808303815f87803b158015610e3d575f80fd5b505af1158015610e4f573d5f803e3d5ffd5b505050505b505b600101610ce6565b505050505050505050565b60405163a9059cbb60e01b5f8181526001600160a01b038616600452602485905291602083604481808b5af1925060015f51148316610910578383151615610904573d5f823e3d81fd5b5f808060ff841681037f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff861115610efe57600a860460018201600a88065f1493509350935050610f08565b8593509150600190505b9250925092565b5f808383601b82900b821480611045577d90e40fbeea1d3a4abc8955e946fe31cdcf66f634e1000000000000000000870515610f90577f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee8000000000000000000870515610f81576305f5e10087059650600886019550610f90565b620186a0870596506005860195505b8687601b0b14610fab57600a87059650856001019550610f90565b7b0ccccccccccccccccccccccccccccccccccccccccccccccccccccccc7b199999999999999999999999999999999999999999999999999999988882011161103f575f600188039050808160030b0361103d5760e01b6001600160e01b037b7fffffffffffffffffffffffffffffffffffffffffffffffffffffff60ff8b901d18161795505f94506105e69350505050565b505b5061105c565b865f0361105c57505f9350600192506105e6915050565b858660030b14611113575f8213156110bb57611078838361145a565b156110a05760405163d556b11160e01b81526004810184905260248101839052604401610289565b637ffffffe19909501600a0a82029550637fffffff94611113565b637fffffff1986900360438113156110dd57505f94508493506105e692505050565b80600a0a88816110ef576110ef6121dc565b059750875f0361110957505f94508493506105e692505050565b50637fffffff1995505b818613611123576001935061113c565b818603600a0a8381611137576111376121dc565b071593505b5050506001600160e01b03841660e084901b1791509250929050565b5f805f83516020850186885af1949350505050565b6040513d5f823e3d81fd5b60605f825167ffffffffffffffff81111561119557611195611859565b6040519080825280602002602001820160405280156111be578160200160208202803683370190505b5090505f808451116111d0575f6111d6565b83516001015b85516001010190505f8167ffffffffffffffff8111156111f8576111f8611859565b60405190808252806020026020018201604052801561122b57816020015b60608152602001906001900390816112165790505b5090505f61124f604080516002815233602082015230818301526060810190915290565b82828151811061126157611261611caa565b60200260200101819052505f5b87518110156112be57818060010192505087818151811061129157611291611caa565b60200260200101518383815181106112ab576112ab611caa565b602090810291909101015260010161126e565b50855115611450578080600101915050838282815181106112e1576112e1611caa565b60200260200101819052505f5b865181101561144e5761139d87828151811061130c5761130c611caa565b60200260200101515f015161137a6113488a858151811061132f5761132f611caa565b6020026020010151602001518051602090810291012090565b7f19457468657265756d205369676e6564204d6573736167653a0a3332000000005f908152601c91909152603c902090565b89848151811061138c5761138c611caa565b60200260200101516040015161147c565b6113bd57604051630a57f30960e31b815260048101829052602401610289565b8681815181106113cf576113cf611caa565b60200260200101515f01516001600160a01b03165f1b8582815181106113f7576113f7611caa565b602002602001018181525050818060010192505086818151811061141d5761141d611caa565b60200260200101516020015183838151811061143b5761143b611caa565b60209081029190910101526001016112ee565b505b5095945050505050565b5f6114755f841261146b578361146f565b835f035b836114ed565b9392505050565b5f836001600160a01b03163b5f036114da575f8061149a858561158b565b5090925090505f8160038111156114b3576114b3612446565b1480156114d15750856001600160a01b0316826001600160a01b0316145b92505050611475565b6114e58484846115d1565b949350505050565b5f637ffffff5821361150057505f6100ed565b637ffffffe198201604381131561151b5750508115156100ed565b5f811261155b5780600a0a7b8000000000000000000000000000000000000000000000000000000181611550576115506121dc565b0484119150506100ed565b805f03600a0a7b800000000000000000000000000000000000000000000000000000020284101591505092915050565b5f805f83516041036115c2576020840151604085015160608601515f1a6115b488828585611636565b955095509550505050610f08565b505081515f9150600290610f08565b805160408051630b135d3f60e11b8082526004820186905260248201929092525f92906020820185604483015e5f82606483010152601f820160051c60051b915060205f60648401838a5afa9050825f5114601f3d1116811693505050509392505050565b5f80807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a084111561166f57505f915060039050826116f4565b604080515f808252602082018084528a905260ff891692820192909252606081018790526080810186905260019060a0016020604051602081039080840390855afa1580156116c0573d5f803e3d5ffd5b5050604051601f1901519150506001600160a01b0381166116eb57505f9250600191508290506116f4565b92505f91508190505b9450945094915050565b5f6020828403121561170e575f80fd5b81356001600160e01b031981168114611475575f80fd5b6001600160a01b0381168114610214575f80fd5b5f805f805f8060a0878903121561174e575f80fd5b863561175981611725565b9550602087013561176981611725565b94506040870135935060608701359250608087013567ffffffffffffffff80821115611793575f80fd5b818901915089601f8301126117a6575f80fd5b8135818111156117b4575f80fd5b8a60208285010111156117c5575f80fd5b6020830194508093505050509295509295509295565b5f805f606084860312156117ed575f80fd5b83356117f881611725565b9250602084013567ffffffffffffffff80821115611814575f80fd5b9085019060c08288031215611827575f80fd5b9092506040850135908082111561183c575f80fd5b5084016040818703121561184e575f80fd5b809150509250925092565b634e487b7160e01b5f52604160045260245ffd5b6040516060810167ffffffffffffffff8111828210171561189057611890611859565b60405290565b6040805190810167ffffffffffffffff8111828210171561189057611890611859565b604051601f8201601f1916810167ffffffffffffffff811182821017156118e2576118e2611859565b604052919050565b5f82601f8301126118f9575f80fd5b813567ffffffffffffffff81111561191357611913611859565b611926601f8201601f19166020016118b9565b81815284602083860101111561193a575f80fd5b816020850160208301375f918101602001919091529392505050565b5f60208284031215611966575f80fd5b813567ffffffffffffffff81111561197c575f80fd5b6114e5848285016118ea565b5f600182016119a557634e487b7160e01b5f52601160045260245ffd5b5060010190565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b5f6001600160a01b038089168352876020840152808716604084015285606084015280851660808401525060c060a0830152611a1960c08301846119ac565b98975050505050505050565b5f60208284031215611a35575f80fd5b5051919050565b5f67ffffffffffffffff821115611a5557611a55611859565b5060051b60200190565b5f82601f830112611a6e575f80fd5b81356020611a83611a7e83611a3c565b6118b9565b82815260059290921b84018101918181019086841115611aa1575f80fd5b8286015b84811015611b9d57803567ffffffffffffffff80821115611ac4575f80fd5b908801906060828b03601f19011215611adb575f80fd5b611ae361186d565b86830135611af081611725565b815260408381013583811115611b04575f80fd5b8401603f81018d13611b14575f80fd5b88810135611b24611a7e82611a3c565b81815260059190911b82018301908a8101908f831115611b42575f80fd5b928401925b82841015611b605783358252928b0192908b0190611b47565b858c0152505050606084013583811115611b78575f80fd5b611b868d8a838801016118ea565b918301919091525085525050918301918301611aa5565b509695505050505050565b5f60408236031215611bb8575f80fd5b611bc0611896565b823567ffffffffffffffff80821115611bd7575f80fd5b818501915060608236031215611beb575f80fd5b611bf361186d565b8235611bfe81611725565b81526020830135611c0e81611725565b6020820152604083013582811115611c24575f80fd5b611c30368286016118ea565b60408301525083526020850135915080821115611c4b575f80fd5b50611c5836828601611a5f565b60208301525092915050565b5f808335601e19843603018112611c79575f80fd5b83018035915067ffffffffffffffff821115611c93575f80fd5b6020019150600581901b36038213156105e6575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235607e19833603018112611cd2575f80fd5b9190910192915050565b5f8235609e19833603018112611cd2575f80fd5b5f808335601e19843603018112611d05575f80fd5b83018035915067ffffffffffffffff821115611d1f575f80fd5b6020019150600681901b36038213156105e6575f80fd5b5f60208284031215611d46575f80fd5b813561147581611725565b5f808335601e19843603018112611d66575f80fd5b830160208101925035905067ffffffffffffffff811115611d85575f80fd5b8060051b36038213156105e6575f80fd5b5f8235605e19833603018112611daa575f80fd5b90910192915050565b5f808335601e19843603018112611dc8575f80fd5b830160208101925035905067ffffffffffffffff811115611de7575f80fd5b8036038213156105e6575f80fd5b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b5f808335601e19843603018112611e32575f80fd5b830160208101925035905067ffffffffffffffff811115611e51575f80fd5b8060061b36038213156105e6575f80fd5b8183525f60208085019450825f5b85811015611ea8578135611e8381611725565b6001600160a01b03168752818301358388015260409687019690910190600101611e70565b509495945050505050565b8183526020808401935f91600585811b8301820185855b88811015611f8c57858303601f19018a52611ee58289611d96565b60608135611ef281611725565b6001600160a01b03168552611f0982880183611d51565b82898801528083880152608092507f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811115611f43575f80fd5b871b808288850137860190506040611f5d84820185611db3565b9450838884030182890152611f758484018683611df5565b9e8a019e9750505093870193505050600101611eca565b509098975050505050505050565b5f602080835260e08301843582850152604082860135818601526060818701358187015280870135801515808214611fd0575f80fd5b8060808901525050611fe56080880188611d51565b60c060a08901529384905261010093848801600582901b89018601835f5b84811015612161578b830360ff19018452813536879003607e19018112612028575f80fd5b8601803536829003609e1901811261203e575f80fd5b608085528101803561204f81611725565b6001600160a01b03808216608088015261206b8e840184611d96565b915060a080880152813561207e81611725565b8116610120880152818e013561209381611725565b166101408701526120a6818c0182611db3565b91508a6101608801526120be61018088018383611df5565b9150506120cd8b830183611e1d565b607f19808985030160c08a01526120e5848385611e62565b93506120f38d860186611e1d565b93509150808985030160e08a01525061210d838383611e62565b9250505060808201358c8701528c8301358d8701528a8301358b8701526121368a840184611d51565b935091508581038a87015261214c818484611eb3565b968d019695505050918a019150600101612003565b505061217060a08c018c611db3565b8b8303601f190160c08d01529850965061218b818989611df5565b9b9a5050505050505050505050565b5f80604083850312156121ab575f80fd5b505080516020909101519092909150565b5f602082840312156121cc575f80fd5b815160ff81168114611475575f80fd5b634e487b7160e01b5f52601260045260245ffd5b5f815180845260208085019450602084015f5b83811015611ea857815187529582019590820190600101612203565b5f8282518085526020808601955060208260051b840101602086015f5b8481101561226a57601f198684030189526122588383516121f0565b9884019892509083019060010161223c565b5090979650505050505050565b602081526001600160a01b038251166020820152602082015160408201525f604083015160e060608401526122b06101008401826119ac565b9050606084015160808401526080840151601f19808584030160a08601526122d8838361221f565b925060a08601519150808584030160c08601526122f583836121f0565b925060c08601519150808584030160e08601525061231382826121f0565b95945050505050565b5f82601f83011261232b575f80fd5b8151602061233b611a7e83611a3c565b8083825260208201915060208460051b87010193508684111561235c575f80fd5b602086015b84811015611b9d5780518352918301918301612361565b5f8060408385031215612389575f80fd5b825167ffffffffffffffff808211156123a0575f80fd5b818501915085601f8301126123b3575f80fd5b815160206123c3611a7e83611a3c565b82815260059290921b840181019181810190898411156123e1575f80fd5b948201945b838610156123ff578551825294820194908201906123e6565b91880151919650909350505080821115612417575f80fd5b506124248582860161231c565b9150509250929050565b828152604060208201525f6114e560408301846121f0565b634e487b7160e01b5f52602160045260245ffd"; + hex"608060405260043610610034575f3560e01c806301ffc9a71461003d578063691f9ed714610070578063b17c83c11461008f57005b3661003b57005b005b348015610048575f80fd5b5061005c610057366004611793565b6100a2565b604051901515815260200160405180910390f35b34801561007b575f80fd5b5061003b61008a3660046117ce565b6100f3565b61003b61009d366004611870565b610200565b5f6001600160e01b0319821663691f9ed760e01b14806100d257506001600160e01b0319821663b17c83c160e01b145b806100ed57506301ffc9a760e01b6001600160e01b03198316145b92915050565b736e2d0e71d900474b262e545bc4c98b71ab368d2161011d6001600160a01b038816825f196104c2565b5f61012a838501856119eb565b90505f61013f8761013a8b61053c565b6105c0565b5090505f806101518861013a8c61053c565b9150915080610168578161016481611a31565b9250505b604051632646478b60e01b81526001600160a01b03861690632646478b9061019e908e9087908f90889030908c90600401611a77565b6020604051808303815f875af11580156101ba573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906101de9190611ac2565b506101f36001600160a01b038c16865f6104c2565b5050505050505050505050565b6102086105ed565b61021761021482611c45565b50565b6102246080830183611d01565b90505f0361024557604051639c95219f60e01b815260040160405180910390fd5b6001600160a01b03831673d31af42aafee144967be4b5688ecf09592258d7b146102925760405163516e822d60e01b81526001600160a01b03841660048201526024015b60405180910390fd5b5f6102a06080840184611d01565b5f8181106102b0576102b0611d47565b90506020028101906102c29190611d5b565b6102cc9080611d79565b6102da906040810190611d8d565b6102e76080860186611d01565b5f8181106102f7576102f7611d47565b90506020028101906103099190611d5b565b6020013581811061031c5761031c611d47565b6103329260206040909202019081019150611dd3565b90505f6103426080850185611d01565b5f81811061035257610352611d47565b90506020028101906103649190611d5b565b61036e9080611d79565b61037c906060810190611d8d565b6103896080870187611d01565b5f81811061039957610399611d47565b90506020028101906103ab9190611d5b565b604001358181106103be576103be611d47565b6103d49260206040909202019081019150611dd3565b90506103eb6001600160a01b038316865f196104c2565b6040516334e3942b60e11b81526001600160a01b038616906369c7285690610417908790600401612037565b60408051808303815f875af1158015610432573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104569190612237565b5061046d90506001600160a01b038316865f6104c2565b61049261047984611c45565b836104838561053c565b8461048d8661053c565b61061b565b50506104bd60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b505050565b6104ce8383835f61086c565b6104bd576104df83835f600161086c565b61050757604051635274afe760e01b81526001600160a01b0384166004820152602401610289565b610514838383600161086c565b6104bd57604051635274afe760e01b81526001600160a01b0384166004820152602401610289565b5f6105456108ce565b6040516354636d2b60e01b81526001600160a01b038316600482015273200e12d10bb0c5e4a17e7018f0f1161919bb9389906354636d2b906024016020604051808303815f875af115801561059c573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906100ed9190612259565b5f806001600160e01b038416601b0b60e085901d6105df82828761095b565b9350935050505b9250929050565b6105f5610acd565b60027f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b604080516003808252608082019092525f9160208201606080368337019050506040516370a0823160e01b81523060048201529091505f906001600160a01b038716906370a0823190602401602060405180830381865afa158015610682573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106a69190611ac2565b905080156106c2576106c26001600160a01b0387163383610b0f565b5f6106cd8287610b1c565b50905080835f815181106106e3576106e3611d47565b602090810291909101015250506040516370a0823160e01b81523060048201525f906001600160a01b038516906370a0823190602401602060405180830381865afa158015610734573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107589190611ac2565b90508015610774576107746001600160a01b0385163383610b0f565b5f61077f8285610b1c565b509050808360018151811061079657610796611d47565b60209081029190910101525047905080156107b5576107b53382610b5c565b5f6107c1826012610b1c565b50905080836002815181106107d8576107d8611d47565b602090810291909101015250506040805160018082528183019092525f91816020015b6040805160a0810182525f91810182815260608083019390935260808201839052815260208101919091528152602001906001900390816107fb57905050905086815f8151811061084e5761084e611d47565b60200260200101819052506108638282610bd3565b50505050505050565b60405163095ea7b360e01b5f8181526001600160a01b038616600452602485905291602083604481808b5af1925060015f511483166108c25783831516156108b6573d5f823e3d81fd5b5f873b113d1516831692505b60405250949350505050565b73200e12d10bb0c5e4a17e7018f0f1161919bb93893b1580610925575073200e12d10bb0c5e4a17e7018f0f1161919bb93893f7f1de7d717526cba131d684e312dedbf0852adef9cced9e36798ae4937f7145d4114155b15610959576040516373e6d7b360e01b815273200e12d10bb0c5e4a17e7018f0f1161919bb93896004820152602401610289565b565b5f805f85121561098857604051634a7d166b60e01b81526004810186905260248101859052604401610289565b845f0361099a57505f90506001610ac5565b8460ff84168501858112156109d55760405163c849483b60e01b8152600481018890526024810187905260ff86166044820152606401610289565b5f805f831215610a2157604c198312156109f8575f809550955050505050610ac5565b825f03600a0a9150818481610a0f57610a0f612279565b0495505084029091149150610ac59050565b5f831315610aba57604d831315610a5e5760405163c849483b60e01b8152600481018a90526024810189905260ff88166044820152606401610289565b82600a0a9150815f1981610a7457610a74612279565b04841115610aa85760405163c849483b60e01b8152600481018a90526024810189905260ff88166044820152606401610289565b5091909102925060019150610ac59050565b509193506001925050505b935093915050565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f005460020361095957604051633ee5aeb560e01b815260040160405180910390fd5b6105148383836001610be8565b5f805f805f610b2b8787610c32565b9250925092505f80610b3d8585610c8e565b9150915081838015610b4c5750815b9650965050505050509250929050565b80471015610b865760405163cf47918160e01b815247600482015260248101829052604401610289565b610b9f828260405180602001604052805f815250610ed7565b15610ba8575050565b3d15610bba57610bb6610eec565b5050565b60405163d6bda27560e01b815260040160405180910390fd5b610bb6610be1600784610ef7565b825f610f59565b60405163a9059cbb60e01b5f8181526001600160a01b038616600452602485905291602083604481808b5af1925060015f511483166108c25783831516156108b6573d5f823e3d81fd5b5f808060ff841681037f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff861115610c7d57600a860460018201600a88065f1493509350935050610c87565b8593509150600190505b9250925092565b5f808383601b82900b821480610dc4577d90e40fbeea1d3a4abc8955e946fe31cdcf66f634e1000000000000000000870515610d0f577f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee8000000000000000000870515610d00576305f5e10087059650600886019550610d0f565b620186a0870596506005860195505b8687601b0b14610d2a57600a87059650856001019550610d0f565b7b0ccccccccccccccccccccccccccccccccccccccccccccccccccccccc7b1999999999999999999999999999999999999999999999999999999888820111610dbe575f600188039050808160030b03610dbc5760e01b6001600160e01b037b7fffffffffffffffffffffffffffffffffffffffffffffffffffffff60ff8b901d18161795505f94506105e69350505050565b505b50610ddb565b865f03610ddb57505f9350600192506105e6915050565b858660030b14610e92575f821315610e3a57610df7838361120d565b15610e1f5760405163d556b11160e01b81526004810184905260248101839052604401610289565b637ffffffe19909501600a0a82029550637fffffff94610e92565b637fffffff198690036043811315610e5c57505f94508493506105e692505050565b80600a0a8881610e6e57610e6e612279565b059750875f03610e8857505f94508493506105e692505050565b50637fffffff1995505b818613610ea25760019350610ebb565b818603600a0a8381610eb657610eb6612279565b071593505b5050506001600160e01b03841660e084901b1791509250929050565b5f805f83516020850186885af1949350505050565b6040513d5f823e3d81fd5b60408051600780825261010082019092526060915f9190816020015b6060815260200190600190039081610f135790505090508281610f3760018761228d565b81518110610f4757610f47611d47565b60209081029190910101529392505050565b60408051600780825261010082019092525f91816020015b6060815260200190600190039081610f715790505090505f5b8451811015610fd257848181518110610fa557610fa5611d47565b6020026020010151828281518110610fbf57610fbf611d47565b6020908102919091010152600101610f8a565b50335f8181523060209081526040808320815160a0810183528083018581526060808301879052608083018190529082528185015282518581529384018581528484019093529093909291905b88518110156112015788818151811061103a5761103a611d47565b602002602001015193505f845f0151604001515111156111f9575f61106388866020015161122f565b9050886110d6576110b8815f8151811061107f5761107f611d47565b60200260200101515f8151811061109857611098611d47565b602002602001015160408051600181526020810192909252818101905290565b815f815181106110ca576110ca611d47565b60200260200101819052505b8451516040805160e08101825287516020908101516001600160a01b0390811683529082018a90528851830151828401525f606083018190526080830186905260a0830189905260c08301889052925163d04dfe2360e01b81529293169163d04dfe239161114691600401612327565b5f60405180830381865afa158015611160573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526111879190810190612428565b9150505f815111156111f65785516020015160405163012c676d60e21b81526001600160a01b03909116906304b19db4906111c8908b9085906004016124de565b5f604051808303815f87803b1580156111df575f80fd5b505af11580156111f1573d5f803e3d5ffd5b505050505b50505b60010161101f565b50505050505050505050565b5f6112285f841261121e5783611222565b835f035b83611511565b9392505050565b60605f825167ffffffffffffffff81111561124c5761124c6118ee565b604051908082528060200260200182016040528015611275578160200160208202803683370190505b5090505f80845111611287575f61128d565b83516001015b85516001010190505f8167ffffffffffffffff8111156112af576112af6118ee565b6040519080825280602002602001820160405280156112e257816020015b60608152602001906001900390816112cd5790505b5090505f611306604080516002815233602082015230818301526060810190915290565b82828151811061131857611318611d47565b60200260200101819052505f5b875181101561137557818060010192505087818151811061134857611348611d47565b602002602001015183838151811061136257611362611d47565b6020908102919091010152600101611325565b508551156115075780806001019150508382828151811061139857611398611d47565b60200260200101819052505f5b8651811015611505576114548782815181106113c3576113c3611d47565b60200260200101515f01516114316113ff8a85815181106113e6576113e6611d47565b6020026020010151602001518051602090810291012090565b7f19457468657265756d205369676e6564204d6573736167653a0a3332000000005f908152601c91909152603c902090565b89848151811061144357611443611d47565b6020026020010151604001516115af565b61147457604051630a57f30960e31b815260048101829052602401610289565b86818151811061148657611486611d47565b60200260200101515f01516001600160a01b03165f1b8582815181106114ae576114ae611d47565b60200260200101818152505081806001019250508681815181106114d4576114d4611d47565b6020026020010151602001518383815181106114f2576114f2611d47565b60209081029190910101526001016113a5565b505b5095945050505050565b5f637ffffff5821361152457505f6100ed565b637ffffffe198201604381131561153f5750508115156100ed565b5f811261157f5780600a0a7b800000000000000000000000000000000000000000000000000000018161157457611574612279565b0484119150506100ed565b805f03600a0a7b800000000000000000000000000000000000000000000000000000020284101591505092915050565b5f836001600160a01b03163b5f0361160d575f806115cd8585611620565b5090925090505f8160038111156115e6576115e66124f6565b1480156116045750856001600160a01b0316826001600160a01b0316145b92505050611228565b611618848484611666565b949350505050565b5f805f8351604103611657576020840151604085015160608601515f1a611649888285856116cb565b955095509550505050610c87565b505081515f9150600290610c87565b805160408051630b135d3f60e11b8082526004820186905260248201929092525f92906020820185604483015e5f82606483010152601f820160051c60051b915060205f60648401838a5afa9050825f5114601f3d1116811693505050509392505050565b5f80807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a084111561170457505f91506003905082611789565b604080515f808252602082018084528a905260ff891692820192909252606081018790526080810186905260019060a0016020604051602081039080840390855afa158015611755573d5f803e3d5ffd5b5050604051601f1901519150506001600160a01b03811661178057505f925060019150829050611789565b92505f91508190505b9450945094915050565b5f602082840312156117a3575f80fd5b81356001600160e01b031981168114611228575f80fd5b6001600160a01b0381168114610214575f80fd5b5f805f805f8060a087890312156117e3575f80fd5b86356117ee816117ba565b955060208701356117fe816117ba565b94506040870135935060608701359250608087013567ffffffffffffffff80821115611828575f80fd5b818901915089601f83011261183b575f80fd5b813581811115611849575f80fd5b8a602082850101111561185a575f80fd5b6020830194508093505050509295509295509295565b5f805f60608486031215611882575f80fd5b833561188d816117ba565b9250602084013567ffffffffffffffff808211156118a9575f80fd5b9085019060c082880312156118bc575f80fd5b909250604085013590808211156118d1575f80fd5b508401604081870312156118e3575f80fd5b809150509250925092565b634e487b7160e01b5f52604160045260245ffd5b6040516060810167ffffffffffffffff81118282101715611925576119256118ee565b60405290565b6040805190810167ffffffffffffffff81118282101715611925576119256118ee565b604051601f8201601f1916810167ffffffffffffffff81118282101715611977576119776118ee565b604052919050565b5f82601f83011261198e575f80fd5b813567ffffffffffffffff8111156119a8576119a86118ee565b6119bb601f8201601f191660200161194e565b8181528460208386010111156119cf575f80fd5b816020850160208301375f918101602001919091529392505050565b5f602082840312156119fb575f80fd5b813567ffffffffffffffff811115611a11575f80fd5b6116188482850161197f565b634e487b7160e01b5f52601160045260245ffd5b5f60018201611a4257611a42611a1d565b5060010190565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b5f6001600160a01b038089168352876020840152808716604084015285606084015280851660808401525060c060a0830152611ab660c0830184611a49565b98975050505050505050565b5f60208284031215611ad2575f80fd5b5051919050565b5f67ffffffffffffffff821115611af257611af26118ee565b5060051b60200190565b5f82601f830112611b0b575f80fd5b81356020611b20611b1b83611ad9565b61194e565b82815260059290921b84018101918181019086841115611b3e575f80fd5b8286015b84811015611c3a57803567ffffffffffffffff80821115611b61575f80fd5b908801906060828b03601f19011215611b78575f80fd5b611b80611902565b86830135611b8d816117ba565b815260408381013583811115611ba1575f80fd5b8401603f81018d13611bb1575f80fd5b88810135611bc1611b1b82611ad9565b81815260059190911b82018301908a8101908f831115611bdf575f80fd5b928401925b82841015611bfd5783358252928b0192908b0190611be4565b858c0152505050606084013583811115611c15575f80fd5b611c238d8a8388010161197f565b918301919091525085525050918301918301611b42565b509695505050505050565b5f60408236031215611c55575f80fd5b611c5d61192b565b823567ffffffffffffffff80821115611c74575f80fd5b818501915060608236031215611c88575f80fd5b611c90611902565b8235611c9b816117ba565b81526020830135611cab816117ba565b6020820152604083013582811115611cc1575f80fd5b611ccd3682860161197f565b60408301525083526020850135915080821115611ce8575f80fd5b50611cf536828601611afc565b60208301525092915050565b5f808335601e19843603018112611d16575f80fd5b83018035915067ffffffffffffffff821115611d30575f80fd5b6020019150600581901b36038213156105e6575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235607e19833603018112611d6f575f80fd5b9190910192915050565b5f8235609e19833603018112611d6f575f80fd5b5f808335601e19843603018112611da2575f80fd5b83018035915067ffffffffffffffff821115611dbc575f80fd5b6020019150600681901b36038213156105e6575f80fd5b5f60208284031215611de3575f80fd5b8135611228816117ba565b5f808335601e19843603018112611e03575f80fd5b830160208101925035905067ffffffffffffffff811115611e22575f80fd5b8060051b36038213156105e6575f80fd5b5f8235605e19833603018112611e47575f80fd5b90910192915050565b5f808335601e19843603018112611e65575f80fd5b830160208101925035905067ffffffffffffffff811115611e84575f80fd5b8036038213156105e6575f80fd5b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b5f808335601e19843603018112611ecf575f80fd5b830160208101925035905067ffffffffffffffff811115611eee575f80fd5b8060061b36038213156105e6575f80fd5b8183525f60208085019450825f5b85811015611f45578135611f20816117ba565b6001600160a01b03168752818301358388015260409687019690910190600101611f0d565b509495945050505050565b8183526020808401935f91600585811b8301820185855b8881101561202957858303601f19018a52611f828289611e33565b60608135611f8f816117ba565b6001600160a01b03168552611fa682880183611dee565b82898801528083880152608092507f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811115611fe0575f80fd5b871b808288850137860190506040611ffa84820185611e50565b94508388840301828901526120128484018683611e92565b9e8a019e9750505093870193505050600101611f67565b509098975050505050505050565b5f602080835260e0830184358285015260408286013581860152606081870135818701528087013580151580821461206d575f80fd5b80608089015250506120826080880188611dee565b60c060a08901529384905261010093848801600582901b89018601835f5b848110156121fe578b830360ff19018452813536879003607e190181126120c5575f80fd5b8601803536829003609e190181126120db575f80fd5b60808552810180356120ec816117ba565b6001600160a01b0380821660808801526121088e840184611e33565b915060a080880152813561211b816117ba565b8116610120880152818e0135612130816117ba565b16610140870152612143818c0182611e50565b91508a61016088015261215b61018088018383611e92565b91505061216a8b830183611eba565b607f19808985030160c08a0152612182848385611eff565b93506121908d860186611eba565b93509150808985030160e08a0152506121aa838383611eff565b9250505060808201358c8701528c8301358d8701528a8301358b8701526121d38a840184611dee565b935091508581038a8701526121e9818484611f50565b968d019695505050918a0191506001016120a0565b505061220d60a08c018c611e50565b8b8303601f190160c08d015298509650612228818989611e92565b9b9a5050505050505050505050565b5f8060408385031215612248575f80fd5b505080516020909101519092909150565b5f60208284031215612269575f80fd5b815160ff81168114611228575f80fd5b634e487b7160e01b5f52601260045260245ffd5b818103818111156100ed576100ed611a1d565b5f815180845260208085019450602084015f5b83811015611f45578151875295820195908201906001016122b3565b5f8282518085526020808601955060208260051b840101602086015f5b8481101561231a57601f198684030189526123088383516122a0565b988401989250908301906001016122ec565b5090979650505050505050565b602081526001600160a01b038251166020820152602082015160408201525f604083015160e06060840152612360610100840182611a49565b9050606084015160808401526080840151601f19808584030160a086015261238883836122cf565b925060a08601519150808584030160c08601526123a583836122a0565b925060c08601519150808584030160e0860152506123c382826122a0565b95945050505050565b5f82601f8301126123db575f80fd5b815160206123eb611b1b83611ad9565b8083825260208201915060208460051b87010193508684111561240c575f80fd5b602086015b84811015611c3a5780518352918301918301612411565b5f8060408385031215612439575f80fd5b825167ffffffffffffffff80821115612450575f80fd5b818501915085601f830112612463575f80fd5b81516020612473611b1b83611ad9565b82815260059290921b84018101918181019089841115612491575f80fd5b948201945b838610156124af57855182529482019490820190612496565b918801519196509093505050808211156124c7575f80fd5b506124d4858286016123cc565b9150509250929050565b828152604060208201525f61161860408301846122a0565b634e487b7160e01b5f52602160045260245ffd"; /// @dev What MUST already be on a network before this release can be /// broadcast there: an address, and the runtime code that belongs at it. diff --git a/src/lib/LibRaindex.sol b/src/lib/LibRaindex.sol index e5737ebe2a..ee10dc2f18 100644 --- a/src/lib/LibRaindex.sol +++ b/src/lib/LibRaindex.sol @@ -118,11 +118,7 @@ uint256 constant CONTEXT_SIGNED_CONTEXT_START_ROW = 0; library LibRaindex { /// @dev Builds a calling context with `values` as context column `column` /// and every other calling context column empty. - function callingContextColumn(uint256 column, bytes32[] memory values) - internal - pure - returns (bytes32[][] memory) - { + function callingContextColumn(uint256 column, bytes32[] memory values) internal pure returns (bytes32[][] memory) { bytes32[][] memory callingContext = new bytes32[][](CALLING_CONTEXT_COLUMNS); callingContext[column - 1] = values; return callingContext; diff --git a/src/lib/LibRaindexSubParser.sol b/src/lib/LibRaindexSubParser.sol index 9d767d1db0..f366d50b89 100644 --- a/src/lib/LibRaindexSubParser.sol +++ b/src/lib/LibRaindexSubParser.sol @@ -7,19 +7,14 @@ import {LibUint256Matrix} from "rain-solmem-0.1.28/src/lib/LibUint256Matrix.sol" import {LibSubParse} from "rainlang-0.2.19/src/lib/parse/LibSubParse.sol"; import { CONTEXT_BASE_COLUMN, - CONTEXT_BASE_ROW_SENDER, - CONTEXT_BASE_ROW_CALLING_CONTRACT, - CONTEXT_BASE_ROWS + CONTEXT_BASE_ROW_CALLING_CONTRACT } from "rainlang-interface-0.2.13/src/lib/caller/LibContext.sol"; import { CONTEXT_CALLING_CONTEXT_ROW_ORDER_CLEARER, CONTEXT_DEPOSIT_COLUMN, CONTEXT_WITHDRAW_COLUMN, CONTEXT_CALLING_CONTEXT_ROW_DEPOSIT_DEPOSITOR, - CONTEXT_CALLING_CONTEXT_ROW_WITHDRAW_WITHDRAWER -} from "./LibRaindex.sol"; -import { - CONTEXT_COLUMNS, + CONTEXT_CALLING_CONTEXT_ROW_WITHDRAW_WITHDRAWER, CONTEXT_COLUMNS_EXTENDED, CONTEXT_VAULT_OUTPUTS_COLUMN, CONTEXT_VAULT_INPUTS_COLUMN, @@ -328,7 +323,7 @@ library LibRaindexSubParser { returns (bool, bytes memory, bytes32[] memory) { //slither-disable-next-line unused-return - return LibSubParse.subParserContext(CONTEXT_CALLING_CONTEXT_COLUMN, CONTEXT_CALLING_CONTEXT_ROW_DEPOSIT_TOKEN); + return LibSubParse.subParserContext(CONTEXT_DEPOSIT_COLUMN, CONTEXT_CALLING_CONTEXT_ROW_DEPOSIT_TOKEN); } /// @dev Maps the "deposit-vault-id" word to the calling context column. @@ -338,8 +333,7 @@ library LibRaindexSubParser { returns (bool, bytes memory, bytes32[] memory) { //slither-disable-next-line unused-return - return - LibSubParse.subParserContext(CONTEXT_CALLING_CONTEXT_COLUMN, CONTEXT_CALLING_CONTEXT_ROW_DEPOSIT_VAULT_ID); + return LibSubParse.subParserContext(CONTEXT_DEPOSIT_COLUMN, CONTEXT_CALLING_CONTEXT_ROW_DEPOSIT_VAULT_ID); } /// @dev Maps the "deposit-vault-balance-before" word to the calling context column. @@ -349,10 +343,7 @@ library LibRaindexSubParser { returns (bool, bytes memory, bytes32[] memory) { //slither-disable-next-line unused-return - return - LibSubParse.subParserContext( - CONTEXT_CALLING_CONTEXT_COLUMN, CONTEXT_CALLING_CONTEXT_ROW_DEPOSIT_VAULT_BEFORE - ); + return LibSubParse.subParserContext(CONTEXT_DEPOSIT_COLUMN, CONTEXT_CALLING_CONTEXT_ROW_DEPOSIT_VAULT_BEFORE); } /// @dev Maps the "deposit-vault-balance-after" word to the calling context column. @@ -362,10 +353,7 @@ library LibRaindexSubParser { returns (bool, bytes memory, bytes32[] memory) { //slither-disable-next-line unused-return - return - LibSubParse.subParserContext( - CONTEXT_CALLING_CONTEXT_COLUMN, CONTEXT_CALLING_CONTEXT_ROW_DEPOSIT_VAULT_AFTER - ); + return LibSubParse.subParserContext(CONTEXT_DEPOSIT_COLUMN, CONTEXT_CALLING_CONTEXT_ROW_DEPOSIT_VAULT_AFTER); } /// @dev Maps the "deposit-token-decimals" word to the calling context column. @@ -375,9 +363,7 @@ library LibRaindexSubParser { returns (bool, bytes memory, bytes32[] memory) { //slither-disable-next-line unused-return - return LibSubParse.subParserContext( - CONTEXT_CALLING_CONTEXT_COLUMN, CONTEXT_CALLING_CONTEXT_ROW_DEPOSIT_TOKEN_DECIMALS - ); + return LibSubParse.subParserContext(CONTEXT_DEPOSIT_COLUMN, CONTEXT_CALLING_CONTEXT_ROW_DEPOSIT_TOKEN_DECIMALS); } /// @dev Maps the "withdraw-token" word to the calling context column. @@ -387,7 +373,7 @@ library LibRaindexSubParser { returns (bool, bytes memory, bytes32[] memory) { //slither-disable-next-line unused-return - return LibSubParse.subParserContext(CONTEXT_CALLING_CONTEXT_COLUMN, CONTEXT_CALLING_CONTEXT_ROW_WITHDRAW_TOKEN); + return LibSubParse.subParserContext(CONTEXT_WITHDRAW_COLUMN, CONTEXT_CALLING_CONTEXT_ROW_WITHDRAW_TOKEN); } /// @dev Maps the "withdraw-vault-id" word to the calling context column. @@ -397,8 +383,7 @@ library LibRaindexSubParser { returns (bool, bytes memory, bytes32[] memory) { //slither-disable-next-line unused-return - return - LibSubParse.subParserContext(CONTEXT_CALLING_CONTEXT_COLUMN, CONTEXT_CALLING_CONTEXT_ROW_WITHDRAW_VAULT_ID); + return LibSubParse.subParserContext(CONTEXT_WITHDRAW_COLUMN, CONTEXT_CALLING_CONTEXT_ROW_WITHDRAW_VAULT_ID); } /// @dev Maps the "withdraw-vault-balance-before" word to the calling context column. @@ -408,10 +393,7 @@ library LibRaindexSubParser { returns (bool, bytes memory, bytes32[] memory) { //slither-disable-next-line unused-return - return - LibSubParse.subParserContext( - CONTEXT_CALLING_CONTEXT_COLUMN, CONTEXT_CALLING_CONTEXT_ROW_WITHDRAW_VAULT_BEFORE - ); + return LibSubParse.subParserContext(CONTEXT_WITHDRAW_COLUMN, CONTEXT_CALLING_CONTEXT_ROW_WITHDRAW_VAULT_BEFORE); } /// @dev Maps the "withdraw-vault-balance-after" word to the calling context column. @@ -421,10 +403,7 @@ library LibRaindexSubParser { returns (bool, bytes memory, bytes32[] memory) { //slither-disable-next-line unused-return - return - LibSubParse.subParserContext( - CONTEXT_CALLING_CONTEXT_COLUMN, CONTEXT_CALLING_CONTEXT_ROW_WITHDRAW_VAULT_AFTER - ); + return LibSubParse.subParserContext(CONTEXT_WITHDRAW_COLUMN, CONTEXT_CALLING_CONTEXT_ROW_WITHDRAW_VAULT_AFTER); } /// @dev Maps the "withdraw-target-amount" word to the calling context column. @@ -434,9 +413,7 @@ library LibRaindexSubParser { returns (bool, bytes memory, bytes32[] memory) { //slither-disable-next-line unused-return - return LibSubParse.subParserContext( - CONTEXT_CALLING_CONTEXT_COLUMN, CONTEXT_CALLING_CONTEXT_ROW_WITHDRAW_TARGET_AMOUNT - ); + return LibSubParse.subParserContext(CONTEXT_WITHDRAW_COLUMN, CONTEXT_CALLING_CONTEXT_ROW_WITHDRAW_TARGET_AMOUNT); } /// @dev Maps the "withdraw-token-decimals" word to the calling context column. @@ -446,9 +423,8 @@ library LibRaindexSubParser { returns (bool, bytes memory, bytes32[] memory) { //slither-disable-next-line unused-return - return LibSubParse.subParserContext( - CONTEXT_CALLING_CONTEXT_COLUMN, CONTEXT_CALLING_CONTEXT_ROW_WITHDRAW_TOKEN_DECIMALS - ); + return + LibSubParse.subParserContext(CONTEXT_WITHDRAW_COLUMN, CONTEXT_CALLING_CONTEXT_ROW_WITHDRAW_TOKEN_DECIMALS); } /// @dev Maps the "signed-context" word to a signed context column/row. @@ -459,28 +435,21 @@ library LibRaindexSubParser { returns (bool, bytes memory, bytes32[] memory) { uint256 column = uint256(OperandV2.unwrap(operand)) & 0xFF; - uint256 row = (uint256(OperandV2.unwrap(operand)) >> 8) & 0xFF; + uint256 row = uint256(OperandV2.unwrap(operand)) >> 8; //slither-disable-next-line unused-return return LibSubParse.subParserContext(CONTEXT_SIGNED_CONTEXT_START_COLUMN + column, row); } /// @dev Builds the complete authoring metadata for all raindex context /// words. Returns ABI-encoded `AuthoringMetaV2[]` covering every context - /// column (base, calling, calculations, vault IO, signers, signed context, - /// deposit, withdraw). The inner arrays are flattened before encoding. + /// column (base, order, calculations, vault IO, deposit, withdraw, signers, + /// signed context; the arb column has no words). The inner arrays are flattened before encoding. //slither-disable-next-line dead-code function authoringMetaV2() internal pure returns (bytes memory) { AuthoringMetaV2[][] memory meta = new AuthoringMetaV2[][](CONTEXT_COLUMNS_EXTENDED); - AuthoringMetaV2[] memory contextBaseMeta = new AuthoringMetaV2[](CONTEXT_BASE_ROWS); - contextBaseMeta[CONTEXT_BASE_ROW_SENDER] = AuthoringMetaV2( - // constant WORD_ORDER_CLEARER defined above is less than 32 bytes, - // so this conversion is safe. - // forge-lint: disable-next-line(unsafe-typecast) - bytes32(WORD_ORDER_CLEARER), - "The order clearer is the address that submitted the transaction that is causing the order to execute. This MAY be the counterparty, e.g. when an order is being taken directly, but it MAY NOT be the counterparty if a third party is clearing two orders against each other." - ); - contextBaseMeta[CONTEXT_BASE_ROW_CALLING_CONTRACT] = + AuthoringMetaV2[] memory contextBaseMeta = new AuthoringMetaV2[](BASE_WORDS_LENGTH); + contextBaseMeta[BASE_WORD_RAINDEX] = // constant WORD_RAINDEX defined above is less than 32 bytes, so // this conversion is safe. // forge-lint: disable-next-line(unsafe-typecast) @@ -504,6 +473,13 @@ library LibRaindexSubParser { bytes32(WORD_ORDER_COUNTERPARTY), "The address of the owner of the counterparty order. Will be the order taker if there is no counterparty order." ); + contextCallingContextMeta[CONTEXT_CALLING_CONTEXT_ROW_ORDER_CLEARER] = AuthoringMetaV2( + // constant WORD_ORDER_CLEARER defined above is less than 32 bytes, + // so this conversion is safe. + // forge-lint: disable-next-line(unsafe-typecast) + bytes32(WORD_ORDER_CLEARER), + "The order clearer is the address that submitted the transaction that is causing the order to execute. This MAY be the counterparty, e.g. when an order is being taken directly, but it MAY NOT be the counterparty if a third party is clearing two orders against each other." + ); AuthoringMetaV2[] memory contextCalculationsMeta = new AuthoringMetaV2[](CONTEXT_CALCULATIONS_ROWS); contextCalculationsMeta[CONTEXT_CALCULATIONS_ROW_MAX_OUTPUT] = AuthoringMetaV2( @@ -649,7 +625,7 @@ library LibRaindexSubParser { // forge-lint: disable-next-line(unsafe-typecast) AuthoringMetaV2(bytes32(WORD_DEPOSIT_TOKEN_DECIMALS), "The decimals of the token that is being deposited."); - meta[CONTEXT_SIGNED_CONTEXT_START_COLUMN + 1] = depositMeta; + meta[CONTEXT_DEPOSIT_COLUMN] = depositMeta; AuthoringMetaV2[] memory withdrawMeta = new AuthoringMetaV2[](WITHDRAW_WORDS_LENGTH); withdrawMeta[WITHDRAW_WORD_WITHDRAWER] = @@ -692,7 +668,7 @@ library LibRaindexSubParser { // forge-lint: disable-next-line(unsafe-typecast) AuthoringMetaV2(bytes32(WORD_WITHDRAW_TOKEN_DECIMALS), "The decimals of the token that is being withdrawn."); - meta[CONTEXT_SIGNED_CONTEXT_START_COLUMN + 2] = withdrawMeta; + meta[CONTEXT_WITHDRAW_COLUMN] = withdrawMeta; uint256[][] memory metaUint256; assembly { diff --git a/test/abstract/RaindexV6ArbOrderTaker.context.t.sol b/test/abstract/RaindexV6ArbOrderTaker.context.t.sol index ff463efdea..36e28fb856 100644 --- a/test/abstract/RaindexV6ArbOrderTaker.context.t.sol +++ b/test/abstract/RaindexV6ArbOrderTaker.context.t.sol @@ -72,9 +72,9 @@ contract RaindexV6ArbOrderTakerContextTest is RaindexV6ExternalRealTest { bytecode: iParserV2.parse2( bytes( string.concat( - ":ensure(equal-to(context<1 0>() 3) \"input token\"),", - ":ensure(equal-to(context<1 1>() 4) \"output token\"),", - ":ensure(equal-to(context<1 2>() 5) \"gas balance\");" + ":ensure(equal-to(context<7 0>() 3) \"input token\"),", + ":ensure(equal-to(context<7 1>() 4) \"output token\"),", + ":ensure(equal-to(context<7 2>() 5) \"gas balance\");" ) ) ) diff --git a/test/abstract/RaindexV6ArbOrderTaker.finalizeDecimals.t.sol b/test/abstract/RaindexV6ArbOrderTaker.finalizeDecimals.t.sol index ba54686d00..31d3de6e8f 100644 --- a/test/abstract/RaindexV6ArbOrderTaker.finalizeDecimals.t.sol +++ b/test/abstract/RaindexV6ArbOrderTaker.finalizeDecimals.t.sol @@ -81,9 +81,9 @@ contract RaindexV6ArbOrderTakerFinalizeDecimalsTest is RaindexV6ExternalRealTest bytecode: iParserV2.parse2( bytes( string.concat( - ":ensure(equal-to(context<1 0>() 3) \"input token\"),", - ":ensure(equal-to(context<1 1>() 4) \"output token\"),", - ":ensure(equal-to(context<1 2>() 5) \"gas balance\");" + ":ensure(equal-to(context<7 0>() 3) \"input token\"),", + ":ensure(equal-to(context<7 1>() 4) \"output token\"),", + ":ensure(equal-to(context<7 2>() 5) \"gas balance\");" ) ) ) diff --git a/test/abstract/RaindexV6FlashBorrower.finalizeDecimals.t.sol b/test/abstract/RaindexV6FlashBorrower.finalizeDecimals.t.sol index f91d3a04c9..1277eac57f 100644 --- a/test/abstract/RaindexV6FlashBorrower.finalizeDecimals.t.sol +++ b/test/abstract/RaindexV6FlashBorrower.finalizeDecimals.t.sol @@ -31,11 +31,11 @@ import {LibDecimalFloat} from "rain-math-float-0.3.10/src/lib/LibDecimalFloat.so /// Here the input token is 6-decimal and the output token is 9-decimal, the arb /// is pre-funded with a deterministic leftover of each token (3e6 input, 4e9 /// output) that the mock raindex's no-op `takeOrders4` leaves untouched, and a -/// REAL post-arb task asserts the swept context floats. context<1 0>() == 3 and -/// context<1 1>() == 4 hold ONLY when each leftover is scaled by its OWN +/// REAL post-arb task asserts the swept context floats. context<7 0>() == 3 and +/// context<7 1>() == 4 hold ONLY when each leftover is scaled by its OWN /// decimals (3e6 / 1e6 == 3; 4e9 / 1e9 == 4). Swapping input-decimals for -/// output-decimals makes context<1 0>() == 0.003 (reverts "input token"); the -/// reverse makes context<1 1>() == 4000 (reverts "output token"). +/// output-decimals makes context<7 0>() == 0.003 (reverts "input token"); the +/// reverse makes context<7 1>() == 4000 (reverts "output token"). contract RaindexV6FlashBorrowerFinalizeDecimalsTest is RaindexV6ExternalRealTest { function testRaindexV6FlashBorrowerFinalizeUsesPerTokenDecimals() external { // 6-decimal input token, 9-decimal output token. @@ -77,7 +77,7 @@ contract RaindexV6FlashBorrowerFinalizeDecimalsTest is RaindexV6ExternalRealTest orders[0] = TakeOrderConfigV4(order, 0, 0, new SignedContextV1[](0)); // Real post-arb task: assert each swept leftover was scaled by its OWN - // decimals. context<1 0>() is the input float, context<1 1>() the output. + // decimals. context<7 0>() is the input float, context<7 1>() the output. TaskV2 memory task = TaskV2({ evaluable: EvaluableV4({ interpreter: iInterpreter, @@ -85,8 +85,8 @@ contract RaindexV6FlashBorrowerFinalizeDecimalsTest is RaindexV6ExternalRealTest bytecode: iParserV2.parse2( bytes( string.concat( - ":ensure(equal-to(context<1 0>() 3) \"input token\"),", - ":ensure(equal-to(context<1 1>() 4) \"output token\");" + ":ensure(equal-to(context<7 0>() 3) \"input token\"),", + ":ensure(equal-to(context<7 1>() 4) \"output token\");" ) ) ) diff --git a/test/concrete/parser/RaindexV6SubParser.operandHandlersWiring.t.sol b/test/concrete/parser/RaindexV6SubParser.operandHandlersWiring.t.sol index 7e4476af81..215b598296 100644 --- a/test/concrete/parser/RaindexV6SubParser.operandHandlersWiring.t.sol +++ b/test/concrete/parser/RaindexV6SubParser.operandHandlersWiring.t.sol @@ -11,11 +11,11 @@ import {RaindexV6SubParser} from "../../../src/concrete/parser/RaindexV6SubParse /// `[column][row]` matrix of internal operand-handler function pointers into a /// flat table of 16-bit pointers (two bytes per slot, column-major then row /// order), exactly mirroring the word-parser table. EVERY plain context word -/// (base / calling / calculations / vault-in / vault-out / deposit / withdraw) +/// (base / order / calculations / vault-in / vault-out / deposit / withdraw) /// is wired to the SAME `LibParseOperand.handleOperandDisallowed` function, so /// those slots all share one 16-bit pointer. Only TWO slots are different: -/// - signers (column 5, row 0) -> `handleOperandSingleFullNoDefault` -/// - signed-context (column 6, row 0) -> `handleOperandDoublePerByteNoDefault` +/// - signers (column 8, row 0) -> `handleOperandSingleFullNoDefault` +/// - signed-context (column 9, row 0) -> `handleOperandDoublePerByteNoDefault` /// Because the build function is a freshly compiled `external pure`, this test /// runs against a fresh deployment WITHOUT etching or pointer regeneration. The /// absolute pointer values are unstable across source edits (solc reorders its @@ -25,7 +25,7 @@ import {RaindexV6SubParser} from "../../../src/concrete/parser/RaindexV6SubParse /// deterministically covers the operand-handler outer length, the column /// assignments, and the deposit/withdraw column offsets: any of those mutations /// changes the table length and/or relocates the two distinct handler pointers -/// off slots 17/18. +/// off slots 30/31. contract RaindexV6SubParserOperandHandlersWiringTest is Test { RaindexV6SubParser internal subParser; @@ -34,18 +34,19 @@ contract RaindexV6SubParserOperandHandlersWiringTest is Test { } // Flat slot indices into the operand-handler pointer table (column-major): - // col 0 base (2 rows) -> 0, 1 - // col 1 calling context (3 rows) -> 2, 3, 4 + // col 0 base (1 row) -> 0 + // col 1 order (4 rows) -> 1..4 // col 2 calculations (2 rows) -> 5, 6 // col 3 vault inputs (5 rows) -> 7..11 // col 4 vault outputs (5 rows) -> 12..16 - // col 5 signers (1 row) -> 17 - // col 6 signed context (1 row) -> 18 - // col 7 deposit (6 rows) -> 19..24 - // col 8 withdraw (7 rows) -> 25..31 + // col 5 deposit (6 rows) -> 17..22 + // col 6 withdraw (7 rows) -> 23..29 + // col 7 arb (0 rows) + // col 8 signers (1 row) -> 30 + // col 9 signed context (1 row) -> 31 uint256 internal constant TABLE_SLOTS = 32; - uint256 internal constant SLOT_SIGNERS = 17; - uint256 internal constant SLOT_SIGNED_CONTEXT = 18; + uint256 internal constant SLOT_SIGNERS = 30; + uint256 internal constant SLOT_SIGNED_CONTEXT = 31; /// @dev Read the big-endian 16-bit function pointer at flat `slot` from the /// freshly built operand-handler table, asserting the table is the expected @@ -67,28 +68,19 @@ contract RaindexV6SubParserOperandHandlersWiringTest is Test { pointerAt(0); } - /// The signers operand handler (column 5, row 0) is the FIRST distinct - /// handler: `handleOperandSingleFullNoDefault`, different from the - /// `handleOperandDisallowed` used by every plain context word. Slots 0..16 - /// (base, calling, calculations, vault-in, vault-out) are all the shared - /// disallowed pointer, so the signers slot must differ from each of them. A - /// column-assignment mutation that moves the signers column off slot 17, or - /// that assigns a disallowed sub-array to the signers column, collapses this - /// distinction and is caught. + /// Every slot before signers (base through withdraw) is the shared + /// disallowed pointer; the signers slot (column 8, row 0) differs. function testSignersOperandHandlerIsDistinct() external view { uint16 disallowed = pointerAt(0); // Every plain context slot before signers shares the disallowed pointer. - for (uint256 slot = 0; slot <= 16; slot++) { + for (uint256 slot = 0; slot < SLOT_SIGNERS; slot++) { assertEq(pointerAt(slot), disallowed, "plain context slot uses handleOperandDisallowed"); } assertTrue(pointerAt(SLOT_SIGNERS) != disallowed, "signers handler must differ from handleOperandDisallowed"); } - /// The signed-context operand handler (column 6, row 0) is the SECOND - /// distinct handler: `handleOperandDoublePerByteNoDefault`, different from - /// BOTH the disallowed default AND the signers handler. This pins that the - /// signers and signed-context columns are wired to two genuinely different - /// handlers at slots 17 and 18 respectively (not swapped, not collapsed). + /// The signed-context handler (column 9, row 0) differs from both the + /// disallowed default and the signers handler. function testSignedContextOperandHandlerIsDistinct() external view { uint16 disallowed = pointerAt(0); assertTrue( @@ -101,25 +93,12 @@ contract RaindexV6SubParserOperandHandlersWiringTest is Test { ); } - /// Every deposit (slots 19..24) and withdraw (slots 25..31) operand-handler - /// slot is the shared `handleOperandDisallowed` pointer: deposit/withdraw - /// words are plain context words whose operand is disallowed. This, combined - /// with the two distinct-handler tests above and the length guard, pins that - /// the deposit column sits at offset +1 and the withdraw column at offset +2 - /// of the signed-context start column: a mutation swapping those offsets, or - /// dropping a column, either changes the table length (caught by the guard) - /// or relocates the two distinct signers/signed-context handlers into the - /// deposit/withdraw range (caught because slots 19..31 would no longer all - /// equal the disallowed pointer). + /// Every deposit (slots 17..22) and withdraw (slots 23..29) slot is the + /// shared disallowed pointer. function testDepositWithdrawOperandHandlersAllDisallowed() external view { uint16 disallowed = pointerAt(0); - for (uint256 slot = 19; slot <= 31; slot++) { + for (uint256 slot = 17; slot < SLOT_SIGNERS; slot++) { assertEq(pointerAt(slot), disallowed, "deposit/withdraw operand slot uses handleOperandDisallowed"); } - // And neither distinct handler leaks into the deposit/withdraw range: - // the only two non-disallowed slots are 17 (signers) and 18 (signed - // context), strictly before the deposit column at slot 19. - assertTrue(pointerAt(SLOT_SIGNERS) != disallowed, "signers slot 17 is the distinct signers handler"); - assertTrue(pointerAt(SLOT_SIGNED_CONTEXT) != disallowed, "signed-context slot 18 is the distinct handler"); } } diff --git a/test/concrete/parser/RaindexV6SubParser.routing.t.sol b/test/concrete/parser/RaindexV6SubParser.routing.t.sol index 86741f3134..3b5a54f7c2 100644 --- a/test/concrete/parser/RaindexV6SubParser.routing.t.sol +++ b/test/concrete/parser/RaindexV6SubParser.routing.t.sol @@ -55,17 +55,12 @@ contract RaindexV6SubParserRoutingTest is Test { // Base column (column 0). - function testRouteSender() external pure { - // order-clearer -> base column 0, sender row 0. - checkRoute(LibRaindexSubParser.subParserSender, 0, 0); - } - function testRouteCallingContract() external pure { // raindex -> base column 0, calling-contract row 1. checkRoute(LibRaindexSubParser.subParserCallingContract, 0, 1); } - // Calling context column (column 1). + // Order column (column 1). function testRouteOrderHash() external pure { checkRoute(LibRaindexSubParser.subParserOrderHash, 1, 0); @@ -79,6 +74,10 @@ contract RaindexV6SubParserRoutingTest is Test { checkRoute(LibRaindexSubParser.subParserOrderCounterparty, 1, 2); } + function testRouteOrderClearer() external pure { + checkRoute(LibRaindexSubParser.subParserOrderClearer, 1, 3); + } + // Calculations column (column 2). function testRouteMaxOutput() external pure { @@ -134,70 +133,75 @@ contract RaindexV6SubParserRoutingTest is Test { checkRoute(LibRaindexSubParser.subParserOutputBalanceDiff, 4, 4); } - // Deposit words route to the calling context column (column 1), deposit - // row enum. No fixture context columns exist for these, so this is the - // only coverage of their routing. + // Deposit column (column 5). + + function testRouteDepositor() external pure { + checkRoute(LibRaindexSubParser.subParserDepositor, 5, 5); + } function testRouteDepositToken() external pure { - checkRoute(LibRaindexSubParser.subParserDepositToken, 1, 0); + checkRoute(LibRaindexSubParser.subParserDepositToken, 5, 0); } function testRouteDepositVaultId() external pure { - checkRoute(LibRaindexSubParser.subParserDepositVaultId, 1, 1); + checkRoute(LibRaindexSubParser.subParserDepositVaultId, 5, 1); } function testRouteDepositVaultBalanceBefore() external pure { - checkRoute(LibRaindexSubParser.subParserDepositVaultBalanceBefore, 1, 2); + checkRoute(LibRaindexSubParser.subParserDepositVaultBalanceBefore, 5, 2); } function testRouteDepositVaultBalanceAfter() external pure { - checkRoute(LibRaindexSubParser.subParserDepositVaultBalanceAfter, 1, 3); + checkRoute(LibRaindexSubParser.subParserDepositVaultBalanceAfter, 5, 3); } - // Withdraw words route to the calling context column (column 1), withdraw - // row enum. + // Withdraw column (column 6). + + function testRouteWithdrawer() external pure { + checkRoute(LibRaindexSubParser.subParserWithdrawer, 6, 6); + } function testRouteWithdrawToken() external pure { - checkRoute(LibRaindexSubParser.subParserWithdrawToken, 1, 0); + checkRoute(LibRaindexSubParser.subParserWithdrawToken, 6, 0); } function testRouteWithdrawVaultId() external pure { - checkRoute(LibRaindexSubParser.subParserWithdrawVaultId, 1, 1); + checkRoute(LibRaindexSubParser.subParserWithdrawVaultId, 6, 1); } function testRouteWithdrawVaultBalanceBefore() external pure { - checkRoute(LibRaindexSubParser.subParserWithdrawVaultBalanceBefore, 1, 2); + checkRoute(LibRaindexSubParser.subParserWithdrawVaultBalanceBefore, 6, 2); } function testRouteWithdrawVaultBalanceAfter() external pure { - checkRoute(LibRaindexSubParser.subParserWithdrawVaultBalanceAfter, 1, 3); + checkRoute(LibRaindexSubParser.subParserWithdrawVaultBalanceAfter, 6, 3); } function testRouteWithdrawTargetAmount() external pure { - checkRoute(LibRaindexSubParser.subParserWithdrawTargetAmount, 1, 4); + checkRoute(LibRaindexSubParser.subParserWithdrawTargetAmount, 6, 4); } // Operand-driven words. - /// signers routes to the signers column (column 5) and uses the raw + /// signers routes to the signers column (column 8) and uses the raw /// operand as the row. function testRouteSignersRowFromOperand() external pure { - checkRouteOperand(LibRaindexSubParser.subParserSigners, OperandV2.wrap(bytes32(uint256(0))), 5, 0); - checkRouteOperand(LibRaindexSubParser.subParserSigners, OperandV2.wrap(bytes32(uint256(1))), 5, 1); - checkRouteOperand(LibRaindexSubParser.subParserSigners, OperandV2.wrap(bytes32(uint256(7))), 5, 7); + checkRouteOperand(LibRaindexSubParser.subParserSigners, OperandV2.wrap(bytes32(uint256(0))), 8, 0); + checkRouteOperand(LibRaindexSubParser.subParserSigners, OperandV2.wrap(bytes32(uint256(1))), 8, 1); + checkRouteOperand(LibRaindexSubParser.subParserSigners, OperandV2.wrap(bytes32(uint256(7))), 8, 7); } /// signed-context low operand byte selects a column offset added to the - /// signed context start column (column 6); the second byte selects the row. + /// signed context start column (column 9); the second byte selects the row. function testRouteSignedContextColumnMaskAndRowShift() external pure { - // operand 0x0000 -> column 6 + 0, row 0. - checkRouteOperand(LibRaindexSubParser.subParserSignedContext, OperandV2.wrap(bytes32(uint256(0x0000))), 6, 0); - // operand 0x0001 -> low byte 1 -> column 6 + 1 = 7, row 0. - checkRouteOperand(LibRaindexSubParser.subParserSignedContext, OperandV2.wrap(bytes32(uint256(0x0001))), 7, 0); - // operand 0x0100 -> low byte 0 -> column 6, second byte 1 -> row 1. - checkRouteOperand(LibRaindexSubParser.subParserSignedContext, OperandV2.wrap(bytes32(uint256(0x0100))), 6, 1); - // operand 0x0201 -> column 6 + 1 = 7, row 2. Proves column and row are + // operand 0x0000 -> column 9 + 0, row 0. + checkRouteOperand(LibRaindexSubParser.subParserSignedContext, OperandV2.wrap(bytes32(uint256(0x0000))), 9, 0); + // operand 0x0001 -> low byte 1 -> column 9 + 1 = 10, row 0. + checkRouteOperand(LibRaindexSubParser.subParserSignedContext, OperandV2.wrap(bytes32(uint256(0x0001))), 10, 0); + // operand 0x0100 -> low byte 0 -> column 9, second byte 1 -> row 1. + checkRouteOperand(LibRaindexSubParser.subParserSignedContext, OperandV2.wrap(bytes32(uint256(0x0100))), 9, 1); + // operand 0x0201 -> column 9 + 1 = 10, row 2. Proves column and row are // taken from distinct operand bytes (mask vs shift not swapped). - checkRouteOperand(LibRaindexSubParser.subParserSignedContext, OperandV2.wrap(bytes32(uint256(0x0201))), 7, 2); + checkRouteOperand(LibRaindexSubParser.subParserSignedContext, OperandV2.wrap(bytes32(uint256(0x0201))), 10, 2); } } diff --git a/test/concrete/parser/RaindexV6SubParser.routingTokenDecimalsAndMasks.t.sol b/test/concrete/parser/RaindexV6SubParser.routingTokenDecimalsAndMasks.t.sol index 2fe238c998..6073a35ca2 100644 --- a/test/concrete/parser/RaindexV6SubParser.routingTokenDecimalsAndMasks.t.sol +++ b/test/concrete/parser/RaindexV6SubParser.routingTokenDecimalsAndMasks.t.sol @@ -6,30 +6,12 @@ import {Test} from "forge-std-1.17.0/src/Test.sol"; import {OperandV2} from "rainlang-interface-0.2.13/src/interface/ISubParserV4.sol"; import {OPCODE_CONTEXT} from "rainlang-interface-0.2.13/src/interface/IInterpreterV4.sol"; import {ContextGridOverflow} from "rainlang-0.2.19/src/error/ErrSubParse.sol"; -import {LibSubParse} from "rainlang-0.2.19/src/lib/parse/LibSubParse.sol"; import {LibRaindexSubParser} from "../../../src/lib/LibRaindexSubParser.sol"; /// @title RaindexV6SubParserRoutingTokenDecimalsAndMasksTest -/// @notice Pins routing that the main `RaindexV6SubParser.routing.t.sol` suite -/// leaves underconstrained, all against FRESH-compiled source (the -/// `LibRaindexSubParser.subParser*` functions are called directly, so no etched -/// pointers / regen are involved and any source-constant change is observed): -/// -/// 1. `subParserWithdrawTokenDecimals` absolute (column, row). The -/// word-parser-wiring suite only pins this slot RELATIVELY (it asserts the -/// 16-bit pointer is `!=` withdraw-target-amount / deposit-token-decimals / -/// sender), so an absolute (column, row) shift that lands on a pointer still -/// distinct from those three survives there. The deposit counterpart is -/// pinned absolutely by the wiring suite (its pointer must EQUAL -/// withdraw-target-amount at (1,4)), but withdraw-token-decimals has no such -/// equality anchor, so it needs a direct (column, row) assertion. -/// -/// 2. The `& 0xFF` ROW mask in `subParserSignedContext`. The operand row is -/// `(operand >> 8) & 0xFF`. Because `LibSubParse.subParserContext` REVERTS -/// `ContextGridOverflow` when row > 255, dropping the mask turns a wide -/// operand from a successful in-range row into a revert. A wide operand whose -/// masked row is a small in-range value discriminates the masked code -/// (returns 4-byte context bytecode) from the unmasked code (reverts). +/// @notice Pins the absolute (column, row) of the deposit and withdraw token +/// decimals words, and that a signed-context row operand wider than a byte +/// reverts instead of wrapping. contract RaindexV6SubParserRoutingTokenDecimalsAndMasksTest is Test { /// @dev Decode the 4-byte context bytecode blob returned by a parser: /// byte 0 = opcode index, byte 1 = io byte, byte 2 = row, byte 3 = column. @@ -41,7 +23,7 @@ contract RaindexV6SubParserRoutingTokenDecimalsAndMasksTest is Test { column = uint8(bytecode[3]); } - /// withdraw-token-decimals routes to the calling context column (1), row 5. + /// withdraw-token-decimals routes to the withdraw column (6), row 5. /// A mutation of either the column or the row constant lands a different /// byte in the decoded bytecode and fails here. function testRouteWithdrawTokenDecimalsAbsolute() external pure { @@ -50,11 +32,11 @@ contract RaindexV6SubParserRoutingTokenDecimalsAndMasksTest is Test { assertTrue(success, "parser must succeed"); assertEq(constants.length, 0, "context has no constants"); (uint8 row, uint8 column) = decode(bytecode); - assertEq(column, 1, "withdraw-token-decimals column is calling-context (1)"); + assertEq(column, 6, "withdraw-token-decimals column is withdraw (6)"); assertEq(row, 5, "withdraw-token-decimals row is 5"); } - /// deposit-token-decimals routes to the calling context column (1), row 4. + /// deposit-token-decimals routes to the deposit column (5), row 4. /// The wiring suite pins this via pointer equality to withdraw-target-amount; /// this is the direct (column, row) assertion as a self-contained anchor. function testRouteDepositTokenDecimalsAbsolute() external pure { @@ -62,41 +44,19 @@ contract RaindexV6SubParserRoutingTokenDecimalsAndMasksTest is Test { LibRaindexSubParser.subParserDepositTokenDecimals(0, 0, OperandV2.wrap(0)); assertTrue(success, "parser must succeed"); (uint8 row, uint8 column) = decode(bytecode); - assertEq(column, 1, "deposit-token-decimals column is calling-context (1)"); + assertEq(column, 5, "deposit-token-decimals column is deposit (5)"); assertEq(row, 4, "deposit-token-decimals row is 4"); } - /// The signed-context ROW is `(operand >> 8) & 0xFF`. An operand of - /// `0x010000` has low byte 0 (column offset 0 -> column 6) and `>> 8` = - /// `0x0100` = 256. WITH the mask the row is `0x0100 & 0xFF` = 0, so the - /// parser succeeds and returns (column 6, row 0). WITHOUT the mask the row is - /// 256, which exceeds uint8 and reverts `ContextGridOverflow(6, 256)`. This - /// asserts the masked, non-reverting outcome, so dropping the row mask flips - /// success into a revert and fails the test. - function testSignedContextRowMaskKeepsRowInRange() external pure { - (bool success, bytes memory bytecode,) = - LibRaindexSubParser.subParserSignedContext(0, 0, OperandV2.wrap(bytes32(uint256(0x010000)))); - assertTrue(success, "parser must succeed (row mask keeps row in range)"); - (uint8 row, uint8 column) = decode(bytecode); - assertEq(column, 6, "column is signed-context start (6) + low byte 0"); - assertEq(row, 0, "row is (0x010000 >> 8) & 0xFF = 0"); - } - - /// Confirms the discriminator above is genuine: the SAME wide operand, with - /// the row mask DROPPED (`>> 8` without `& 0xFF`), drives the row to 256 and - /// `LibSubParse.subParserContext` reverts `ContextGridOverflow(6, 256)`. This - /// documents the exact revert the production mask prevents, so the pairing of - /// these two tests pins the mask: removing it makes the happy test above - /// revert with this very selector/args. - function testSignedContextUnmaskedRowWouldOverflow() external { - uint256 column = uint256(0x010000) & 0xFF; // low byte 0 - uint256 unmaskedRow = uint256(0x010000) >> 8; // 256 - vm.expectRevert(abi.encodeWithSelector(ContextGridOverflow.selector, column + 6, unmaskedRow)); - this.callContext(column + 6, unmaskedRow); + /// A signed-context row wider than a byte reverts rather than wrapping onto + /// another row. + function testSignedContextWideRowReverts() external { + vm.expectRevert(abi.encodeWithSelector(ContextGridOverflow.selector, 9, 256)); + this.callSignedContext(OperandV2.wrap(bytes32(uint256(0x010000)))); } /// @dev External wrapper so `vm.expectRevert` can catch the library revert. - function callContext(uint256 column, uint256 row) external pure returns (bool, bytes memory, bytes32[] memory) { - return LibSubParse.subParserContext(column, row); + function callSignedContext(OperandV2 operand) external pure returns (bool, bytes memory, bytes32[] memory) { + return LibRaindexSubParser.subParserSignedContext(0, 0, operand); } } diff --git a/test/concrete/parser/RaindexV6SubParser.signers.t.sol b/test/concrete/parser/RaindexV6SubParser.signers.t.sol index 74a70663ce..c766018729 100644 --- a/test/concrete/parser/RaindexV6SubParser.signers.t.sol +++ b/test/concrete/parser/RaindexV6SubParser.signers.t.sol @@ -4,6 +4,7 @@ pragma solidity =0.8.25; import {StackAllocationMismatch} from "rainlang-0.2.19/src/error/ErrIntegrity.sol"; import {ExpectedOperand, UnexpectedOperandValue} from "rainlang-0.2.19/src/error/ErrParse.sol"; +import {ContextGridOverflow} from "rainlang-0.2.19/src/error/ErrSubParse.sol"; import {OpTest, StackItem} from "rainlang-0.2.19/src/../test/abstract/OpTest.sol"; import {Strings} from "@openzeppelin-contracts-5.7.0/utils/Strings.sol"; import {LibRaindexSubParserContextFixture} from "test/util/fixture/LibRaindexSubParserContextFixture.sol"; @@ -72,4 +73,15 @@ contract RaindexV6SubParserSignersTest is OpTest { checkUnhappyParse2(rainlang, abi.encodeWithSelector(StackAllocationMismatch.selector, 2, 1)); } + + /// A signer index past the last context row reverts rather than wrapping + /// onto another signer. + function testSubParserContextSignerUnhappyIndexOverflow() external { + address subParserAddress = LibRaindexDeploy.SUB_PARSER_DEPLOYED_ADDRESS; + + bytes memory rainlang = + bytes(string.concat("using-words-from ", subParserAddress.toHexString(), " _: signer<256>();")); + + checkUnhappyParse(rainlang, abi.encodeWithSelector(ContextGridOverflow.selector, 8, 256)); + } } diff --git a/test/concrete/parser/RaindexV6SubParser.wordParsersWiring.t.sol b/test/concrete/parser/RaindexV6SubParser.wordParsersWiring.t.sol index 18ca0d3c31..20e21658d4 100644 --- a/test/concrete/parser/RaindexV6SubParser.wordParsersWiring.t.sol +++ b/test/concrete/parser/RaindexV6SubParser.wordParsersWiring.t.sol @@ -4,284 +4,40 @@ pragma solidity =0.8.25; import {Test} from "forge-std-1.17.0/src/Test.sol"; import {RaindexV6SubParser} from "../../../src/concrete/parser/RaindexV6SubParser.sol"; +import {BASE_WORDS_LENGTH, DEPOSIT_WORDS_LENGTH, WITHDRAW_WORDS_LENGTH} from "../../../src/lib/LibRaindexSubParser.sol"; +import { + CONTEXT_CALLING_CONTEXT_ROWS, + CONTEXT_CALCULATIONS_ROWS, + CONTEXT_VAULT_IO_ROWS, + CONTEXT_SIGNED_CONTEXT_SIGNERS_ROWS, + CONTEXT_SIGNED_CONTEXT_START_ROWS +} from "../../../src/lib/LibRaindex.sol"; /// @title RaindexV6SubParserWordParsersWiringTest -/// @notice Pins which library word-parser function is wired into every -/// deposit and withdraw slot of `buildSubParserWordParsers()`. The build -/// function flattens a `[column][row]` matrix of internal-function pointers -/// into a flat table of 16-bit pointers (two bytes per slot, in column-major -/// then row order). The ABSOLUTE pointer value of any slot is unstable across -/// source edits (solc reorders its internal dispatch table), so this test -/// asserts only RELATIONS BETWEEN slots WITHIN A SINGLE build output, which are -/// invariant under that reordering: a slot wired to function F has the same -/// 16-bit pointer as every other slot wired to F, and a different pointer from -/// any slot wired to a distinct function. This deterministically covers the -/// deposit/withdraw slot wiring (which has no fixture context column and so is -/// invisible to the etched per-word happy suite) WITHOUT etching or pointer -/// regeneration, because the freshly compiled `external pure` build function is -/// what runs on a fresh deployment. +/// @notice Every word reads its own context cell, so no two word parsers can +/// be the same function: the flat 16-bit pointer table holds one slot per word +/// and no two slots share a pointer. contract RaindexV6SubParserWordParsersWiringTest is Test { - RaindexV6SubParser internal subParser; - - function setUp() public { - subParser = new RaindexV6SubParser(); - } - - // Flat slot indices into the word-parser pointer table. The matrix is - // flattened column-major; cumulative row counts per column are: - // col 0 base (2 rows) -> 0, 1 - // col 1 calling context (3 rows) -> 2, 3, 4 - // col 2 calculations (2 rows) -> 5, 6 - // col 3 vault inputs (5 rows) -> 7..11 - // col 4 vault outputs (5 rows) -> 12..16 - // col 5 signers (1 row) -> 17 - // col 6 signed context (1 row) -> 18 - // col 7 deposit (6 rows) -> 19..24 - // col 8 withdraw (7 rows) -> 25..31 - uint256 internal constant SLOT_BASE_SENDER = 0; - - // Calling-context column (col 1) slots. Deposit/withdraw row words route to - // the SAME (CONTEXT_CALLING_CONTEXT_COLUMN, row) as these order words, so - // solc deduplicates them to a shared 16-bit pointer. This lets the - // deposit/withdraw column OFFSETS be pinned by cross-column pointer equality. - uint256 internal constant SLOT_CALLING_ORDER_HASH = 2; // calling-context row 0 - uint256 internal constant SLOT_CALLING_ORDER_OWNER = 3; // calling-context row 1 - uint256 internal constant SLOT_CALLING_ORDER_COUNTERPARTY = 4; // calling-context row 2 - - uint256 internal constant SLOT_DEPOSIT_DEPOSITOR = 19; - uint256 internal constant SLOT_DEPOSIT_TOKEN = 20; - uint256 internal constant SLOT_DEPOSIT_VAULT_ID = 21; - uint256 internal constant SLOT_DEPOSIT_VAULT_BEFORE = 22; - uint256 internal constant SLOT_DEPOSIT_VAULT_AFTER = 23; - uint256 internal constant SLOT_DEPOSIT_TOKEN_DECIMALS = 24; - - uint256 internal constant SLOT_WITHDRAW_WITHDRAWER = 25; - uint256 internal constant SLOT_WITHDRAW_TOKEN = 26; - uint256 internal constant SLOT_WITHDRAW_VAULT_ID = 27; - uint256 internal constant SLOT_WITHDRAW_VAULT_BEFORE = 28; - uint256 internal constant SLOT_WITHDRAW_VAULT_AFTER = 29; - uint256 internal constant SLOT_WITHDRAW_TARGET_AMOUNT = 30; - uint256 internal constant SLOT_WITHDRAW_TOKEN_DECIMALS = 31; - - /// @dev Read the big-endian 16-bit function pointer at flat `slot` from the - /// freshly built word-parser table. - function pointerAt(uint256 slot) internal view returns (uint16) { - bytes memory table = subParser.buildSubParserWordParsers(); - // 32 slots, 2 bytes each. - assertEq(table.length, 64, "word parser table must hold 32 16-bit pointers"); - uint256 byteIndex = slot * 2; - return (uint16(uint8(table[byteIndex])) << 8) | uint16(uint8(table[byteIndex + 1])); - } - - /// The depositor slot of the deposit column is wired to `subParserSender`, - /// the SAME function as the base sender slot, NOT a deposit-specific parser. - /// Asserting pointer equality with the base sender slot catches any mutation - /// that swaps the depositor slot to a deposit row function (e.g. - /// `subParserDepositToken`), since that pointer differs from sender's. - function testDepositorAliasesSender() external view { - assertEq(pointerAt(SLOT_DEPOSIT_DEPOSITOR), pointerAt(SLOT_BASE_SENDER), "depositor must alias base sender"); - // And it is genuinely distinct from the deposit-token slot, so the - // equality above is not a coincidence of two equal functions. - assertTrue( - pointerAt(SLOT_DEPOSIT_DEPOSITOR) != pointerAt(SLOT_DEPOSIT_TOKEN), - "depositor must differ from deposit-token parser" - ); - } - - /// The withdrawer slot of the withdraw column is wired to `subParserSender`. - function testWithdrawerAliasesSender() external view { - assertEq(pointerAt(SLOT_WITHDRAW_WITHDRAWER), pointerAt(SLOT_BASE_SENDER), "withdrawer must alias base sender"); - assertTrue( - pointerAt(SLOT_WITHDRAW_WITHDRAWER) != pointerAt(SLOT_WITHDRAW_TOKEN), - "withdrawer must differ from withdraw-token parser" - ); + function wordCount() internal pure returns (uint256) { + return BASE_WORDS_LENGTH + CONTEXT_CALLING_CONTEXT_ROWS + CONTEXT_CALCULATIONS_ROWS + CONTEXT_VAULT_IO_ROWS * 2 + + DEPOSIT_WORDS_LENGTH + WITHDRAW_WORDS_LENGTH + CONTEXT_SIGNED_CONTEXT_SIGNERS_ROWS + + CONTEXT_SIGNED_CONTEXT_START_ROWS; } - /// Every non-depositor deposit slot is wired to its own DISTINCT deposit - /// parser function: token, vault-id, balance-before, balance-after are four - /// different functions, none of them `subParserSender`. A mutation that - /// duplicates one deposit function across two slots, or that drops a slot - /// back to sender, collapses a pair to equal pointers and is caught. - function testDepositSlotsAreDistinctFunctions() external view { - uint16 sender = pointerAt(SLOT_BASE_SENDER); - uint16 token = pointerAt(SLOT_DEPOSIT_TOKEN); - uint16 vaultId = pointerAt(SLOT_DEPOSIT_VAULT_ID); - uint16 before = pointerAt(SLOT_DEPOSIT_VAULT_BEFORE); - uint16 afterPtr = pointerAt(SLOT_DEPOSIT_VAULT_AFTER); - - assertTrue(token != sender, "deposit-token must not be sender"); - assertTrue(vaultId != sender, "deposit-vault-id must not be sender"); - assertTrue(before != sender, "deposit-before must not be sender"); - assertTrue(afterPtr != sender, "deposit-after must not be sender"); - - assertTrue(token != vaultId, "deposit token vs vault-id distinct"); - assertTrue(token != before, "deposit token vs before distinct"); - assertTrue(token != afterPtr, "deposit token vs after distinct"); - assertTrue(vaultId != before, "deposit vault-id vs before distinct"); - assertTrue(vaultId != afterPtr, "deposit vault-id vs after distinct"); - assertTrue(before != afterPtr, "deposit before vs after distinct"); - } - - /// Every non-withdrawer withdraw slot is wired to its own DISTINCT withdraw - /// parser function: token, vault-id, balance-before, balance-after, - /// target-amount are five different functions, none of them - /// `subParserSender`. - function testWithdrawSlotsAreDistinctFunctions() external view { - uint16 sender = pointerAt(SLOT_BASE_SENDER); - uint16 token = pointerAt(SLOT_WITHDRAW_TOKEN); - uint16 vaultId = pointerAt(SLOT_WITHDRAW_VAULT_ID); - uint16 before = pointerAt(SLOT_WITHDRAW_VAULT_BEFORE); - uint16 afterPtr = pointerAt(SLOT_WITHDRAW_VAULT_AFTER); - uint16 target = pointerAt(SLOT_WITHDRAW_TARGET_AMOUNT); - - assertTrue(token != sender, "withdraw-token must not be sender"); - assertTrue(vaultId != sender, "withdraw-vault-id must not be sender"); - assertTrue(before != sender, "withdraw-before must not be sender"); - assertTrue(afterPtr != sender, "withdraw-after must not be sender"); - assertTrue(target != sender, "withdraw-target must not be sender"); - - assertTrue(token != vaultId, "withdraw token vs vault-id distinct"); - assertTrue(token != before, "withdraw token vs before distinct"); - assertTrue(token != afterPtr, "withdraw token vs after distinct"); - assertTrue(token != target, "withdraw token vs target distinct"); - assertTrue(vaultId != before, "withdraw vault-id vs before distinct"); - assertTrue(vaultId != afterPtr, "withdraw vault-id vs after distinct"); - assertTrue(vaultId != target, "withdraw vault-id vs target distinct"); - assertTrue(before != afterPtr, "withdraw before vs after distinct"); - assertTrue(before != target, "withdraw before vs target distinct"); - assertTrue(afterPtr != target, "withdraw after vs target distinct"); + function testWordParsersTableHasOneSlotPerWord() external { + assertEq(new RaindexV6SubParser().buildSubParserWordParsers().length, wordCount() * 2); } - /// Deposit and withdraw words that share the same calling-context row resolve - /// to the SAME library function and so the SAME 16-bit pointer. Both - /// `subParserDepositToken` and `subParserWithdrawToken` route to - /// (CONTEXT_CALLING_CONTEXT_COLUMN, row 0), producing byte-identical context - /// bytecode, so solc deduplicates them into one function. This pins that the - /// deposit/withdraw token slots are wired to the row-0 calling-context parser - /// (a mutation routing either to a different row, e.g. swapping in the - /// vault-id parser, breaks the equality because the rows would differ). - function testDepositAndWithdrawTokenShareRowZeroFunction() external view { - assertEq( - pointerAt(SLOT_DEPOSIT_TOKEN), - pointerAt(SLOT_WITHDRAW_TOKEN), - "deposit-token and withdraw-token both route to calling-context row 0" - ); - // The shared row-0 function is genuinely distinct from sender and from - // the row-1 (vault-id) function, so the equality is meaningful. - assertTrue(pointerAt(SLOT_DEPOSIT_TOKEN) != pointerAt(SLOT_BASE_SENDER), "row-0 token parser is not sender"); - assertTrue( - pointerAt(SLOT_DEPOSIT_TOKEN) != pointerAt(SLOT_DEPOSIT_VAULT_ID), - "row-0 token parser is not row-1 vault-id" - ); + function testOperandHandlersTableHasOneSlotPerWord() external { + assertEq(new RaindexV6SubParser().buildOperandHandlerFunctionPointers().length, wordCount() * 2); } - /// Pins the DEPOSIT column to flat offset +1 of the signed-context start - /// column (i.e. column 7, slots 19..24). The deposit row words route into - /// CONTEXT_CALLING_CONTEXT_COLUMN rows 0/1/2, the SAME (col,row) as - /// order-hash/order-owner/order-counterparty, so solc deduplicates them to a - /// shared 16-bit pointer. Asserting that the deposit token/vault-id/before - /// slots equal the corresponding calling-context order slots fixes BOTH that - /// the deposit sub-array is assigned to this column AND that the column sits - /// at the expected flat offset. A mutation that assigns the deposit array to - /// `CONTEXT_SIGNED_CONTEXT_START_COLUMN + 2` (overwriting/displacing the - /// withdraw column) shifts these pointers off the asserted slots and is - /// caught here (independently of the table-length guard). - function testDepositColumnAtOffsetPlusOne() external view { - assertEq( - pointerAt(SLOT_DEPOSIT_TOKEN), - pointerAt(SLOT_CALLING_ORDER_HASH), - "deposit-token (col 7 row 0) aliases calling-context order-hash (row 0)" - ); - assertEq( - pointerAt(SLOT_DEPOSIT_VAULT_ID), - pointerAt(SLOT_CALLING_ORDER_OWNER), - "deposit-vault-id (col 7 row 1) aliases calling-context order-owner (row 1)" - ); - assertEq( - pointerAt(SLOT_DEPOSIT_VAULT_BEFORE), - pointerAt(SLOT_CALLING_ORDER_COUNTERPARTY), - "deposit-vault-before (col 7 row 2) aliases calling-context order-counterparty (row 2)" - ); - // The three calling-context pointers are themselves pairwise distinct, so - // the equalities above genuinely pin each deposit row to its own row, not - // a coincidence of three equal functions. - assertTrue( - pointerAt(SLOT_CALLING_ORDER_HASH) != pointerAt(SLOT_CALLING_ORDER_OWNER), "order-hash != order-owner" - ); - assertTrue( - pointerAt(SLOT_CALLING_ORDER_OWNER) != pointerAt(SLOT_CALLING_ORDER_COUNTERPARTY), - "order-owner != order-counterparty" - ); - } - - /// Pins the WITHDRAW column to flat offset +2 of the signed-context start - /// column (i.e. column 8, slots 25..31). Like deposits, the withdraw row - /// words 0/1/2 alias the calling-context order words. withdraw-target-amount - /// routes to CONTEXT_CALLING_CONTEXT_COLUMN row 4 — a row reached by no order - /// word and, among the deposit/withdraw rows, shared only with - /// deposit-token-decimals — so it is distinct from every deposit row 0..3. A - /// mutation that swaps the deposit and withdraw column offsets places the - /// withdraw column at +1 (the 6-slot deposit array follows), so the asserted - /// aliases land on the wrong rows. - function testWithdrawColumnAtOffsetPlusTwo() external view { - assertEq( - pointerAt(SLOT_WITHDRAW_TOKEN), - pointerAt(SLOT_CALLING_ORDER_HASH), - "withdraw-token (col 8 row 0) aliases calling-context order-hash (row 0)" - ); - assertEq( - pointerAt(SLOT_WITHDRAW_VAULT_ID), - pointerAt(SLOT_CALLING_ORDER_OWNER), - "withdraw-vault-id (col 8 row 1) aliases calling-context order-owner (row 1)" - ); - assertEq( - pointerAt(SLOT_WITHDRAW_VAULT_BEFORE), - pointerAt(SLOT_CALLING_ORDER_COUNTERPARTY), - "withdraw-vault-before (col 8 row 2) aliases calling-context order-counterparty (row 2)" - ); - // withdraw-target-amount routes to calling-context row 4, distinct from - // every order word and from deposit rows 0..3. - uint16 target = pointerAt(SLOT_WITHDRAW_TARGET_AMOUNT); - assertTrue(target != pointerAt(SLOT_CALLING_ORDER_HASH), "withdraw-target != order-hash (row 0)"); - assertTrue(target != pointerAt(SLOT_CALLING_ORDER_OWNER), "withdraw-target != order-owner (row 1)"); - assertTrue( - target != pointerAt(SLOT_CALLING_ORDER_COUNTERPARTY), "withdraw-target != order-counterparty (row 2)" - ); - assertTrue(target != pointerAt(SLOT_DEPOSIT_TOKEN), "withdraw-target != any deposit row pointer (token)"); - assertTrue(target != pointerAt(SLOT_DEPOSIT_VAULT_ID), "withdraw-target != any deposit row pointer (vault-id)"); - assertTrue(target != pointerAt(SLOT_DEPOSIT_VAULT_BEFORE), "withdraw-target != deposit before"); - assertTrue(target != pointerAt(SLOT_DEPOSIT_VAULT_AFTER), "withdraw-target != deposit after"); - } - - /// deposit-token-decimals routes to CONTEXT_CALLING_CONTEXT_COLUMN row 4 — - /// the SAME row as withdraw-target-amount — so solc deduplicates them into one - /// function and they share a 16-bit pointer; both are distinct from deposit - /// rows 0..3. withdraw-token-decimals routes to row 5, reached by no other - /// word, so its pointer is unique among the deposit/withdraw slots. - function testTokenDecimalsWiring() external view { - assertEq( - pointerAt(SLOT_DEPOSIT_TOKEN_DECIMALS), - pointerAt(SLOT_WITHDRAW_TARGET_AMOUNT), - "deposit-token-decimals and withdraw-target-amount both route to calling-context row 4" - ); - assertTrue( - pointerAt(SLOT_DEPOSIT_TOKEN_DECIMALS) != pointerAt(SLOT_DEPOSIT_TOKEN), - "deposit-token-decimals (row 4) != deposit-token (row 0)" - ); - assertTrue( - pointerAt(SLOT_DEPOSIT_TOKEN_DECIMALS) != pointerAt(SLOT_DEPOSIT_VAULT_AFTER), - "deposit-token-decimals (row 4) != deposit-vault-after (row 3)" - ); - - uint16 withdrawDecimals = pointerAt(SLOT_WITHDRAW_TOKEN_DECIMALS); - assertTrue( - withdrawDecimals != pointerAt(SLOT_WITHDRAW_TARGET_AMOUNT), - "withdraw-token-decimals (row 5) != withdraw-target-amount (row 4)" - ); - assertTrue( - withdrawDecimals != pointerAt(SLOT_DEPOSIT_TOKEN_DECIMALS), - "withdraw-token-decimals (row 5) != deposit-token-decimals (row 4)" - ); - assertTrue(withdrawDecimals != pointerAt(SLOT_BASE_SENDER), "withdraw-token-decimals != sender"); + function testWordParsersPairwiseDistinct() external { + bytes memory table = new RaindexV6SubParser().buildSubParserWordParsers(); + for (uint256 i = 0; i < table.length; i += 2) { + for (uint256 j = i + 2; j < table.length; j += 2) { + assertTrue(table[i] != table[j] || table[i + 1] != table[j + 1], "two words share a parser"); + } + } } } diff --git a/test/concrete/raindex/RaindexV6.contextWordEntrypoints.t.sol b/test/concrete/raindex/RaindexV6.contextWordEntrypoints.t.sol new file mode 100644 index 0000000000..d4fdf47b9c --- /dev/null +++ b/test/concrete/raindex/RaindexV6.contextWordEntrypoints.t.sol @@ -0,0 +1,307 @@ +// SPDX-License-Identifier: LicenseRef-DCL-1.0 +// SPDX-FileCopyrightText: Copyright (c) 2020 Rain Open Source Software Ltd +pragma solidity =0.8.25; + +import {stdError} from "forge-std-1.17.0/src/StdError.sol"; +import {RaindexV6ExternalRealTest} from "test/util/abstract/RaindexV6ExternalRealTest.sol"; +import { + OrderConfigV4, + OrderV4, + IOV2, + TaskV2, + EvaluableV4, + SignedContextV1, + TakeOrdersConfigV5 +} from "raindex-interface-0.1.8/src/interface/IRaindexV6.sol"; +import {IERC20} from "@openzeppelin-contracts-5.7.0/token/ERC20/IERC20.sol"; +import {Strings} from "@openzeppelin-contracts-5.7.0/utils/Strings.sol"; +import {LibDecimalFloat} from "rain-math-float-0.3.10/src/lib/LibDecimalFloat.sol"; +import {LibTestAddOrder} from "test/util/lib/LibTestAddOrder.sol"; +import {LibTestTakeOrder} from "test/util/lib/LibTestTakeOrder.sol"; +import {LibOrder} from "../../../src/lib/LibOrder.sol"; +import {LibTestContextWords} from "test/util/lib/LibTestContextWords.sol"; +import { + LibNamespace, + FullyQualifiedNamespace, + StateNamespace +} from "rainlang-interface-0.2.13/src/lib/ns/LibNamespace.sol"; + +/// @title RaindexV6ContextWordEntrypointsTest +/// @notice Every context word reads its true value in the entrypoints that fill +/// its cell and reverts out of bounds in every other entrypoint. +contract RaindexV6ContextWordEntrypointsTest is RaindexV6ExternalRealTest { + using Strings for address; + using Strings for uint256; + + address internal constant ACTOR = address(0xD0); + address internal constant TAKER = address(0xB0B); + bytes32 internal constant VAULT_ID = bytes32(uint256(1)); + + struct Check { + string word; + string value; + } + + function ensures(Check[] memory checks) internal pure returns (string memory body) { + for (uint256 i = 0; i < checks.length; i++) { + body = string.concat( + body, + i == 0 ? "" : ",", + ":ensure(equal-to(", + checks[i].word, + " ", + checks[i].value, + ") \"", + checks[i].word, + "\")" + ); + } + body = string.concat(body, ";"); + } + + function inFamily(Check[] memory checks, string memory word) internal pure returns (bool) { + for (uint256 i = 0; i < checks.length; i++) { + if (keccak256(bytes(checks[i].word)) == keccak256(bytes(word))) { + return true; + } + } + return false; + } + + function parse(string memory body) internal view returns (bytes memory) { + return + iParserV2.parse2(bytes(string.concat("using-words-from ", address(iSubParser).toHexString(), "\n", body))); + } + + function task(string memory body) internal view returns (TaskV2[] memory post) { + post = new TaskV2[](1); + post[0] = TaskV2(EvaluableV4(iInterpreter, iStore, parse(body)), new SignedContextV1[](0)); + } + + function orderConfig() internal view returns (OrderConfigV4 memory) { + IOV2[] memory inputs = new IOV2[](1); + inputs[0] = IOV2(address(iToken0), VAULT_ID); + IOV2[] memory outputs = new IOV2[](1); + outputs[0] = IOV2(address(iToken1), VAULT_ID); + return OrderConfigV4( + EvaluableV4(iInterpreter, iStore, LibTestAddOrder.VALID_ORDER_BYTECODE), inputs, outputs, bytes32(0), "", "" + ); + } + + function configHash() internal view returns (string memory) { + OrderConfigV4 memory config = orderConfig(); + return uint256( + LibOrder.hash(OrderV4(ACTOR, config.evaluable, config.validInputs, config.validOutputs, config.nonce)) + ).toHexString(); + } + + function raindexCheck() internal view returns (Check memory) { + return Check("raindex()", address(iRaindex).toHexString()); + } + + // Entrypoints. + + function doDeposit(TaskV2[] memory post) public { + vm.mockCall(address(iToken0), abi.encodeWithSelector(IERC20.transferFrom.selector), abi.encode(true)); + vm.prank(ACTOR); + iRaindex.deposit4(address(iToken0), VAULT_ID, LibDecimalFloat.packLossless(1, 0), post); + } + + function doWithdraw(TaskV2[] memory post) public { + doDeposit(new TaskV2[](0)); + vm.mockCall(address(iToken0), abi.encodeWithSelector(IERC20.transfer.selector), abi.encode(true)); + vm.prank(ACTOR); + iRaindex.withdraw4(address(iToken0), VAULT_ID, LibDecimalFloat.packLossless(1, 0), post); + } + + function doAddOrder(TaskV2[] memory post) public { + vm.prank(ACTOR); + iRaindex.addOrder4(orderConfig(), post); + } + + function doRemoveOrder(TaskV2[] memory post) public { + OrderConfigV4 memory config = orderConfig(); + vm.prank(ACTOR); + iRaindex.addOrder4(config, new TaskV2[](0)); + vm.prank(ACTOR); + iRaindex.removeOrder3( + OrderV4(ACTOR, config.evaluable, config.validInputs, config.validOutputs, config.nonce), post + ); + } + + function doEntask(TaskV2[] memory post) public { + vm.prank(ACTOR); + iRaindex.entask2(post); + } + + /// Takes an order whose calculate source is `calculate` and handle source is + /// `handle`, against a 10 token output vault. + function doTake(string memory calculate, string memory handle) public returns (OrderV4 memory order) { + vm.mockCall(address(iToken1), abi.encodeWithSelector(IERC20.transferFrom.selector), abi.encode(true)); + vm.prank(ACTOR); + iRaindex.deposit4(address(iToken1), VAULT_ID, LibDecimalFloat.packLossless(10, 0), new TaskV2[](0)); + + order = LibTestTakeOrder.addOrderWithExpression( + vm, + ACTOR, + bytes(string.concat("using-words-from ", address(iSubParser).toHexString(), "\n", calculate, handle)), + address(iToken0), + VAULT_ID, + address(iToken1), + VAULT_ID + ); + TakeOrdersConfigV5 memory config = LibTestTakeOrder.defaultTakeConfig(LibTestTakeOrder.wrapSingle(order)); + vm.mockCall(address(iToken0), abi.encodeWithSelector(IERC20.transferFrom.selector), abi.encode(true)); + vm.mockCall(address(iToken1), abi.encodeWithSelector(IERC20.transfer.selector), abi.encode(true)); + vm.prank(TAKER); + iRaindex.takeOrders4(config); + } + + // Families. + + function depositChecks() internal view returns (Check[] memory checks) { + checks = new Check[](7); + checks[0] = raindexCheck(); + checks[1] = Check("depositor()", ACTOR.toHexString()); + checks[2] = Check("deposit-token()", address(iToken0).toHexString()); + checks[3] = Check("deposit-vault-id()", uint256(VAULT_ID).toHexString()); + checks[4] = Check("deposit-vault-before()", "0"); + checks[5] = Check("deposit-vault-after()", "1"); + checks[6] = Check("deposit-token-decimals()", "18"); + } + + function withdrawChecks() internal view returns (Check[] memory checks) { + checks = new Check[](8); + checks[0] = raindexCheck(); + checks[1] = Check("withdrawer()", ACTOR.toHexString()); + checks[2] = Check("withdraw-token()", address(iToken0).toHexString()); + checks[3] = Check("withdraw-vault-id()", uint256(VAULT_ID).toHexString()); + checks[4] = Check("withdraw-vault-before()", "1"); + checks[5] = Check("withdraw-vault-after()", "0"); + checks[6] = Check("withdraw-target-amount()", "1"); + checks[7] = Check("withdraw-token-decimals()", "18"); + } + + function orderTaskChecks() internal view returns (Check[] memory checks) { + checks = new Check[](3); + checks[0] = raindexCheck(); + checks[1] = Check("order-hash()", configHash()); + checks[2] = Check("order-owner()", ACTOR.toHexString()); + } + + function entaskChecks() internal view returns (Check[] memory checks) { + checks = new Check[](1); + checks[0] = raindexCheck(); + } + + /// Order hash depends on the bytecode holding these checks, so + /// `testOrderEvalOrderHash` pins it separately. + function orderEvalChecks(bool handle) internal view returns (Check[] memory checks) { + checks = new Check[](16); + checks[0] = raindexCheck(); + checks[1] = Check("order-owner()", ACTOR.toHexString()); + checks[2] = Check("order-counterparty()", TAKER.toHexString()); + checks[3] = Check("order-clearer()", TAKER.toHexString()); + checks[4] = Check("calculated-max-output()", handle ? "1" : "0"); + checks[5] = Check("calculated-io-ratio()", handle ? "1" : "0"); + checks[6] = Check("input-token()", address(iToken0).toHexString()); + checks[7] = Check("input-token-decimals()", "18"); + checks[8] = Check("input-vault-id()", uint256(VAULT_ID).toHexString()); + checks[9] = Check("input-vault-before()", "0"); + checks[10] = Check("input-vault-increase()", handle ? "1" : "0"); + checks[11] = Check("output-token()", address(iToken1).toHexString()); + checks[12] = Check("output-token-decimals()", "18"); + checks[13] = Check("output-vault-id()", uint256(VAULT_ID).toHexString()); + checks[14] = Check("output-vault-before()", "10"); + checks[15] = Check("output-vault-decrease()", handle ? "1" : "0"); + } + + /// Words the order eval fills but `orderEvalChecks` cannot pin by value. + function orderEvalUnpinned(string memory word) internal pure returns (bool) { + return keccak256(bytes(word)) == keccak256("order-hash()"); + } + + // Task entrypoint runner. + + function checkTaskFamily(function(TaskV2[] memory) external run, Check[] memory checks) internal { + uint256 start = vm.snapshotState(); + run(task(ensures(checks))); + vm.revertToState(start); + string[] memory words = LibTestContextWords.allWords(); + for (uint256 i = 0; i < words.length; i++) { + if (inFamily(checks, words[i])) { + continue; + } + uint256 snapshot = vm.snapshotState(); + TaskV2[] memory post = task(string.concat(":set(0 ", words[i], ");")); + vm.expectRevert(stdError.indexOOBError); + run(post); + vm.revertToState(snapshot); + } + } + + function testDepositContextWords() external { + checkTaskFamily(this.doDeposit, depositChecks()); + } + + function testWithdrawContextWords() external { + checkTaskFamily(this.doWithdraw, withdrawChecks()); + } + + function testAddOrderContextWords() external { + checkTaskFamily(this.doAddOrder, orderTaskChecks()); + } + + function testRemoveOrderContextWords() external { + checkTaskFamily(this.doRemoveOrder, orderTaskChecks()); + } + + function testEntaskContextWords() external { + checkTaskFamily(this.doEntask, entaskChecks()); + } + + // Order eval runner. + + function checkOrderEvalFamily(bool handle) internal { + Check[] memory checks = orderEvalChecks(handle); + string memory body = ensures(checks); + if (handle) { + this.doTake("_ _:1 1;", body); + } else { + this.doTake(string.concat("_ _:1 1,", body), ":;"); + } + string[] memory words = LibTestContextWords.allWords(); + for (uint256 i = 0; i < words.length; i++) { + if (inFamily(checks, words[i]) || orderEvalUnpinned(words[i])) { + continue; + } + uint256 snapshot = vm.snapshotState(); + string memory read = string.concat(":set(0 ", words[i], ");"); + vm.expectRevert(stdError.indexOOBError); + if (handle) { + this.doTake("_ _:1 1;", read); + } else { + this.doTake(string.concat("_ _:1 1,", read), ":;"); + } + vm.revertToState(snapshot); + } + } + + function testCalculateOrderContextWords() external { + checkOrderEvalFamily(false); + } + + function testHandleIOContextWords() external { + checkOrderEvalFamily(true); + } + + /// The order hash word reads the hash of the order being evaluated, in both + /// calculate and handle IO. + function testOrderEvalOrderHash() external { + bytes32 orderHash = LibOrder.hash(this.doTake("_ _:1 1,:set(1 order-hash());", ":set(2 order-hash());")); + FullyQualifiedNamespace ns = + LibNamespace.qualifyNamespace(StateNamespace.wrap(uint256(uint160(ACTOR))), address(iRaindex)); + assertEq(iStore.get(ns, bytes32(uint256(1))), orderHash, "calculate order hash"); + assertEq(iStore.get(ns, bytes32(uint256(2))), orderHash, "handle io order hash"); + } +} diff --git a/test/lib/LibRaindexArb.finalizeArbContextWords.t.sol b/test/lib/LibRaindexArb.finalizeArbContextWords.t.sol new file mode 100644 index 0000000000..fa2e21f9ed --- /dev/null +++ b/test/lib/LibRaindexArb.finalizeArbContextWords.t.sol @@ -0,0 +1,72 @@ +// SPDX-License-Identifier: LicenseRef-DCL-1.0 +// SPDX-FileCopyrightText: Copyright (c) 2020 Rain Open Source Software Ltd +pragma solidity =0.8.25; + +import {Test} from "forge-std-1.17.0/src/Test.sol"; +import {stdError} from "forge-std-1.17.0/src/StdError.sol"; +import {Strings} from "@openzeppelin-contracts-5.7.0/utils/Strings.sol"; +import {EvaluableV4, SignedContextV1, TaskV2} from "raindex-interface-0.1.8/src/interface/IRaindexV6.sol"; +import {IInterpreterV4} from "rainlang-interface-0.2.13/src/interface/IInterpreterV4.sol"; +import {IInterpreterStoreV3} from "rainlang-interface-0.2.13/src/interface/IInterpreterStoreV3.sol"; +import {IParserV2} from "rainlang-interface-0.2.13/src/interface/IParserV2.sol"; +import { + LibTestInterpreterDeploy, + TEST_INTERPRETER_ADDRESS, + TEST_STORE_ADDRESS, + TEST_EXPRESSION_DEPLOYER_ADDRESS +} from "rainlang-0.2.19/test/lib/deploy/LibTestInterpreterDeploy.sol"; +import {LibTestArb} from "test/util/lib/LibTestArb.sol"; +import {LibEtchRaindex} from "test/util/lib/LibEtchRaindex.sol"; +import {LibTestContextWords} from "test/util/lib/LibTestContextWords.sol"; +import {LibRaindexDeploy} from "../../src/lib/deploy/LibRaindexDeploy.sol"; + +/// @title LibRaindexArbFinalizeArbContextWordsTest +/// @notice The post-arb task sees only the sender and the arb column: every +/// Raindex context word reverts out of bounds there. +contract LibRaindexArbFinalizeArbContextWordsTest is Test { + using Strings for address; + + function task(string memory body) internal returns (TaskV2 memory) { + LibTestInterpreterDeploy.etchTestRainlang(vm); + LibEtchRaindex.etchRaindex(vm); + bytes memory bytecode = IParserV2(TEST_EXPRESSION_DEPLOYER_ADDRESS) + .parse2( + bytes( + string.concat( + "using-words-from ", LibRaindexDeploy.SUB_PARSER_DEPLOYED_ADDRESS.toHexString(), "\n", body + ) + ) + ); + return TaskV2( + EvaluableV4(IInterpreterV4(TEST_INTERPRETER_ADDRESS), IInterpreterStoreV3(TEST_STORE_ADDRESS), bytecode), + new SignedContextV1[](0) + ); + } + + function arb(TaskV2 memory post) external { + LibTestArb.setupAndArb(vm, 80e18, 100e18, 100e18, 100e18, post, 0); + } + + function testArbTaskBaseColumnIsSenderOnly() external { + uint256 snapshot = vm.snapshotState(); + this.arb(task(string.concat(":ensure(equal-to(context<0 0>() ", address(this).toHexString(), ") \"sender\");"))); + vm.revertToState(snapshot); + TaskV2 memory post = task(":set(0 context<0 1>());"); + vm.expectRevert(stdError.indexOOBError); + this.arb(post); + } + + function testArbTaskRaindexWordsOutOfBounds() external { + string[] memory words = LibTestContextWords.allWords(); + for (uint256 i = 0; i < words.length; i++) { + if (keccak256(bytes(words[i])) == keccak256("context<7 0>()")) { + continue; + } + uint256 snapshot = vm.snapshotState(); + TaskV2 memory post = task(string.concat(":set(0 ", words[i], ");")); + vm.expectRevert(stdError.indexOOBError); + this.arb(post); + vm.revertToState(snapshot); + } + } +} diff --git a/test/lib/LibRaindexArb.finalizeArbTaskContext.t.sol b/test/lib/LibRaindexArb.finalizeArbTaskContext.t.sol index 849a85f685..2925b61256 100644 --- a/test/lib/LibRaindexArb.finalizeArbTaskContext.t.sol +++ b/test/lib/LibRaindexArb.finalizeArbTaskContext.t.sol @@ -17,8 +17,8 @@ import {LibTestArb, ArbResult} from "test/util/lib/LibTestArb.sol"; /// @title LibRaindexArbFinalizeArbTaskContextTest /// @notice Verifies that finalizeArb passes correct Float-encoded context to -/// the post-arb task: context<1 0>=input balance, context<1 1>=output balance, -/// context<1 2>=gas balance. Column 0 is the calling context added by LibContext. +/// the post-arb task: context<7 0>=input balance, context<7 1>=output balance, +/// context<7 2>=gas balance. Column 0 is the calling context added by LibContext. contract LibRaindexArbFinalizeArbTaskContextTest is Test { function testFinalizeArbTaskContextValues() external { LibTestInterpreterDeploy.etchTestRainlang(vm); @@ -32,9 +32,9 @@ contract LibRaindexArbFinalizeArbTaskContextTest is Test { bytes memory taskBytecode = parser.parse2( bytes( string.concat( - ":ensure(equal-to(context<1 0>() 20) \"input\"),", - ":ensure(equal-to(context<1 1>() 0) \"output\"),", - ":ensure(equal-to(context<1 2>() 0) \"gas\");" + ":ensure(equal-to(context<7 0>() 20) \"input\"),", + ":ensure(equal-to(context<7 1>() 0) \"output\"),", + ":ensure(equal-to(context<7 2>() 0) \"gas\");" ) ) ); @@ -57,7 +57,7 @@ contract LibRaindexArbFinalizeArbTaskContextTest is Test { assertEq(result.outputToken.balanceOf(address(result.arb)), 0, "arb outputToken"); } - /// Companion to the above: the output (context<1 1>) and gas (context<1 2>) + /// Companion to the above: the output (context<7 1>) and gas (context<7 2>) /// columns must carry the correct NON-ZERO Floats, not just zero. The /// sibling test only ever sees zero output/gas, so a mutation zeroing either /// column would survive it. Here input profit is zero while output profit is @@ -72,9 +72,9 @@ contract LibRaindexArbFinalizeArbTaskContextTest is Test { bytes memory taskBytecode = parser.parse2( bytes( string.concat( - ":ensure(equal-to(context<1 0>() 0) \"input\"),", - ":ensure(equal-to(context<1 1>() 20) \"output\"),", - ":ensure(equal-to(context<1 2>() 1) \"gas\");" + ":ensure(equal-to(context<7 0>() 0) \"input\"),", + ":ensure(equal-to(context<7 1>() 20) \"output\"),", + ":ensure(equal-to(context<7 2>() 1) \"gas\");" ) ) ); diff --git a/test/util/fixture/LibRaindexSubParserContextFixture.sol b/test/util/fixture/LibRaindexSubParserContextFixture.sol index f0074e3e25..6694134476 100644 --- a/test/util/fixture/LibRaindexSubParserContextFixture.sol +++ b/test/util/fixture/LibRaindexSubParserContextFixture.sol @@ -8,15 +8,11 @@ import { WORD_ORDER_HASH, WORD_ORDER_OWNER, WORD_ORDER_COUNTERPARTY, - CONTEXT_COLUMNS, - CONTEXT_BASE_ROWS, - CONTEXT_BASE_ROW_SENDER, - CONTEXT_BASE_ROW_CALLING_CONTRACT, CONTEXT_CALLING_CONTEXT_ROWS, CONTEXT_CALLING_CONTEXT_ROW_ORDER_HASH, CONTEXT_CALLING_CONTEXT_ROW_ORDER_OWNER, CONTEXT_CALLING_CONTEXT_ROW_ORDER_COUNTERPARTY, - CONTEXT_BASE_COLUMN, + CONTEXT_CALLING_CONTEXT_ROW_ORDER_CLEARER, CONTEXT_CALLING_CONTEXT_COLUMN, CONTEXT_CALCULATIONS_COLUMN, CONTEXT_CALCULATIONS_ROWS, @@ -45,20 +41,24 @@ import { CONTEXT_SIGNED_CONTEXT_SIGNERS_COLUMN, CONTEXT_SIGNED_CONTEXT_START_COLUMN } from "../../../src/lib/LibRaindexSubParser.sol"; +import { + CONTEXT_BASE_COLUMN, + CONTEXT_BASE_ROWS, + CONTEXT_BASE_ROW_CALLING_CONTRACT +} from "rainlang-interface-0.2.13/src/lib/caller/LibContext.sol"; library LibRaindexSubParserContextFixture { function hashedNamesContext() internal pure returns (bytes32[][] memory) { - // Add 3 to account for the signers and 2x signed context columns. - bytes32[][] memory context = new bytes32[][](CONTEXT_COLUMNS + 3); + bytes32[][] memory context = new bytes32[][](CONTEXT_SIGNED_CONTEXT_START_COLUMN + 2); bytes32[] memory contextBase = new bytes32[](CONTEXT_BASE_ROWS); - contextBase[CONTEXT_BASE_ROW_SENDER] = keccak256(WORD_ORDER_CLEARER); contextBase[CONTEXT_BASE_ROW_CALLING_CONTRACT] = keccak256(WORD_RAINDEX); bytes32[] memory contextCallingContext = new bytes32[](CONTEXT_CALLING_CONTEXT_ROWS); contextCallingContext[CONTEXT_CALLING_CONTEXT_ROW_ORDER_HASH] = keccak256(WORD_ORDER_HASH); contextCallingContext[CONTEXT_CALLING_CONTEXT_ROW_ORDER_OWNER] = keccak256(WORD_ORDER_OWNER); contextCallingContext[CONTEXT_CALLING_CONTEXT_ROW_ORDER_COUNTERPARTY] = keccak256(WORD_ORDER_COUNTERPARTY); + contextCallingContext[CONTEXT_CALLING_CONTEXT_ROW_ORDER_CLEARER] = keccak256(WORD_ORDER_CLEARER); bytes32[] memory contextCalculations = new bytes32[](CONTEXT_CALCULATIONS_ROWS); contextCalculations[CONTEXT_CALCULATIONS_ROW_MAX_OUTPUT] = keccak256(WORD_CALCULATED_MAX_OUTPUT); diff --git a/test/util/lib/LibTestContextWords.sol b/test/util/lib/LibTestContextWords.sol new file mode 100644 index 0000000000..c90ff96827 --- /dev/null +++ b/test/util/lib/LibTestContextWords.sol @@ -0,0 +1,42 @@ +// SPDX-License-Identifier: LicenseRef-DCL-1.0 +// SPDX-FileCopyrightText: Copyright (c) 2020 Rain Open Source Software Ltd +pragma solidity ^0.8.25; + +/// @dev Every Raindex context word, and a raw read of the arb column, as +/// rainlang call expressions. +library LibTestContextWords { + function allWords() internal pure returns (string[] memory words) { + words = new string[](31); + words[0] = "raindex()"; + words[1] = "order-hash()"; + words[2] = "order-owner()"; + words[3] = "order-counterparty()"; + words[4] = "order-clearer()"; + words[5] = "calculated-max-output()"; + words[6] = "calculated-io-ratio()"; + words[7] = "input-token()"; + words[8] = "input-token-decimals()"; + words[9] = "input-vault-id()"; + words[10] = "input-vault-before()"; + words[11] = "input-vault-increase()"; + words[12] = "output-token()"; + words[13] = "output-token-decimals()"; + words[14] = "output-vault-id()"; + words[15] = "output-vault-before()"; + words[16] = "output-vault-decrease()"; + words[17] = "depositor()"; + words[18] = "deposit-token()"; + words[19] = "deposit-vault-id()"; + words[20] = "deposit-vault-before()"; + words[21] = "deposit-vault-after()"; + words[22] = "deposit-token-decimals()"; + words[23] = "withdrawer()"; + words[24] = "withdraw-token()"; + words[25] = "withdraw-vault-id()"; + words[26] = "withdraw-vault-before()"; + words[27] = "withdraw-vault-after()"; + words[28] = "withdraw-target-amount()"; + words[29] = "withdraw-token-decimals()"; + words[30] = "context<7 0>()"; + } +} From e464be1d2e9815fd3ce814374c9459b39c87b165 Mon Sep 17 00:00:00 2001 From: David Meister Date: Mon, 26 Oct 2026 13:55:15 +0000 Subject: [PATCH 3/3] Revert arb post-task context to main's shape; drop arb column The dex sub parser is for the dex. The post-arb task keeps main's context: balances in column 1, full base column. CALLING_CONTEXT_COLUMNS drops to 6; signers and signed context derive from CONTEXT_COLUMNS (7, 8+). Co-Authored-By: Claude Opus 5.5 --- crates/test_fixtures/abis/RaindexV6.json | 2 +- .../abis/RaindexV6SubParser.json | 2 +- src/generated/RaindexV6SubParserPointers.sol | 6 +- .../GenericPoolRaindexV6ArbOrderTaker.sol | 10 +-- .../GenericPoolRaindexV6FlashBorrower.sol | 10 +-- src/generated/candidate/RaindexV6.sol | 8 +-- .../candidate/RaindexV6SubParser.sol | 8 +-- .../RouteProcessorRaindexV6ArbOrderTaker.sol | 10 +-- src/lib/LibRaindex.sol | 43 +++-------- src/lib/LibRaindexArb.sol | 7 +- src/lib/LibRaindexSubParser.sol | 2 +- .../RaindexV6ArbOrderTaker.context.t.sol | 6 +- ...ndexV6ArbOrderTaker.finalizeDecimals.t.sol | 6 +- ...ndexV6FlashBorrower.finalizeDecimals.t.sol | 14 ++-- ...dexV6SubParser.operandHandlersWiring.t.sol | 13 ++-- .../parser/RaindexV6SubParser.routing.t.sol | 26 +++---- ...bParser.routingTokenDecimalsAndMasks.t.sol | 2 +- .../parser/RaindexV6SubParser.signers.t.sol | 2 +- ...ibRaindexArb.finalizeArbContextWords.t.sol | 72 ------------------- ...LibRaindexArb.finalizeArbTaskContext.t.sol | 18 ++--- test/util/lib/LibTestContextWords.sol | 9 ++- 21 files changed, 91 insertions(+), 185 deletions(-) delete mode 100644 test/lib/LibRaindexArb.finalizeArbContextWords.t.sol diff --git a/crates/test_fixtures/abis/RaindexV6.json b/crates/test_fixtures/abis/RaindexV6.json index 4b99e96c55..b3fc4f9bc6 100644 --- a/crates/test_fixtures/abis/RaindexV6.json +++ b/crates/test_fixtures/abis/RaindexV6.json @@ -2362,7 +2362,7 @@ } ], "bytecode": { - "object": "0x6080806040523460395760017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00556151c2908161003e8239f35b5f80fdfe6080806040526004361015610012575f80fd5b5f3560e01c90816301ffc9a714611792575080631f69cb751461155c5780632cb77e9f146115305780632fbc4ba0146113ce57806341d1514f146113975780635cffe9de1461123b578063607461191461109f578063613255ab1461101c57806369c728561461072b578063709fb8a5146104375780639235084d146103e3578063ac9650d814610295578063d7e442ec14610237578063d9d98ce4146101865763fa501182146100c1575f80fd5b34610182576101403660031901126101825767ffffffffffffffff600435818111610182576100f4903690600401611b44565b6024358281116101825761010c903690600401611b44565b60c0366043190112610182576101043583811161018257610131903690600401611cea565b90610124359384116101825761014e61015c943690600401611cea565b926101576126da565b612220565b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055005b5f80fd5b34610182576040366003190112610182576001600160a01b036101a7611816565b166040516370a0823160e01b8152306004820152602081602481855afa90811561022c575f916101fa575b50156101e25760206040515f8152f35b60249060405190633c5bf76960e21b82526004820152fd5b90506020813d602011610224575b81610215602093836119b3565b810103126101825751826101d2565b3d9150610208565b6040513d5f823e3d90fd5b346101825760203660031901126101825760043567ffffffffffffffff81116101825761028f61026e61015c9236906004016117e5565b91906102786126da565b6040519261028584611997565b5f84523691611dbe565b90612991565b34610182576020806003193601126101825760043567ffffffffffffffff8111610182576102c79036906004016117e5565b9190604051926102d684611997565b5f84528284016102e582611a97565b946102f360405196876119b3565b8286526102ff83611a97565b9361031186880195601f190186612204565b5f5b84811061037557604080518881528951818a018190525f92600582901b83018101918a918c9085015b8287106103495785850386f35b909192938280610365600193603f198a820301865288516118a2565b960192019601959291909261033c565b806103c4886103be61039160019560059d9c9d1b8701876120e4565b929089846040519586938585013782018381015f81528b519283915e015f838201520380845201826119b3565b30613a32565b6103ce828a611fca565b526103d98189611fca565b5001969596610313565b3461018257600319602036820112610182576004359067ffffffffffffffff82116101825760809082360301126101825761042260609160040161212c565b90604051921515835260208301526040820152f35b34610182576003196040368201126101825760043567ffffffffffffffff8082116101825760c08260040193833603011261018257602435908111610182576104849036906004016117e5565b61048f9291926126da565b6104c06104bb6104b66104af6104a58880612117565b60408101906120e4565b36916119d5565b6139c8565b613a1d565b801561071957600110156107075760248201926104dd8486611f27565b9050156106f55760448301936104f38587611f27565b9050156106e3576105596105219561054d6105186105118a80612117565b948a611f27565b9890928a611f27565b91909261053e60405196610534886118c6565b3388523690611a39565b9960209a8b8801523691611aaf565b60408501523691611aaf565b6060820152606484013560808201526105718161271c565b90815f525f865260405f209485541595866105b5575b878760017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055604051908152f35b6001905560a46001600160a01b03917f87491344dfbcf91f6cbbc610cbbeedc85313d37a02df0c93527f7ea5f8db717f83855116604051908152868b82015260606040820152806106096060820188612032565b0390a10191610618838a6120e4565b905061063b575b50505061062e9394955061274d565b8190838080808080610587565b6106486104af848b6120e4565b610651816147b9565b156106bc57509761068f7fd46c2c56b35c8210e9e712ec3f02242d5fc90187c0ac8ed80cc33626846ec369936106af9361062e999a9b5116926120e4565b92906040519384938452868c850152606060408501526060840191611d19565b0390a1859493878061061f565b886106df604051928392630c89984b60e31b8452600484015260248301906118a2565b0390fd5b60405163540e5f0b60e01b8152600490fd5b604051636c44ef8f60e01b8152600490fd5b604051633c8270bd60e21b8152600490fd5b604051632cff108b60e21b8152600490fd5b34610182576003196020368201126101825767ffffffffffffffff600435116101825760c09060043536030112610182576107646126da565b5f808061077960048035608481019101611e70565b90501561100a576024600435013592610791846127dd565b15610ff8576060806040516107a58161192e565b6107ad611ec5565b81525f60208201525f604082015201526107c5611ec5565b506108256108206107ff6107f56107ef6107e9608460043501600435600401611e70565b90611ef7565b80611f12565b6040810190611f27565b60206108186107e9608460043501600435600401611e70565b013591611f5d565b611d05565b936001600160a01b0361087461082061085b6108516107ef6107e9608460043501600435600401611e70565b6060810190611f27565b60406108186107e9608460043501600435600401611e70565b8160405197610882896118f6565b16875216602086015260408501526108a4608460043501600435600401611e70565b9490506001604051955f87520160051b85016040525f905f5b6108d1608460043501600435600401611e70565b9050811080610fe5575b15610e32576108f4608460043501600435600401611e70565b821015610e1e578160051b810135607e198236030181121561018257608081830136031261018257604051916109298361192e565b8181013567ffffffffffffffff81116101825761094b90369084840101611b44565b835280820160208181013590850152604080820135908501526060013567ffffffffffffffff8111610182576109849236920101611cea565b606082015280516001600160a01b036109a66040830151602085015190611fca565b5151166001600160a01b0385511614801590610dea575b610dd8576109d5602083015160408401519083612ed1565b6109de8161271c565b91825f525f60205260405f2054155f14610a42575051604080513381526001600160a01b039092166020830152810191909152600191907fb70c12fa453793fa6818ec07c91e74363a47aa6a6829dcd9533937fdf30314f390606090a15b016108bd565b9190610a73602084979597015160408501519060608601519060405192610a6884611997565b5f8452339186613102565b925f93610a8b60608201516044600435013590612800565b15610af257505051604080513381526001600160a01b03909216602083015281019190915260019291907fe3151dc8cb7a54ffc4baabd28c1f241c94d510b5e5b502491ac3cad6c16316d590606090a15b8115610aea575b5092610a3c565b905088610ae3565b610aff60408201516127dd565b158015610dc5575b15610b5c57505051604080513381526001600160a01b03909216602083015281019190915260019291907f500b713857325f9e6dcb52ae832eca9109d107ed1aae9cb4928b4c1e13f051aa90606090a1610adc565b9250925050600196959691610b75606460043501611fde565b15610d325796610be597610bf560408401516040880151610b968183613461565b15610d2a5750925b610bef848592610bd8610bd260608a01516001600160e01b03601b918660e01d92828816810b928260e01d9216900b613e72565b9061402d565b9d8e9260408d015161352c565b60408c0152613556565b99613556565b98610c008484613580565b610c0a84826135de565b60405192338452608060208501526060610c308451608080880152610100870190612032565b93602081015160a0870152604081015160c0870152015192607f198582030160e0860152835180825260208201906020808260051b8501019601925f5b828110610ccc57505050505092806001979695937f194f1feb3b4d7076a2c272e774e792e0c48bb8c7aa1a9a3671c1cd6da9e6b4c193610cc796604084015260608301520390a180858c5101808d5260051b8c0152613731565b610adc565b9091929396602080610d1d600193601f198782030189528b51906001600160a01b0382511681526040610d0c8584015160608785015260608401906120b1565b9201519060408184039101526118a2565b9901950193929101610c6d565b905092610b9e565b610be590610bf56060840151610bef610d70610bd260408801516001600160e01b0394601b90868360e01d9316820b91878260e01d9216900b613e72565b60408a0151610d7f8183613461565b15610dbd5750915b829c8d916060890151908116155f14610dae575060408801515b96879460408d015161352c565b610db89085613488565b610da1565b905091610d87565b50610dd3606082015161343e565b610b07565b60405163936bb5ad60e01b8152600490fd5b506001600160a01b03610e066060830151604085015190611fca565b5151166001600160a01b0360208601511614156109bd565b634e487b7160e01b5f52603260045260245ffd5b50919390610e44606460043501611fde565b15610fdf57835b6004356004013590610e5d8282613461565b610fc15750508490610e7d856001600160a01b0360208701511633612e68565b505060a46004350190610e95826004356004016120e4565b905015159081610fb9575b50610f18575b506001600160a01b03610ebc9293511633612827565b50505b8351811015610ee45780610ede610ed860019387611fca565b5161390a565b01610ebf565b5060409160017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f005582519182526020820152f35b90506001600160a01b03602084015116610f426001600160a01b03855116926004356004016120e4565b929091333b1561018257610f8a5f93604051958694859463691f9ed760e01b8652600486015260248501528960448501528a606485015260a0608485015260a4840191611d19565b038183335af190811561022c57859115610ea6579050610faa915061194a565b5f836001600160a01b03610ea6565b905088610ea0565b604492506040519163573b6f4160e01b835260048301526024820152fd5b84610e4b565b50610ff360408301516127dd565b6108db565b60405163315f9e2360e21b8152600490fd5b604051639c95219f60e01b8152600490fd5b3461018257602080600319360112610182576024816001600160a01b03611041611816565b16604051928380926370a0823160e01b82523060048301525afa90811561022c575f91611072575b50604051908152f35b90508181813d8311611098575b61108981836119b3565b81010312610182575182611069565b503d61107f565b34610182576110ad36611856565b6110b56126da565b6110c08486336127a9565b6110c9836127dd565b1561120e576110d9848633612b9b565b6110e38185613461565b15611208575082935b6110f885828833612e0a565b9690947f8045c25080b0868951141ed0a91720bcad09a8364a2b3109ee1fd49c1f0bc8b860c0611129898533612e68565b94906001600160a01b0360405192338452169a8b6020840152876040840152856060840152608083015260a0820152a1836111845760017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055005b6111fb9761028f9660ff946040519960078b5260208b015260408a01526060890152608088015260a08701521660c08501523360e0850152610100840193846040526111cf8561197a565b600785526111e061012082016121e8565b6111e985611fba565b526111f384611fba565b503691611dbe565b808080808080808061015c565b936110ec565b604051623a3a4d60e21b81523360048201526001600160a01b038616602482015260448101859052606490fd5b34610182576080366003190112610182576004356001600160a01b03908181168091036101825761126a61182c565b6044359167ffffffffffffffff916064358381116101825736602382011215610182578060040135938411610182573660248583010111610182576112f79560209216936112b9868587612d2b565b60405196879283926323e30c8b60e01b84523360048501528760248501528860448501525f606485015260a06084850152602460a485019201611d19565b03815f855af193841561022c575f94611363575b507f439148f0bbc682ca079e46d6e2c2f0c1e3b820f1a291b069d8882abf8cf18dd9840361134a5761133f93503091612da4565b602060405160018152f35b604051630b6c58a960e31b815260048101859052602490fd5b9093506020813d60201161138f575b8161137f602093836119b3565b810103126101825751928461130b565b3d9150611372565b346101825760603660031901126101825760206113c66113b5611816565b6113bd61182c565b60443591612b9b565b604051908152f35b34610182576113dc36611856565b839493926113e86126da565b6113f38486336127a9565b6113fc816127dd565b15611502578061141061145f928733612827565b9590967f7f9dfa19cf1cc2f806f2f860fbc9c056b601fb1afc0e9b843dfe5c63616268e660806040513381526001600160a01b0384169a8b60208301528560408301526060820152a1336128cd565b9590938261148d5760017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055005b6114f69661028f9560ff936040519860068a5260208a01526040890152606088015260808701521660a08501523360c085015260e0840193846040526114d28561197a565b600785526114e361010082016121e8565b6114ec85611faa565b526111f384611faa565b8080808080808061015c565b6040516306dde9c360e41b81523360048201526001600160a01b038616602482015260448101859052606490fd5b34610182576020366003190112610182576004355f525f6020526020600160405f205414604051908152f35b3461018257600319604036820112610182576004359067ffffffffffffffff808311610182578260040160a08436039384011261018257602435828111610182576115ab9036906004016117e5565b906115b46126da565b5f946001600160a01b0394856115c986611d05565b163303611770576115e26115dd3687611b44565b61271c565b91825f525f60205260405f2096600188541461162a575b60208960017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00556040519015158152f35b9091929394959697505f6001985560405191338352846020840152606060408401528161165689611842565b16606084015260248a013590606219018112156101825789019060a060808401528061168460048401611842565b1661010084015261169760248301611842565b1661012083015260448101356022198236030181121561018257019560246004880135970192871161018257863603831361018257602098608461175384936117127f09d18501db0080ca2d6cd7c17fa7255daff4b2d503ea93b76ff68b6752ea8e63976117639c6060610140890152610160880191611d19565b6117446117396117256044880185611d39565b605f198a8603810160a08c01529491611d6e565b926064870190611d39565b918784030160c0880152611d6e565b91013560e08301520390a161274d565b82808080808080806115f9565b60248661177c87611d05565b6040516335252be360e01b815291166004820152fd5b34610182576020366003190112610182576004359063ffffffff60e01b82168092036101825760209163e414309160e01b81149081156117d4575b5015158152f35b6301ffc9a760e01b149050836117cd565b9181601f840112156101825782359167ffffffffffffffff8311610182576020808501948460051b01011161018257565b600435906001600160a01b038216820361018257565b602435906001600160a01b038216820361018257565b35906001600160a01b038216820361018257565b906080600319830112610182576004356001600160a01b0381168103610182579160243591604435916064359067ffffffffffffffff82116101825761189e916004016117e5565b9091565b805180835260209291819084018484015e5f828201840152601f01601f1916010190565b60a0810190811067ffffffffffffffff8211176118e257604052565b634e487b7160e01b5f52604160045260245ffd5b6060810190811067ffffffffffffffff8211176118e257604052565b6040810190811067ffffffffffffffff8211176118e257604052565b6080810190811067ffffffffffffffff8211176118e257604052565b67ffffffffffffffff81116118e257604052565b60e0810190811067ffffffffffffffff8211176118e257604052565b610100810190811067ffffffffffffffff8211176118e257604052565b6020810190811067ffffffffffffffff8211176118e257604052565b90601f8019910116810190811067ffffffffffffffff8211176118e257604052565b92919267ffffffffffffffff82116118e257604051916119ff601f8201601f1916602001846119b3565b829481845281830111610182578281602093845f960137010152565b9080601f8301121561018257816020611a36933591016119d5565b90565b91906060838203126101825760405190611a52826118f6565b8193611a5d81611842565b8352611a6b60208201611842565b602084015260408101359167ffffffffffffffff831161018257604092611a929201611a1b565b910152565b67ffffffffffffffff81116118e25760051b60200190565b929192611abb82611a97565b604092611acb60405192836119b3565b819581835260208093019160061b84019381851161018257915b848310611af457505050505050565b8583830312610182578386918251611b0b81611912565b611b1486611842565b81528286013583820152815201920191611ae5565b9080601f8301121561018257816020611a3693359101611aaf565b91909160a0818403126101825760405190611b5e826118c6565b8193611b6982611842565b835267ffffffffffffffff9160208101358381116101825782611b8d918301611a39565b602085015260408101358381116101825782611baa918301611b29565b6040850152606081013592831161018257611bcb6080939284938301611b29565b60608501520135910152565b909291611be384611a97565b916040611bf360405194856119b3565b839580855260208095019160059160051b8401948086116101825784935b868510611c22575050505050505050565b67ffffffffffffffff90853582811161018257870190606082850312610182578451611c4d816118f6565b611c5683611842565b81528a83013584811161018257830185601f8201121561018257803590611c7c82611a97565b91611c89895193846119b3565b8083528d808401918b1b83010191888311610182578e809101915b838310611cda57509150508201528583013593841161018257611ccb858c95869501611a1b565b86820152815201940193611c11565b82358152918101918f9101611ca4565b9080601f8301121561018257816020611a3693359101611bd7565b356001600160a01b03811681036101825790565b908060209392818452848401375f828201840152601f01601f1916010190565b9035601e198236030181121561018257016020813591019167ffffffffffffffff8211610182578160061b3603831361018257565b9190808252602080920192915f905b828210611d8b575050505090565b909192936001906001600160a01b03611da387611842565b16815285830135838201526040908101950193920190611d7d565b90929192611dcb81611a97565b91604091611ddc60405194856119b3565b839581855260208095019160051b8301938185116101825783925b858410611e075750505050505050565b67ffffffffffffffff908435828111610182578601908382860312610182578351611e3181611912565b82358481116101825786611e46918501611a39565b81528983013593841161018257611e61868b95869501611cea565b83820152815201930192611df7565b903590601e1981360301821215610182570180359067ffffffffffffffff821161018257602001918160051b3603831361018257565b60405190611eb3826118f6565b60606040835f81525f60208201520152565b60405190611ed2826118c6565b5f608083828152611ee1611ea6565b6020820152606060408201526060808201520152565b9015610e1e57803590607e1981360301821215610182570190565b903590609e1981360301821215610182570190565b903590601e1981360301821215610182570180359067ffffffffffffffff821161018257602001918160061b3603831361018257565b9190811015610e1e5760061b0190565b805115610e1e5760200190565b805160011015610e1e5760400190565b805160021015610e1e5760600190565b805160031015610e1e5760800190565b805160041015610e1e5760a00190565b805160051015610e1e5760c00190565b8051821015610e1e5760209160051b010190565b3580151581036101825790565b9081518082526020808093019301915f5b82811061200a575050505090565b835180516001600160a01b031686528201518583015260409094019392810192600101611ffc565b906080806120a861209661208460406001600160a01b0380895116885260208901519060a060208a01528082511660a08a015260208201511660c08901520151606060e08801526101008701906118a2565b60408701518682036040880152611feb565b60608601518582036060870152611feb565b93015191015290565b9081518082526020808093019301915f5b8281106120d0575050505090565b8351855293810193928101926001016120c2565b903590601e1981360301821215610182570180359067ffffffffffffffff82116101825760200191813603831361018257565b903590605e1981360301821215610182570190565b6121436115dd61213c8380611f12565b3690611b44565b5f525f602052600160405f2054036121df5780612163816121cf93611f12565b6121c76121826121876020850135938460408701359384923690611b44565b612ed1565b61219f6121948580611f12565b946060810190611e70565b92906121bf604051966121b188611997565b5f88525f3681373690611b44565b933691611bd7565b923392613102565b6040810151606090910151600192565b505f905f905f90565b5f5b60e081106121f6575050565b6060828201526020016121ea565b5f5b82811061221257505050565b606082820152602001612206565b926001600160a01b038451166001600160a01b03835116146126c8576001600160a01b03612255606086015160643590611fca565b515116906040830151916001600160a01b036122746084358095611fca565b51511614801590612688575b610dd8576040850151906001600160a01b0361229f6044358094611fca565b5151166001600160a01b036122ba60643560608a0151611fca565b51511614612676576122cb8661271c565b805f525f60205260405f20541561262357506122e68461271c565b805f525f60205260405f2054156125cf57506123c992916123a3917f6fa7f4c28634b0a9d6831401c45ae468195fb63aed07308935c35374ff5d9e396040518061234e61234061012033845280602085015283018d612032565b82810360408401528a612032565b85606083015260643560808301528760a083015260a43560c083015260c43560e083015260e4356101008301520390a16001600160a01b038651166040519261239684611997565b5f8452606435908a613102565b936001600160a01b03865116604051926123bc84611997565b5f845260a4359086613102565b916123d760408201516127dd565b1580156125bb575b80156125a8575b8015612595575b61258357604051916123fe8361192e565b5f83525f60208401525f60408401525f606084015261241d84836147dd565b8452604084015261244361243183866147dd565b6020860152806060860152845161352c565b94612457602085015160408601519061352c565b936124618761343e565b8015612574575b6125625761252961255b957fd9fa84dd790c969daa5c33d8050dc06b4a9b59d5b42e2be5f5e8ae20447f618d9461250b6125609a60a0966124aa8a8851613580565b6124b88c6020890151613580565b6124c68a60408901516135de565b6124d48c60608901516135de565b6124dd8a61390a565b6124e68c61390a565b6001600160a01b0361250260c435926060606435910151611fca565b515116336128cd565b50506001600160a01b0361250260e43592606060a435910151611fca565b5050606060405191338352805160208401526020810151604084015260408101518284015201516080820152a1613731565b613731565b565b604051630d86822160e01b8152600490fd5b5061257e8561343e565b612468565b6040516321badf1f60e01b8152600490fd5b506125a3606084015161343e565b6123ed565b506125b6606082015161343e565b6123e6565b506125c960408401516127dd565b156123df565b9351604080513381526001600160a01b039092166020830152810194909452507fb70c12fa453793fa6818ec07c91e74363a47aa6a6829dcd9533937fdf30314f3945091925082915050606081015b0390a1565b9551604080513381526001600160a01b039092166020830152810196909652507fb70c12fa453793fa6818ec07c91e74363a47aa6a6829dcd9533937fdf30314f39493508392505060608201905061261e565b604051631cd2f1c760e21b8152600490fd5b506001600160a01b036126a2606085015160a43590611fca565b5151166001600160a01b036126be604088015160443590611fca565b5151161415612280565b604051630a98f1f360e21b8152600490fd5b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00600281541461270a5760029055565b604051633ee5aeb560e01b8152600490fd5b604051612747816127396020820194602086526040830190612032565b03601f1981018352826119b3565b51902090565b612560929161277861028f923390919060405192600284526020840152604083015260608201604052565b92604051936127868561197a565b60078552612796602086016121e8565b61279f85611f6d565b526111f384611f6d565b9091156127b4575050565b6040516305dbdfd960e41b81526001600160a01b03918216600482015291166024820152604490fd5b6127fc905f60e01d906001600160e01b038160e01d9116601b0b614840565b1290565b906127fc916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b6148c1565b92919261283382613b05565b9361283d8161343e565b6128bb5784816001600160e01b0361285c9360e01d9116601b0b614940565b9290809315612892575b50829081612876575b5050509190565b61288a926001600160a01b03309216612da4565b5f818161286f565b9092505f1981146128a757600101915f612866565b634e487b7160e01b5f52601160045260245ffd5b604051632eaefac360e21b8152600490fd5b939291936128da8361343e565b61297857846128f6576128ee939450612e68565b50505f905f90565b6001600160a01b039392919380911694855f52602060018152604092835f20961695865f528152825f20825f528152612933835f20549485613556565b9561293d8761343e565b612960575f97885260018252838820908852815282872091875252909320829055565b835163c5e12af560e01b815260048101889052602490fd5b60405163793a8f5560e01b815260048101849052602490fd5b6040805192936129a08461197a565b6007845260206129b18186016121e8565b5f5b84518110156129e657806129c960019287611fca565b516129d48289611fca565b526129df8188611fca565b50016129b3565b50925092939093335f52308352845f2092855191612a0383611912565b612a0b611ea6565b835260608281940152865193612a2085611997565b5f8552875190612a2f82611997565b5f82525f3681375f5b8151811015612b8f57612a4b8183611fca565b51908a8251015151612a62575b6001915001612a38565b8a89875f612a73828701518a613c40565b938651946001600160a01b0394828680895116968901511697015190835197612a9b8961195e565b88528d88015282870152828d87015260808601528c60a08601528860c086015251809263d04dfe2360e01b82528180612ad860049889830161304a565b03915afa948515612b855789915f96612b5f575b508551612afd575b50505050612a58565b5101511692833b1561018257612b2b935f92838f5180978195829463012c676d60e21b8452339084016136f0565b03925af1918215612b5557600192612b46575b808781612af4565b612b4f9061194a565b5f612b3e565b8b513d5f823e3d90fd5b612b7c9196503d805f833e612b7481836119b3565b810190612f06565b9050945f612aec565b8e513d5f823e3d90fd5b50505050505050509050565b8215612bd0576001600160a01b038091165f52600160205260405f2091165f5260205260405f20905f5260205260405f205490565b909150612bdc82613be4565b6001600160a01b03809316906040918251946370a0823160e01b86528416938460048701526020928387602481865afa968715612cf2575f97612cfc575b5083612c33612c2c83612c639a614a6c565b5090614280565b508651636eb1769f60e11b81526001600160a01b0390941660048501523060248501529297889081906044820190565b0381865afa968715612cf2575f97612cc1575b50612c2c612c8791611a3698614a6c565b50612c928183613461565b15612cb95750935b5f5260018252825f20905f528152815f20905f8052525f205490613556565b905093612c9a565b96508387813d8311612ceb575b612cd881836119b3565b8101031261018257955195612c2c612c76565b503d612cce565b85513d5f823e3d90fd5b96508387813d8311612d24575b612d1381836119b3565b810103126101825795519583612c1a565b503d612d09565b6040519263a9059cbb60e01b5f526001600160a01b0380931660045260245260205f60448180855af160015f5114811615612d85575b8360405215612d6f57505050565b635274afe760e01b835216600482015260249150fd5b6001811516612d9b57813b15153d151616612d61565b833d5f823e3d90fd5b9092604051936323b872dd60e01b5f526001600160a01b0393848092166004521660245260445260205f60648180855af160015f5114811615612df4575b836040525f60605215612d6f57505050565b6001811516612d9b57813b15153d151616612de2565b93929193612e178361343e565b6129785784612e2b576128ee939450612827565b6001600160a01b039392919380911694855f52602060018152604092835f20961695865f528152825f20825f528152612933835f2054948561352c565b90929192612e7581613b05565b93612e7f8161343e565b612ebf5784816001600160e01b03612e9e9360e01d9116601b0b614940565b50809281612ead575050509190565b6001600160a01b0361288a9316612d2b565b604051632d1671a360e11b8152600490fd5b91612efc906060612ef1936001600160a01b039485916040880151611fca565b515116940151611fca565b5151161461267657565b919060408382031261018257825167ffffffffffffffff908181116101825784019082601f83011215610182578151602092612f4182611a97565b91612f4f60405193846119b3565b808352848084019160051b830101918683116101825785809101915b838310612fde5750505050948281015191821161018257019180601f84011215610182578251612f9a81611a97565b93612fa860405195866119b3565b818552838086019260051b820101928311610182578301905b828210612fcf575050505090565b81518152908301908301612fc1565b8251815291810191869101612f6b565b90808251908181526020809101926020808460051b8301019501935f915b84831061301c5750505050505090565b909192939495848061303a600193601f198682030187528a516120b1565b980193019301919493929061300c565b91906020928381526001600160a01b0382511684820152838201516040820152613084604083015160e060608401526101008301906118a2565b90606083015160808201526130ab608084015192601f1993848483030160a0850152612fee565b9260a081015193838382030160c08401528680865192838152019501905f5b8181106130ee57505050611a3694955060c060e091015192828503019101526120b1565b8251875295880195918801916001016130ca565b949193613347919360c0915f6132ce6040928351946131208661195e565b613128611ec5565b86526020958487820152848682015260609781868a809401528260808201528660a0820152015261327e85519161315e8361197a565b6007835261316d8884016121e8565b8d6131778161271c565b9c896001600160a01b039e8f94859182865116908d5194600486528501528c840152168c82015233608082015260a081018a526131b386611f6d565b526131bd85611f6d565b5088516131c9816118f6565b6002815289368c8301376131dc86611f7a565b526131e685611f7a565b5060ff8a6132498b8501936132338761320c81613204858a51611fca565b515116613be4565b9751168861321b848951611fca565b5151168561322a858a51611fca565b51015191612b9b565b9661323f828751611fca565b5151169451611fca565b51015192169093929190604051946005865260208601526040850152606084015260808301525f60a083015260c08201604052565b61328782611f8a565b5261329181611f8a565b506132b58a8d8d60ff8a6132498d8501936132338761320c81613204858a51611fca565b6132be82611f9a565b526132c881611f9a565b50613c40565b95878a511697848b0191825191868184511693015116928a855230875285808620915101518651916132ff83611997565b86835287519561330e8761195e565b86528886015286850152848885015289608085015260a084015260c08301528351808098819463d04dfe2360e01b83526004830161304a565b03915afa968715613434575f945f98613412575b508451600281106133fb5750818386015195015161338161337b88611faa565b51611f9a565b5161338c8183613461565b156133f35750925b6133b68685919060405192600284526020840152604083015260608201604052565b6133bf88611f8a565b526133c987611f8a565b508251996133d68b61195e565b8a52890152870152850152608084015260a083015260c082015290565b905092613394565b602490835190630fbb8e5560e21b82526004820152fd5b90975061342a9194503d805f833e612b7481836119b3565b939093965f61335b565b50513d5f823e3d90fd5b61345d905f60e01d906001600160e01b038160e01d9116601b0b614840565b1390565b9061345d916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b6148c1565b6134af6001600160e01b0392838316601b0b9260e01d938160e01d9116601b0b8484614037565b90637ffffff582136134ff575b906134c691614280565b92909215806134f7575b6134d957505090565b6044925060405191638eba4d0760e01b835260048301526024820152fd5b5082156134d0565b6135098282614f20565b156134bc57604483856040519163d556b11160e01b835260048301526024820152fd5b611a3691610bd2916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b614486565b611a3691610bd2916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b61464a565b6135da91608081018261359c6135968351611faa565b51611faa565b526135d36135cd6001600160a01b038094515116936135c46135be8551611faa565b51611f6d565b51169251611faa565b51611f8a565b5191612e0a565b5050565b906080810191806135f26135968551611f9a565b526001600160a01b0380925151169161360e6135be8551611f9a565b511661361d6135cd8551611f9a565b5190816136b85761362d8361343e565b612978579183917f4cb6e22a3e7e651d7cf0376cff48f20f5007a54147777865be7f5f6c38c50f4a959361261e955f5260209060018252613683604094855f20835f528452855f20855f528452855f2054613556565b945f5260018252835f20905f528152825f20915f52525f20555b51604051918291338352604060208401526040830190612fee565b916136e9917f4cb6e22a3e7e651d7cf0376cff48f20f5007a54147777865be7f5f6c38c50f4a959361261e956128cd565b505061369d565b90604082019082526020606081936040838201528551809452019301915f5b82811061371d575050505090565b83518552938101939281019260010161370f565b60c0810151908151915f926138a5575b506137e66020918281510151926001600160a01b039081818187511696015116928660a082019485518252308452604097888320898686510151015160808601518b519161378e83611997565b8683528c519361379d85611997565b8785528d51966137ac8861195e565b8752898701528c86015260016060860152608085015260a084015260c08301528851808099819463d04dfe2360e01b83526004830161304a565b03915afa94851561389b57879561387d575b508451613809575b50505050505050565b81905101510151169051813b156138795791849184938361383e965180978195829463012c676d60e21b8452600484016136f0565b03925af19081156138705750613859575b8080808080613800565b613863829161194a565b61386d578061384f565b80fd5b513d84823e3d90fd5b8480fd5b6138929195503d8089833e612b7481836119b3565b9050935f6137f8565b86513d89823e3d90fd5b6001600160a01b03602080845101510151169060a083015190823b15610182576138e8925f928360405180968195829463012c676d60e21b8452600484016136f0565b03925af1801561022c57156137415761390291925061194a565b5f905f613741565b6080810161391b6135cd8251611f9a565b5191821561392857505050565b6139426135be6001600160a01b0380935151169351611f9a565b5116815f5260209160018352604092835f20835f528152835f20855f528152835f2054936001600160e01b03851661397d575b505050505050565b6139a1955f9284845260018152828420868552815282842091845252812055612e68565b5f808080613975565b81156139b4570490565b634e487b7160e01b5f52601260045260245ffd5b6040815110613a10576020810151908051603f1981019081116128a75760051c82116139fc5760016020920160051b010190565b5050604051613a0a81611997565b5f815290565b50604051613a0a81611997565b805115613a2d57602001515f1a90565b505f90565b905f8091602081519101845af48080613ab0575b15613a665750506040513d81523d5f602083013e60203d82010160405290565b15613a8d57604051639996b31560e01b81526001600160a01b039091166004820152602490fd5b3d15613a9e576040513d5f823e3d90fd5b60405163d6bda27560e01b8152600490fd5b503d151580613a465750813b1515613a46565b60041115613acd57565b634e487b7160e01b5f52602160045260245ffd5b602090939291936001600160a01b036040820195168152613b0183613ac3565b0152565b613b0d61500e565b6040805163b7bad1b160e01b81526001600160a01b0383166004820152909182826024815f73200e12d10bb0c5e4a17e7018f0f1161919bb93895af1928315613bdb575f925f94613ba6575b50613b6383613ac3565b600183141580613b94575b613b785750505090565b5163ee07877f60e01b81529182916106df919060048401613ae1565b50613b9e83613ac3565b821515613b6e565b90809450613bca9293503d8511613bd4575b613bc281836119b3565b810190614916565b919091925f613b59565b503d613bb8565b513d5f823e3d90fd5b613bec61500e565b60408051630782d7e160e01b81526001600160a01b03831660048201529091828260248173200e12d10bb0c5e4a17e7018f0f1161919bb93895afa928315613bdb575f925f94613ba65750613b6383613ac3565b90805191613c4d83611a97565b91613c68604094613c60865195866119b3565b808552611a97565b601f199460209186013686840137835183519095908015613e67576001613cbe9101965b6001978891010197613cb5613ca08a611a97565b99613cad86519b8c6119b3565b808b52611a97565b01848901612204565b85805f9684516002815233878201523086820152606081018652613ce18b611f6d565b52613ceb8a611f6d565b505f925b613e23575b5050508351613d07575b50505050505090565b85809598979692980181613d1b8289611fca565b52613d268188611fca565b505f925b613d39575b5085969750613cfe565b8451831015613e1e576001600160a01b03613db081613d588689611fca565b51511686613d66878a611fca565b51015187815160051b9101207f19457468657265756d205369676e6564204d6573736167653a0a3332000000005f52601c52603c5f208c613da7888b611fca565b51015191614a9a565b15613e0657868098999a928192613dc7878a611fca565b515116613dd48787611fca565b52019385613de28289611fca565b510151613def868c611fca565b52613dfa858b611fca565b50019290989796613d2a565b8951630a57f30960e31b815260048101859052602490fd5b613d2f565b9091968151881015613e5e578280910197613e3e8184611fca565b51613e498a8d611fca565b52613e54898c611fca565b5001919081613cef565b96829150613cf4565b50613cbe5f96613c8c565b9091939284158215175f14613e8c5750505090505f905f90565b82810192600160fd1b8082019083011760fe1c613fc3575b5050613eaf81614be5565b93613eb981614be5565b94613ec48682614c05565b90918215613fb4575f9083986f0785ee10d5da46d900f436a000000000808611613fa6575b50670de0b6b3a7640000808b11613f97575b50633b9aca00808b11613f88575b50612710808b11613f7a575b5098805b613f695750819061189e989982600a0a9109960195817fcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccd0a93838211900382610100031b9203901c170291614c18565b60019290920191600a900480613f19565b60049a04998a930192613f15565b600991939a049901915f613f09565b601291939a049901915f613efb565b85049950602592505f613ee9565b5092905061189e949550614c18565b5f82121561401757808413614009575b7f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb2841315613ea45790925061189e939491614b23565b90925061189e939491614b8a565b80841215613fd35790925061189e939491614b23565b6134c68282614280565b9290918061405d576044848460405191637a97930f60e01b835260048301526024820152fd5b90919280155f1461407257505050505f905f90565b61408b9361407f91614cd2565b92919490938492614cd2565b909391928461409988614be5565b916140a386614be5565b947f161bcca7119915b50764b4abe86529797775a5f171951000000000000000000094604c9186881061424a575b030191600160ff1b98838a018112155f14614217575050035b5f955f82128061420e575b6141f0575b5f8112806141de575b6141c05786820103966001600160ff1b03881490816141b6575b50806141ad575b806141a4575b61418657509061413a9291614e7e565b915f811361414d575b5061189e93614c18565b9091604c821361417b5761416491600a0a906139aa565b908115614171575f614143565b505050505f905f90565b50505050505f905f90565b876044916040519163d556b11160e01b835260048301526024820152fd5b505f851261412a565b50828414614124565b905088145f61411d565b604489836040519163d556b11160e01b835260048301526024820152fd5b50806001600160ff1b03018213614103565b95508087018613156142085786818703015b956140fa565b5f614202565b505f81136140f5565b89985090920390506001600160ff1b038190038701821361423b57018601946140ea565b5050505050505050505f905f90565b7f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee80000000000000000009650604b92506140d1565b81156139b4570590565b8082601b82810b8314614475577d90e40fbeea1d3a4abc8955e946fe31cdcf66f634e10000000000000000008405614421575b8380820b0361441057507b199999999999999999999999999999999999999999999999999999987b0ccccccccccccccccccccccccccccccccccccccccccccccccccccccc840111156143c1575b838060030b03614345575b8084136143295750506001600160e01b036001925b60e01b91161791565b8303600a0a80156139b4576001600160e01b0391071592614320565b92915f84131561439557509061435b8383614f20565b61437757637ffffffe1901600a0a810290637fffffff9261430b565b506044916040519163d556b11160e01b835260048301526024820152fd5b637fffffff19928303906043821361417b576143b491600a0a90614276565b918215614171579261430b565b5f198401808060030b146143d55750614300565b90506001600160e01b039293507b7fffffffffffffffffffffffffffffffffffffffffffffffffffffff915060e01b9260ff1d181617905f90565b600190940193600a909305926142b3565b937f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee8000000000000000000840515614462576305f5e100600894058094819201955b9150506142b3565b620186a06005940580948192019561445a565b508261430057505050505f90600190565b919291600160ff1b840161449e5761189e9350614f39565b9061189e935f039161464a565b919291600160ff1b91908015806146385750906144c791614cd2565b9490929091905f86858585828213801561462f575b614612575b505050508682841860ff1c94860391039081604c0381116145f75701600a0a8082059190846145dd575b505081019182821860ff1c11156145d557826001600160ff1b03146145b757905f600192135f1461458857600a9004915b01925b8115811761454c57509190565b80614565575b50801561455d579190565b505f91508190565b919261457b9203600160ff1b01600a0a90614276565b600160ff1b91905f614552565b600a60037fe666666666666666666666666666666666666666666666666666666666666667920104019161453c565b604490836040519163d556b11160e01b835260048301526024820152fd5b50909261453f565b81076145ea575b8061450b565b60ff1d600117015f6145e4565b505050919350614605579190565b60018160ff1d1790039190565b5f9a50909750909550600160ff1b945092509050868080806144e1565b50835f126144dc565b156146435750509190565b9350919050565b939291938415811581811761479b5750509061466591614cd2565b919490829561467682958294614cd2565b8096929491969387868482138015614792575b614779575b5050505050508682841860ff1c94860391039081604c0381116145f75701600a0a80820591908461475f575b505081019182821860ff1c111561475757826001600160ff1b03146145b757905f600192135f1461472857600a9004915b01925b811581176146fb57509190565b8061470b5750801561455d579190565b600160ff1b936147229291038401600a0a90614276565b5f614552565b600a60037fe66666666666666666666666666666666666666666666666666666666666666792010401916146eb565b5090926146ee565b810761476c575b806146ba565b60ff1d600117015f614766565b929b5098509196509450925090505f808080808061468e565b50858412614689565b93959390929190156147b157505061455d579190565b945092915050565b6008815110613a2d576008015167ffffffffffffffff1667ff0a89c674ee78741490565b9160408301926040614817610bd2606087519401938451906001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b613e72565b94519301614826815186612800565b61482e575050565b909350611a3691925051925183613488565b92915f9060018184145f871287151717176148ba575f928082136148ac575b03604c81135f8212176148a057600a0a908461487e8382029384614276565b146148935750501561488f575f9190565b5f90565b9093509015611a36579190565b50501561488f575f9190565b5f956001945092509061485f565b5050505f90565b93929190918083145f83125f87121883158715171717614910575f928082136149035703604c81135f8212176148a057600a0a908461487e8382029384614276565b919460019350919061485f565b50919050565b919082604091031261018257815160048110156101825760209092015160ff811681036101825790565b91925f831215614968576044838360405191634a7d166b60e01b835260048301526024820152fd5b91928361497a57505090505f90600190565b60ff8116820191808312614a42575f8312156149b2575050604c19811261455d575f03600a0a916149ab83826139aa565b9283021490565b909293915f81135f14614a3857604d8113614a0d57600a0a9283156139b457835f190483116149e45750500290600190565b60405163c849483b60e01b815260048101849052602481019290925260ff166044820152606490fd5b5060405163c849483b60e01b81526004810192909252602482015260ff919091166044820152606490fd5b5050905090600190565b60405163c849483b60e01b815260048101869052602481019190915260ff82166044820152606490fd5b9060ff165f03916001600160ff1b0382115f14614a9257600a6001818404940192061590565b909190600190565b9091813b614ad557614aac9192615077565b50614ab681613ac3565b159182614ac257505090565b6001600160a01b03918216911614919050565b6020918160645f935160405192630b135d3f60e11b9788855260048501526040602485015286820190604485015e8281018201859052601f01601f191601915afa905f5114601f3d11161690565b909392915f614b33918184613e72565b9490945f8483019182019412159081614b80575b8115614b76575b50614b5857505090565b604492506040519163d556b11160e01b835260048301526024820152fd5b905083125f614b4e565b8281129150614b47565b614b9f93600160fe1b90810193920190613e72565b9081815f821215614bd6575050604b1982126128ee57614bc4915f03600a0a90614276565b9081614bce575f90565b600160ff1b90565b93600160ff1b90910192509050565b5f811215611a3657600160ff1b90808203614bfe575090565b90505f0390565b905f198183099102908180821091030391565b92939291905f8184181215614cad576001600160ff1b039283831115614c9757600160ff1b93838503614c4d57505050509190565b90919293508514614c67575050600a600191045f03920190565b604051630ed8062160e21b8152600481019190915260248101919091526044810182905260648101849052608490fd5b5090915050600160ff1b81146128a7575f039190565b90916001600160ff1b038084111561286f578514614c67575050600a60019104920190565b9190918015614e7457827f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee800000000000000000080830515614d82575b507f19999999999999999999999999999999999999999999999999999999999999997f0ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc830110614d73575b8313614d5d5791905f90565b919060018060ff1b926001600160ff1b03030190565b9290600a02905f190192614d51565b6f4b3b4ca85a86c47a098a22400000000080840515614e62575b507728c87cb5c89a2571ebfdcb54864ada834a00000000000000830515614e4b575b7b097edd871cfda3a5697758bf0e3cbb5ac5741c640000000000000000830515614e37575b7e3899162693736ac531a5a58f1fbb4b746504382ca7e4000000000000000000830515614e2757820515614e18575b5f614d06565b9290600a02905f190192614e12565b9391606402916001190193614de3565b93916402540be40002916009190193614de3565b9391678ac7230489e8000002916012190193614dbe565b6025198301955092909202915f614d9c565b505f915081908190565b90915f198383099280830292838086109503948086039584871015614efc5714614ef4579082910960018219018216809204600280826003021880830282030280830282030280830282030280830282030280830282030280920290030293600183805f03040190848311900302920304170290565b505091500490565b60648386866040519263362ced0960e11b8452600484015260248301526044820152fd5b611a3691905f811215614f34575f036150b1565b6150b1565b909291600160ff1b91828101614fcb5750808414614fc157808413918215614fb9578185035b604c811115614fa85750505f915b15614f9957507f8000000000000000000000000000000000000000000000000000000000000001019190565b92506001600160ff1b03039190565b600a0a9081156139b4570491614f6d565b848203614f5f565b505090505f905f90565b93614fd892945f036144ab565b80939180928114614fec575b50505f039190565b915092506001600160ff1b0383146145b757600a600191059201915f80614fe4565b73200e12d10bb0c5e4a17e7018f0f1161919bb9389803b15801561504c575b6150345750565b602490604051906373e6d7b360e01b82526004820152fd5b507f1de7d717526cba131d684e312dedbf0852adef9cced9e36798ae4937f7145d41813f141561502d565b81519190604183036150a7576150a09250602082015190606060408401519301515f1a90615140565b9192909190565b50505f9160029190565b90637ffffff581131561513a57637ffffffe1981019060438213615133575f82121561510757637fffffff91505f0301600a0a7b8000000000000000000000000000000000000000000000000000000202111590565b50600a0a80156139b4577b80000000000000000000000000000000000000000000000000000001041090565b5050151590565b50505f90565b91907f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a084116151b7579160209360809260ff5f9560405194855216868401526040830152606082015282805260015afa1561022c575f516001600160a01b038116156151ad57905f905f90565b505f906001905f90565b5050505f916003919056", + "object": "0x6080806040523460395760017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00556151b6908161003e8239f35b5f80fdfe6080806040526004361015610012575f80fd5b5f3560e01c90816301ffc9a714611792575080631f69cb751461155c5780632cb77e9f146115305780632fbc4ba0146113ce57806341d1514f146113975780635cffe9de1461123b578063607461191461109f578063613255ab1461101c57806369c728561461072b578063709fb8a5146104375780639235084d146103e3578063ac9650d814610295578063d7e442ec14610237578063d9d98ce4146101865763fa501182146100c1575f80fd5b34610182576101403660031901126101825767ffffffffffffffff600435818111610182576100f4903690600401611b27565b6024358281116101825761010c903690600401611b27565b60c0366043190112610182576101043583811161018257610131903690600401611ccd565b90610124359384116101825761014e61015c943690600401611ccd565b926101576126bd565b612203565b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055005b5f80fd5b34610182576040366003190112610182576001600160a01b036101a7611816565b166040516370a0823160e01b8152306004820152602081602481855afa90811561022c575f916101fa575b50156101e25760206040515f8152f35b60249060405190633c5bf76960e21b82526004820152fd5b90506020813d602011610224575b8161021560209383611996565b810103126101825751826101d2565b3d9150610208565b6040513d5f823e3d90fd5b346101825760203660031901126101825760043567ffffffffffffffff81116101825761028f61026e61015c9236906004016117e5565b91906102786126bd565b604051926102858461197a565b5f84523691611da1565b90612bb1565b34610182576020806003193601126101825760043567ffffffffffffffff8111610182576102c79036906004016117e5565b9190604051926102d68461197a565b5f84528284016102e582611a7a565b946102f36040519687611996565b8286526102ff83611a7a565b9361031186880195601f1901866121e7565b5f5b84811061037557604080518881528951818a018190525f92600582901b83018101918a918c9085015b8287106103495785850386f35b909192938280610365600193603f198a820301865288516118a2565b960192019601959291909261033c565b806103c4886103be61039160019560059d9c9d1b8701876120c7565b929089846040519586938585013782018381015f81528b519283915e015f83820152038084520182611996565b30613a26565b6103ce828a611fad565b526103d98189611fad565b5001969596610313565b3461018257600319602036820112610182576004359067ffffffffffffffff82116101825760809082360301126101825761042260609160040161210f565b90604051921515835260208301526040820152f35b34610182576003196040368201126101825760043567ffffffffffffffff8082116101825760c08260040193833603011261018257602435908111610182576104849036906004016117e5565b61048f9291926126bd565b6104c06104bb6104b66104af6104a588806120fa565b60408101906120c7565b36916119b8565b6139bc565b613a11565b801561071957600110156107075760248201926104dd8486611f0a565b9050156106f55760448301936104f38587611f0a565b9050156106e3576105596105219561054d6105186105118a806120fa565b948a611f0a565b9890928a611f0a565b91909261053e60405196610534886118c6565b3388523690611a1c565b9960209a8b8801523691611a92565b60408501523691611a92565b606082015260648401356080820152610571816126ff565b90815f525f865260405f209485541595866105b5575b878760017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055604051908152f35b6001905560a46001600160a01b03917f87491344dfbcf91f6cbbc610cbbeedc85313d37a02df0c93527f7ea5f8db717f83855116604051908152868b82015260606040820152806106096060820188612015565b0390a10191610618838a6120c7565b905061063b575b50505061062e93949550612730565b8190838080808080610587565b6106486104af848b6120c7565b610651816147ad565b156106bc57509761068f7fd46c2c56b35c8210e9e712ec3f02242d5fc90187c0ac8ed80cc33626846ec369936106af9361062e999a9b5116926120c7565b92906040519384938452868c850152606060408501526060840191611cfc565b0390a1859493878061061f565b886106df604051928392630c89984b60e31b8452600484015260248301906118a2565b0390fd5b60405163540e5f0b60e01b8152600490fd5b604051636c44ef8f60e01b8152600490fd5b604051633c8270bd60e21b8152600490fd5b604051632cff108b60e21b8152600490fd5b34610182576003196020368201126101825767ffffffffffffffff600435116101825760c09060043536030112610182576107646126bd565b5f808061077960048035608481019101611e53565b90501561100a576024600435013592610791846127c0565b15610ff8576060806040516107a58161192e565b6107ad611ea8565b81525f60208201525f604082015201526107c5611ea8565b506108256108206107ff6107f56107ef6107e9608460043501600435600401611e53565b90611eda565b80611ef5565b6040810190611f0a565b60206108186107e9608460043501600435600401611e53565b013591611f40565b611ce8565b936001600160a01b0361087461082061085b6108516107ef6107e9608460043501600435600401611e53565b6060810190611f0a565b60406108186107e9608460043501600435600401611e53565b8160405197610882896118f6565b16875216602086015260408501526108a4608460043501600435600401611e53565b9490506001604051955f87520160051b85016040525f905f5b6108d1608460043501600435600401611e53565b9050811080610fe5575b15610e32576108f4608460043501600435600401611e53565b821015610e1e578160051b810135607e198236030181121561018257608081830136031261018257604051916109298361192e565b8181013567ffffffffffffffff81116101825761094b90369084840101611b27565b835280820160208181013590850152604080820135908501526060013567ffffffffffffffff8111610182576109849236920101611ccd565b606082015280516001600160a01b036109a66040830151602085015190611fad565b5151166001600160a01b0385511614801590610dea575b610dd8576109d5602083015160408401519083613102565b6109de816126ff565b91825f525f60205260405f2054155f14610a42575051604080513381526001600160a01b039092166020830152810191909152600191907fb70c12fa453793fa6818ec07c91e74363a47aa6a6829dcd9533937fdf30314f390606090a15b016108bd565b9190610a73602084979597015160408501519060608601519060405192610a688461197a565b5f8452339186613137565b925f93610a8b606082015160446004350135906127e3565b15610af257505051604080513381526001600160a01b03909216602083015281019190915260019291907fe3151dc8cb7a54ffc4baabd28c1f241c94d510b5e5b502491ac3cad6c16316d590606090a15b8115610aea575b5092610a3c565b905088610ae3565b610aff60408201516127c0565b158015610dc5575b15610b5c57505051604080513381526001600160a01b03909216602083015281019190915260019291907f500b713857325f9e6dcb52ae832eca9109d107ed1aae9cb4928b4c1e13f051aa90606090a1610adc565b9250925050600196959691610b75606460043501611fc1565b15610d325796610be597610bf560408401516040880151610b968183613496565b15610d2a5750925b610bef848592610bd8610bd260608a01516001600160e01b03601b918660e01d92828816810b928260e01d9216900b613e66565b90614021565b9d8e9260408d0151613561565b60408c015261358b565b9961358b565b98610c0084846135b5565b610c0a8482613613565b60405192338452608060208501526060610c308451608080880152610100870190612015565b93602081015160a0870152604081015160c0870152015192607f198582030160e0860152835180825260208201906020808260051b8501019601925f5b828110610ccc57505050505092806001979695937f194f1feb3b4d7076a2c272e774e792e0c48bb8c7aa1a9a3671c1cd6da9e6b4c193610cc796604084015260608301520390a180858c5101808d5260051b8c0152613725565b610adc565b9091929396602080610d1d600193601f198782030189528b51906001600160a01b0382511681526040610d0c858401516060878501526060840190612094565b9201519060408184039101526118a2565b9901950193929101610c6d565b905092610b9e565b610be590610bf56060840151610bef610d70610bd260408801516001600160e01b0394601b90868360e01d9316820b91878260e01d9216900b613e66565b60408a0151610d7f8183613496565b15610dbd5750915b829c8d916060890151908116155f14610dae575060408801515b96879460408d0151613561565b610db890856134bd565b610da1565b905091610d87565b50610dd36060820151613473565b610b07565b60405163936bb5ad60e01b8152600490fd5b506001600160a01b03610e066060830151604085015190611fad565b5151166001600160a01b0360208601511614156109bd565b634e487b7160e01b5f52603260045260245ffd5b50919390610e44606460043501611fc1565b15610fdf57835b6004356004013590610e5d8282613496565b610fc15750508490610e7d856001600160a01b0360208701511633613099565b505060a46004350190610e95826004356004016120c7565b905015159081610fb9575b50610f18575b506001600160a01b03610ebc929351163361280a565b50505b8351811015610ee45780610ede610ed860019387611fad565b516138fe565b01610ebf565b5060409160017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f005582519182526020820152f35b90506001600160a01b03602084015116610f426001600160a01b03855116926004356004016120c7565b929091333b1561018257610f8a5f93604051958694859463691f9ed760e01b8652600486015260248501528960448501528a606485015260a0608485015260a4840191611cfc565b038183335af190811561022c57859115610ea6579050610faa915061194a565b5f836001600160a01b03610ea6565b905088610ea0565b604492506040519163573b6f4160e01b835260048301526024820152fd5b84610e4b565b50610ff360408301516127c0565b6108db565b60405163315f9e2360e21b8152600490fd5b604051639c95219f60e01b8152600490fd5b3461018257602080600319360112610182576024816001600160a01b03611041611816565b16604051928380926370a0823160e01b82523060048301525afa90811561022c575f91611072575b50604051908152f35b90508181813d8311611098575b6110898183611996565b81010312610182575182611069565b503d61107f565b34610182576110ad36611856565b6110b56126bd565b6110c084863361278c565b6110c9836127c0565b1561120e576110d9848633612dcc565b6110e38185613496565b15611208575082935b6110f88582883361303b565b9690947f8045c25080b0868951141ed0a91720bcad09a8364a2b3109ee1fd49c1f0bc8b860c0611129898533613099565b94906001600160a01b0360405192338452169a8b6020840152876040840152856060840152608083015260a0820152a1836111845760017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055005b6111fb9761028f9660ff946040519960078b5260208b015260408a01526060890152608088015260a08701521660c08501523360e0850152610100840193846040526111cf8561195e565b600685526111e061012082016121cb565b6111e985611f9d565b526111f384611f9d565b503691611da1565b808080808080808061015c565b936110ec565b604051623a3a4d60e21b81523360048201526001600160a01b038616602482015260448101859052606490fd5b34610182576080366003190112610182576004356001600160a01b03908181168091036101825761126a61182c565b6044359167ffffffffffffffff916064358381116101825736602382011215610182578060040135938411610182573660248583010111610182576112f79560209216936112b9868587612f5c565b60405196879283926323e30c8b60e01b84523360048501528760248501528860448501525f606485015260a06084850152602460a485019201611cfc565b03815f855af193841561022c575f94611363575b507f439148f0bbc682ca079e46d6e2c2f0c1e3b820f1a291b069d8882abf8cf18dd9840361134a5761133f93503091612fd5565b602060405160018152f35b604051630b6c58a960e31b815260048101859052602490fd5b9093506020813d60201161138f575b8161137f60209383611996565b810103126101825751928461130b565b3d9150611372565b346101825760603660031901126101825760206113c66113b5611816565b6113bd61182c565b60443591612dcc565b604051908152f35b34610182576113dc36611856565b839493926113e86126bd565b6113f384863361278c565b6113fc816127c0565b15611502578061141061145f92873361280a565b9590967f7f9dfa19cf1cc2f806f2f860fbc9c056b601fb1afc0e9b843dfe5c63616268e660806040513381526001600160a01b0384169a8b60208301528560408301526060820152a1336128b0565b9590938261148d5760017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055005b6114f69661028f9560ff936040519860068a5260208a01526040890152606088015260808701521660a08501523360c085015260e0840193846040526114d28561195e565b600685526114e361010082016121cb565b6114ec85611f8d565b526111f384611f8d565b8080808080808061015c565b6040516306dde9c360e41b81523360048201526001600160a01b038616602482015260448101859052606490fd5b34610182576020366003190112610182576004355f525f6020526020600160405f205414604051908152f35b3461018257600319604036820112610182576004359067ffffffffffffffff808311610182578260040160a08436039384011261018257602435828111610182576115ab9036906004016117e5565b906115b46126bd565b5f946001600160a01b0394856115c986611ce8565b163303611770576115e26115dd3687611b27565b6126ff565b91825f525f60205260405f2096600188541461162a575b60208960017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00556040519015158152f35b9091929394959697505f6001985560405191338352846020840152606060408401528161165689611842565b16606084015260248a013590606219018112156101825789019060a060808401528061168460048401611842565b1661010084015261169760248301611842565b1661012083015260448101356022198236030181121561018257019560246004880135970192871161018257863603831361018257602098608461175384936117127f09d18501db0080ca2d6cd7c17fa7255daff4b2d503ea93b76ff68b6752ea8e63976117639c6060610140890152610160880191611cfc565b6117446117396117256044880185611d1c565b605f198a8603810160a08c01529491611d51565b926064870190611d1c565b918784030160c0880152611d51565b91013560e08301520390a1612730565b82808080808080806115f9565b60248661177c87611ce8565b6040516335252be360e01b815291166004820152fd5b34610182576020366003190112610182576004359063ffffffff60e01b82168092036101825760209163e414309160e01b81149081156117d4575b5015158152f35b6301ffc9a760e01b149050836117cd565b9181601f840112156101825782359167ffffffffffffffff8311610182576020808501948460051b01011161018257565b600435906001600160a01b038216820361018257565b602435906001600160a01b038216820361018257565b35906001600160a01b038216820361018257565b906080600319830112610182576004356001600160a01b0381168103610182579160243591604435916064359067ffffffffffffffff82116101825761189e916004016117e5565b9091565b805180835260209291819084018484015e5f828201840152601f01601f1916010190565b60a0810190811067ffffffffffffffff8211176118e257604052565b634e487b7160e01b5f52604160045260245ffd5b6060810190811067ffffffffffffffff8211176118e257604052565b6040810190811067ffffffffffffffff8211176118e257604052565b6080810190811067ffffffffffffffff8211176118e257604052565b67ffffffffffffffff81116118e257604052565b60e0810190811067ffffffffffffffff8211176118e257604052565b6020810190811067ffffffffffffffff8211176118e257604052565b90601f8019910116810190811067ffffffffffffffff8211176118e257604052565b92919267ffffffffffffffff82116118e257604051916119e2601f8201601f191660200184611996565b829481845281830111610182578281602093845f960137010152565b9080601f8301121561018257816020611a19933591016119b8565b90565b91906060838203126101825760405190611a35826118f6565b8193611a4081611842565b8352611a4e60208201611842565b602084015260408101359167ffffffffffffffff831161018257604092611a7592016119fe565b910152565b67ffffffffffffffff81116118e25760051b60200190565b929192611a9e82611a7a565b604092611aae6040519283611996565b819581835260208093019160061b84019381851161018257915b848310611ad757505050505050565b8583830312610182578386918251611aee81611912565b611af786611842565b81528286013583820152815201920191611ac8565b9080601f8301121561018257816020611a1993359101611a92565b91909160a0818403126101825760405190611b41826118c6565b8193611b4c82611842565b835267ffffffffffffffff9160208101358381116101825782611b70918301611a1c565b602085015260408101358381116101825782611b8d918301611b0c565b6040850152606081013592831161018257611bae6080939284938301611b0c565b60608501520135910152565b909291611bc684611a7a565b916040611bd66040519485611996565b839580855260208095019160059160051b8401948086116101825784935b868510611c05575050505050505050565b67ffffffffffffffff90853582811161018257870190606082850312610182578451611c30816118f6565b611c3983611842565b81528a83013584811161018257830185601f8201121561018257803590611c5f82611a7a565b91611c6c89519384611996565b8083528d808401918b1b83010191888311610182578e809101915b838310611cbd57509150508201528583013593841161018257611cae858c958695016119fe565b86820152815201940193611bf4565b82358152918101918f9101611c87565b9080601f8301121561018257816020611a1993359101611bba565b356001600160a01b03811681036101825790565b908060209392818452848401375f828201840152601f01601f1916010190565b9035601e198236030181121561018257016020813591019167ffffffffffffffff8211610182578160061b3603831361018257565b9190808252602080920192915f905b828210611d6e575050505090565b909192936001906001600160a01b03611d8687611842565b16815285830135838201526040908101950193920190611d60565b90929192611dae81611a7a565b91604091611dbf6040519485611996565b839581855260208095019160051b8301938185116101825783925b858410611dea5750505050505050565b67ffffffffffffffff908435828111610182578601908382860312610182578351611e1481611912565b82358481116101825786611e29918501611a1c565b81528983013593841161018257611e44868b95869501611ccd565b83820152815201930192611dda565b903590601e1981360301821215610182570180359067ffffffffffffffff821161018257602001918160051b3603831361018257565b60405190611e96826118f6565b60606040835f81525f60208201520152565b60405190611eb5826118c6565b5f608083828152611ec4611e89565b6020820152606060408201526060808201520152565b9015610e1e57803590607e1981360301821215610182570190565b903590609e1981360301821215610182570190565b903590601e1981360301821215610182570180359067ffffffffffffffff821161018257602001918160061b3603831361018257565b9190811015610e1e5760061b0190565b805115610e1e5760200190565b805160011015610e1e5760400190565b805160021015610e1e5760600190565b805160031015610e1e5760800190565b805160041015610e1e5760a00190565b805160051015610e1e5760c00190565b8051821015610e1e5760209160051b010190565b3580151581036101825790565b9081518082526020808093019301915f5b828110611fed575050505090565b835180516001600160a01b031686528201518583015260409094019392810192600101611fdf565b9060808061208b61207961206760406001600160a01b0380895116885260208901519060a060208a01528082511660a08a015260208201511660c08901520151606060e08801526101008701906118a2565b60408701518682036040880152611fce565b60608601518582036060870152611fce565b93015191015290565b9081518082526020808093019301915f5b8281106120b3575050505090565b8351855293810193928101926001016120a5565b903590601e1981360301821215610182570180359067ffffffffffffffff82116101825760200191813603831361018257565b903590605e1981360301821215610182570190565b6121266115dd61211f8380611ef5565b3690611b27565b5f525f602052600160405f2054036121c25780612146816121b293611ef5565b6121aa61216561216a6020850135938460408701359384923690611b27565b613102565b6121826121778580611ef5565b946060810190611e53565b92906121a2604051966121948861197a565b5f88525f3681373690611b27565b933691611bba565b923392613137565b6040810151606090910151600192565b505f905f905f90565b5f5b60c081106121d9575050565b6060828201526020016121cd565b5f5b8281106121f557505050565b6060828201526020016121e9565b926001600160a01b038451166001600160a01b03835116146126ab576001600160a01b03612238606086015160643590611fad565b515116906040830151916001600160a01b036122576084358095611fad565b5151161480159061266b575b610dd8576040850151906001600160a01b036122826044358094611fad565b5151166001600160a01b0361229d60643560608a0151611fad565b51511614612659576122ae866126ff565b805f525f60205260405f20541561260657506122c9846126ff565b805f525f60205260405f2054156125b257506123ac9291612386917f6fa7f4c28634b0a9d6831401c45ae468195fb63aed07308935c35374ff5d9e396040518061233161232361012033845280602085015283018d612015565b82810360408401528a612015565b85606083015260643560808301528760a083015260a43560c083015260c43560e083015260e4356101008301520390a16001600160a01b03865116604051926123798461197a565b5f8452606435908a613137565b936001600160a01b038651166040519261239f8461197a565b5f845260a4359086613137565b916123ba60408201516127c0565b15801561259e575b801561258b575b8015612578575b61256657604051916123e18361192e565b5f83525f60208401525f60408401525f606084015261240084836147d1565b8452604084015261242661241483866147d1565b60208601528060608601528451613561565b9461243a6020850151604086015190613561565b9361244487613473565b8015612557575b6125455761250c61253e957fd9fa84dd790c969daa5c33d8050dc06b4a9b59d5b42e2be5f5e8ae20447f618d946124ee6125439a60a09661248d8a88516135b5565b61249b8c60208901516135b5565b6124a98a6040890151613613565b6124b78c6060890151613613565b6124c08a6138fe565b6124c98c6138fe565b6001600160a01b036124e560c435926060606435910151611fad565b515116336128b0565b50506001600160a01b036124e560e43592606060a435910151611fad565b5050606060405191338352805160208401526020810151604084015260408101518284015201516080820152a1613725565b613725565b565b604051630d86822160e01b8152600490fd5b5061256185613473565b61244b565b6040516321badf1f60e01b8152600490fd5b506125866060840151613473565b6123d0565b506125996060820151613473565b6123c9565b506125ac60408401516127c0565b156123c2565b9351604080513381526001600160a01b039092166020830152810194909452507fb70c12fa453793fa6818ec07c91e74363a47aa6a6829dcd9533937fdf30314f3945091925082915050606081015b0390a1565b9551604080513381526001600160a01b039092166020830152810196909652507fb70c12fa453793fa6818ec07c91e74363a47aa6a6829dcd9533937fdf30314f394935083925050606082019050612601565b604051631cd2f1c760e21b8152600490fd5b506001600160a01b03612685606085015160a43590611fad565b5151166001600160a01b036126a1604088015160443590611fad565b5151161415612263565b604051630a98f1f360e21b8152600490fd5b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0060028154146126ed5760029055565b604051633ee5aeb560e01b8152600490fd5b60405161272a8161271c6020820194602086526040830190612015565b03601f198101835282611996565b51902090565b612543929161275b61028f923390919060405192600284526020840152604083015260608201604052565b92604051936127698561195e565b60068552612779602086016121cb565b61278285611f50565b526111f384611f50565b909115612797575050565b6040516305dbdfd960e41b81526001600160a01b03918216600482015291166024820152604490fd5b6127df905f60e01d906001600160e01b038160e01d9116601b0b614834565b1290565b906127df916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b6148b5565b92919261281682613af9565b9361282081613473565b61289e5784816001600160e01b0361283f9360e01d9116601b0b614934565b9290809315612875575b50829081612859575b5050509190565b61286d926001600160a01b03309216612fd5565b5f8181612852565b9092505f19811461288a57600101915f612849565b634e487b7160e01b5f52601160045260245ffd5b604051632eaefac360e21b8152600490fd5b939291936128bd83613473565b61295b57846128d9576128d1939450613099565b50505f905f90565b6001600160a01b039392919380911694855f52602060018152604092835f20961695865f528152825f20825f528152612916835f2054948561358b565b9561292087613473565b612943575f97885260018252838820908852815282872091875252909320829055565b835163c5e12af560e01b815260048101889052602490fd5b60405163793a8f5560e01b815260048101849052602490fd5b919060408382031261018257825167ffffffffffffffff908181116101825784019082601f830112156101825781516020926129af82611a7a565b916129bd6040519384611996565b808352848084019160051b830101918683116101825785809101915b838310612a4c5750505050948281015191821161018257019180601f84011215610182578251612a0881611a7a565b93612a166040519586611996565b818552838086019260051b820101928311610182578301905b828210612a3d575050505090565b81518152908301908301612a2f565b82518152918101918691016129d9565b90808251908181526020809101926020808460051b8301019501935f915b848310612a8a5750505050505090565b9091929394958480612aa8600193601f198682030187528a51612094565b9801930193019194939290612a7a565b91906020928381526001600160a01b0382511684820152838201516040820152612af2604083015160e060608401526101008301906118a2565b9060608301516080820152612b19608084015192601f1993848483030160a0850152612a5c565b9260a081015193838382030160c08401528680865192838152019501905f5b818110612b5c57505050611a1994955060c060e09101519282850301910152612094565b825187529588019591880191600101612b38565b90604082019082526020606081936040838201528551809452019301915f5b828110612b9d575050505090565b835185529381019392810192600101612b8f565b919091604092835192612bc38461195e565b60068452602094612bd58686016121cb565b5f5b8451811015612c0a5780612bed60019287611fad565b51612bf88289611fad565b52612c038188611fad565b5001612bd7565b50925092939093335f52308252825f2091835195612c2787611912565b612c2f611e89565b875260608281980152845190612c448261197a565b5f8252855190612c538261197a565b5f82525f3681375f5b8151811015612dc057898688612c728486611fad565b51888151948d80870151908151612c94575b5050505050505050600101612c5c565b905f92916001600160a01b0396612cb98887818d51169c015116998789015190613bd8565b95825199612cc68b61195e565b8a5289015287015285015260808401528760a08401528660c08401525f8c51809563d04dfe2360e01b82528180612d01600498898301612ab8565b03915afa938415612db6579089915f95612d90575b508451612d2c575b50899250808e8c938e612c84565b5101511691823b1561018257612d5a925f92838d5180968195829463012c676d60e21b845233908401612b70565b03925af18015612d86579060019291612d77575b81928782612d1e565b612d809061194a565b5f612d6e565b89513d5f823e3d90fd5b612dad9195503d805f833e612da58183611996565b810190612974565b9050935f612d16565b8c513d5f823e3d90fd5b50505050505050509050565b8215612e01576001600160a01b038091165f52600160205260405f2091165f5260205260405f20905f5260205260405f205490565b909150612e0d82613e0a565b6001600160a01b03809316906040918251946370a0823160e01b86528416938460048701526020928387602481865afa968715612f23575f97612f2d575b5083612e64612e5d83612e949a614ae9565b5090614274565b508651636eb1769f60e11b81526001600160a01b0390941660048501523060248501529297889081906044820190565b0381865afa968715612f23575f97612ef2575b50612e5d612eb891611a1998614ae9565b50612ec38183613496565b15612eea5750935b5f5260018252825f20905f528152815f20905f8052525f20549061358b565b905093612ecb565b96508387813d8311612f1c575b612f098183611996565b8101031261018257955195612e5d612ea7565b503d612eff565b85513d5f823e3d90fd5b96508387813d8311612f55575b612f448183611996565b810103126101825795519583612e4b565b503d612f3a565b6040519263a9059cbb60e01b5f526001600160a01b0380931660045260245260205f60448180855af160015f5114811615612fb6575b8360405215612fa057505050565b635274afe760e01b835216600482015260249150fd5b6001811516612fcc57813b15153d151616612f92565b833d5f823e3d90fd5b9092604051936323b872dd60e01b5f526001600160a01b0393848092166004521660245260445260205f60648180855af160015f5114811615613025575b836040525f60605215612fa057505050565b6001811516612fcc57813b15153d151616613013565b9392919361304883613473565b61295b578461305c576128d193945061280a565b6001600160a01b039392919380911694855f52602060018152604092835f20961695865f528152825f20825f528152612916835f20549485613561565b909291926130a681613af9565b936130b081613473565b6130f05784816001600160e01b036130cf9360e01d9116601b0b614934565b508092816130de575050509190565b6001600160a01b0361286d9316612f5c565b604051632d1671a360e11b8152600490fd5b9161312d906060613122936001600160a01b039485916040880151611fad565b515116940151611fad565b5151161461265957565b94919361337c919360c0915f6133036040928351946131558661195e565b61315d611ea8565b86526020958487820152848682015260609781868a809401528260808201528660a082015201526132b38551916131938361195e565b600683526131a28884016121cb565b8d6131ac816126ff565b9c896001600160a01b039e8f94859182865116908d5194600486528501528c840152168c82015233608082015260a081018a526131e886611f50565b526131f285611f50565b5088516131fe816118f6565b6002815289368c83013761321186611f5d565b5261321b85611f5d565b5060ff8a61327e8b8501936132688761324181613239858a51611fad565b515116613e0a565b97511688613250848951611fad565b5151168561325f858a51611fad565b51015191612dcc565b96613274828751611fad565b5151169451611fad565b51015192169093929190604051946005865260208601526040850152606084015260808301525f60a083015260c08201604052565b6132bc82611f6d565b526132c681611f6d565b506132ea8a8d8d60ff8a61327e8d8501936132688761324181613239858a51611fad565b6132f382611f7d565b526132fd81611f7d565b50613bd8565b95878a511697848b0191825191868184511693015116928a855230875285808620915101518651916133348361197a565b8683528751956133438761195e565b86528886015286850152848885015289608085015260a084015260c08301528351808098819463d04dfe2360e01b835260048301612ab8565b03915afa968715613469575f945f98613447575b50845160028110613430575081838601519501516133b66133b088611f8d565b51611f7d565b516133c18183613496565b156134285750925b6133eb8685919060405192600284526020840152604083015260608201604052565b6133f488611f6d565b526133fe87611f6d565b5082519961340b8b61195e565b8a52890152870152850152608084015260a083015260c082015290565b9050926133c9565b602490835190630fbb8e5560e21b82526004820152fd5b90975061345f9194503d805f833e612da58183611996565b939093965f613390565b50513d5f823e3d90fd5b613492905f60e01d906001600160e01b038160e01d9116601b0b614834565b1390565b90613492916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b6148b5565b6134e46001600160e01b0392838316601b0b9260e01d938160e01d9116601b0b848461402b565b90637ffffff58213613534575b906134fb91614274565b929092158061352c575b61350e57505090565b6044925060405191638eba4d0760e01b835260048301526024820152fd5b508215613505565b61353e8282614f14565b156134f157604483856040519163d556b11160e01b835260048301526024820152fd5b611a1991610bd2916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b61447a565b611a1991610bd2916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b61463e565b61360f9160808101826135d16135cb8351611f8d565b51611f8d565b526136086136026001600160a01b038094515116936135f96135f38551611f8d565b51611f50565b51169251611f8d565b51611f6d565b519161303b565b5050565b906080810191806136276135cb8551611f7d565b526001600160a01b038092515116916136436135f38551611f7d565b51166136526136028551611f7d565b5190816136ed5761366283613473565b61295b579183917f4cb6e22a3e7e651d7cf0376cff48f20f5007a54147777865be7f5f6c38c50f4a9593612601955f52602090600182526136b8604094855f20835f528452855f20855f528452855f205461358b565b945f5260018252835f20905f528152825f20915f52525f20555b51604051918291338352604060208401526040830190612a5c565b9161371e917f4cb6e22a3e7e651d7cf0376cff48f20f5007a54147777865be7f5f6c38c50f4a9593612601956128b0565b50506136d2565b60c0810151908151915f92613899575b506137da6020918281510151926001600160a01b039081818187511696015116928660a082019485518252308452604097888320898686510151015160808601518b51916137828361197a565b8683528c51936137918561197a565b8785528d51966137a08861195e565b8752898701528c86015260016060860152608085015260a084015260c08301528851808099819463d04dfe2360e01b835260048301612ab8565b03915afa94851561388f578795613871575b5084516137fd575b50505050505050565b81905101510151169051813b1561386d57918491849383613832965180978195829463012c676d60e21b845260048401612b70565b03925af1908115613864575061384d575b80808080806137f4565b613857829161194a565b6138615780613843565b80fd5b513d84823e3d90fd5b8480fd5b6138869195503d8089833e612da58183611996565b9050935f6137ec565b86513d89823e3d90fd5b6001600160a01b03602080845101510151169060a083015190823b15610182576138dc925f928360405180968195829463012c676d60e21b845260048401612b70565b03925af1801561022c5715613735576138f691925061194a565b5f905f613735565b6080810161390f6136028251611f7d565b5191821561391c57505050565b6139366135f36001600160a01b0380935151169351611f7d565b5116815f5260209160018352604092835f20835f528152835f20855f528152835f2054936001600160e01b038516613971575b505050505050565b613995955f9284845260018152828420868552815282842091845252812055613099565b5f808080613969565b81156139a8570490565b634e487b7160e01b5f52601260045260245ffd5b6040815110613a04576020810151908051603f19810190811161288a5760051c82116139f05760016020920160051b010190565b50506040516139fe8161197a565b5f815290565b506040516139fe8161197a565b805115613a2157602001515f1a90565b505f90565b905f8091602081519101845af48080613aa4575b15613a5a5750506040513d81523d5f602083013e60203d82010160405290565b15613a8157604051639996b31560e01b81526001600160a01b039091166004820152602490fd5b3d15613a92576040513d5f823e3d90fd5b60405163d6bda27560e01b8152600490fd5b503d151580613a3a5750813b1515613a3a565b60041115613ac157565b634e487b7160e01b5f52602160045260245ffd5b602090939291936001600160a01b036040820195168152613af583613ab7565b0152565b613b01615002565b6040805163b7bad1b160e01b81526001600160a01b0383166004820152909182826024815f73200e12d10bb0c5e4a17e7018f0f1161919bb93895af1928315613bcf575f925f94613b9a575b50613b5783613ab7565b600183141580613b88575b613b6c5750505090565b5163ee07877f60e01b81529182916106df919060048401613ad5565b50613b9283613ab7565b821515613b62565b90809450613bbe9293503d8511613bc8575b613bb68183611996565b81019061490a565b919091925f613b4d565b503d613bac565b513d5f823e3d90fd5b90805191613be583611a7a565b91613c00604094613bf886519586611996565b808552611a7a565b601f199460209186013686840137835183519095908015613dff576001613c569101965b6001978891010197613c4d613c388a611a7a565b99613c4586519b8c611996565b808b52611a7a565b018489016121e7565b85805f9684516002815233878201523086820152606081018652613c798b611f50565b52613c838a611f50565b505f925b613dbb575b5050508351613c9f575b50505050505090565b85809598979692980181613cb38289611fad565b52613cbe8188611fad565b505f925b613cd1575b5085969750613c96565b8451831015613db6576001600160a01b03613d4881613cf08689611fad565b51511686613cfe878a611fad565b51015187815160051b9101207f19457468657265756d205369676e6564204d6573736167653a0a3332000000005f52601c52603c5f208c613d3f888b611fad565b51015191614a60565b15613d9e57868098999a928192613d5f878a611fad565b515116613d6c8787611fad565b52019385613d7a8289611fad565b510151613d87868c611fad565b52613d92858b611fad565b50019290989796613cc2565b8951630a57f30960e31b815260048101859052602490fd5b613cc7565b9091968151881015613df6578280910197613dd68184611fad565b51613de18a8d611fad565b52613dec898c611fad565b5001919081613c87565b96829150613c8c565b50613c565f96613c24565b613e12615002565b60408051630782d7e160e01b81526001600160a01b03831660048201529091828260248173200e12d10bb0c5e4a17e7018f0f1161919bb93895afa928315613bcf575f925f94613b9a5750613b5783613ab7565b9091939284158215175f14613e805750505090505f905f90565b82810192600160fd1b8082019083011760fe1c613fb7575b5050613ea381614bd9565b93613ead81614bd9565b94613eb88682614bf9565b90918215613fa8575f9083986f0785ee10d5da46d900f436a000000000808611613f9a575b50670de0b6b3a7640000808b11613f8b575b50633b9aca00808b11613f7c575b50612710808b11613f6e575b5098805b613f5d5750819061189e989982600a0a9109960195817fcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccd0a93838211900382610100031b9203901c170291614c0c565b60019290920191600a900480613f0d565b60049a04998a930192613f09565b600991939a049901915f613efd565b601291939a049901915f613eef565b85049950602592505f613edd565b5092905061189e949550614c0c565b5f82121561400b57808413613ffd575b7f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb2841315613e985790925061189e939491614b17565b90925061189e939491614b7e565b80841215613fc75790925061189e939491614b17565b6134fb8282614274565b92909180614051576044848460405191637a97930f60e01b835260048301526024820152fd5b90919280155f1461406657505050505f905f90565b61407f9361407391614cc6565b92919490938492614cc6565b909391928461408d88614bd9565b9161409786614bd9565b947f161bcca7119915b50764b4abe86529797775a5f171951000000000000000000094604c9186881061423e575b030191600160ff1b98838a018112155f1461420b575050035b5f955f821280614202575b6141e4575b5f8112806141d2575b6141b45786820103966001600160ff1b03881490816141aa575b50806141a1575b80614198575b61417a57509061412e9291614e72565b915f8113614141575b5061189e93614c0c565b9091604c821361416f5761415891600a0a9061399e565b908115614165575f614137565b505050505f905f90565b50505050505f905f90565b876044916040519163d556b11160e01b835260048301526024820152fd5b505f851261411e565b50828414614118565b905088145f614111565b604489836040519163d556b11160e01b835260048301526024820152fd5b50806001600160ff1b030182136140f7565b95508087018613156141fc5786818703015b956140ee565b5f6141f6565b505f81136140e9565b89985090920390506001600160ff1b038190038701821361422f57018601946140de565b5050505050505050505f905f90565b7f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee80000000000000000009650604b92506140c5565b81156139a8570590565b8082601b82810b8314614469577d90e40fbeea1d3a4abc8955e946fe31cdcf66f634e10000000000000000008405614415575b8380820b0361440457507b199999999999999999999999999999999999999999999999999999987b0ccccccccccccccccccccccccccccccccccccccccccccccccccccccc840111156143b5575b838060030b03614339575b80841361431d5750506001600160e01b036001925b60e01b91161791565b8303600a0a80156139a8576001600160e01b0391071592614314565b92915f84131561438957509061434f8383614f14565b61436b57637ffffffe1901600a0a810290637fffffff926142ff565b506044916040519163d556b11160e01b835260048301526024820152fd5b637fffffff19928303906043821361416f576143a891600a0a9061426a565b91821561416557926142ff565b5f198401808060030b146143c957506142f4565b90506001600160e01b039293507b7fffffffffffffffffffffffffffffffffffffffffffffffffffffff915060e01b9260ff1d181617905f90565b600190940193600a909305926142a7565b937f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee8000000000000000000840515614456576305f5e100600894058094819201955b9150506142a7565b620186a06005940580948192019561444e565b50826142f457505050505f90600190565b919291600160ff1b84016144925761189e9350614f2d565b9061189e935f039161463e565b919291600160ff1b919080158061462c5750906144bb91614cc6565b9490929091905f868585858282138015614623575b614606575b505050508682841860ff1c94860391039081604c0381116145eb5701600a0a8082059190846145d1575b505081019182821860ff1c11156145c957826001600160ff1b03146145ab57905f600192135f1461457c57600a9004915b01925b8115811761454057509190565b80614559575b508015614551579190565b505f91508190565b919261456f9203600160ff1b01600a0a9061426a565b600160ff1b91905f614546565b600a60037fe6666666666666666666666666666666666666666666666666666666666666679201040191614530565b604490836040519163d556b11160e01b835260048301526024820152fd5b509092614533565b81076145de575b806144ff565b60ff1d600117015f6145d8565b5050509193506145f9579190565b60018160ff1d1790039190565b5f9a50909750909550600160ff1b945092509050868080806144d5565b50835f126144d0565b156146375750509190565b9350919050565b939291938415811581811761478f5750509061465991614cc6565b919490829561466a82958294614cc6565b8096929491969387868482138015614786575b61476d575b5050505050508682841860ff1c94860391039081604c0381116145eb5701600a0a808205919084614753575b505081019182821860ff1c111561474b57826001600160ff1b03146145ab57905f600192135f1461471c57600a9004915b01925b811581176146ef57509190565b806146ff57508015614551579190565b600160ff1b936147169291038401600a0a9061426a565b5f614546565b600a60037fe66666666666666666666666666666666666666666666666666666666666666792010401916146df565b5090926146e2565b8107614760575b806146ae565b60ff1d600117015f61475a565b929b5098509196509450925090505f8080808080614682565b5085841261467d565b93959390929190156147a5575050614551579190565b945092915050565b6008815110613a21576008015167ffffffffffffffff1667ff0a89c674ee78741490565b916040830192604061480b610bd2606087519401938451906001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b613e66565b9451930161481a8151866127e3565b614822575050565b909350611a19919250519251836134bd565b92915f9060018184145f871287151717176148ae575f928082136148a0575b03604c81135f82121761489457600a0a9084614872838202938461426a565b1461488757505015614883575f9190565b5f90565b9093509015611a19579190565b505015614883575f9190565b5f9560019450925090614853565b5050505f90565b93929190918083145f83125f87121883158715171717614904575f928082136148f75703604c81135f82121761489457600a0a9084614872838202938461426a565b9194600193509190614853565b50919050565b919082604091031261018257815160048110156101825760209092015160ff811681036101825790565b91925f83121561495c576044838360405191634a7d166b60e01b835260048301526024820152fd5b91928361496e57505090505f90600190565b60ff8116820191808312614a36575f8312156149a6575050604c198112614551575f03600a0a9161499f838261399e565b9283021490565b909293915f81135f14614a2c57604d8113614a0157600a0a9283156139a857835f190483116149d85750500290600190565b60405163c849483b60e01b815260048101849052602481019290925260ff166044820152606490fd5b5060405163c849483b60e01b81526004810192909252602482015260ff919091166044820152606490fd5b5050905090600190565b60405163c849483b60e01b815260048101869052602481019190915260ff82166044820152606490fd5b9091813b614a9b57614a72919261506b565b50614a7c81613ab7565b159182614a8857505090565b6001600160a01b03918216911614919050565b6020918160645f935160405192630b135d3f60e11b9788855260048501526040602485015286820190604485015e8281018201859052601f01601f191601915afa905f5114601f3d11161690565b9060ff165f03916001600160ff1b0382115f14614b0f57600a6001818404940192061590565b909190600190565b909392915f614b27918184613e66565b9490945f8483019182019412159081614b74575b8115614b6a575b50614b4c57505090565b604492506040519163d556b11160e01b835260048301526024820152fd5b905083125f614b42565b8281129150614b3b565b614b9393600160fe1b90810193920190613e66565b9081815f821215614bca575050604b1982126128d157614bb8915f03600a0a9061426a565b9081614bc2575f90565b600160ff1b90565b93600160ff1b90910192509050565b5f811215611a1957600160ff1b90808203614bf2575090565b90505f0390565b905f198183099102908180821091030391565b92939291905f8184181215614ca1576001600160ff1b039283831115614c8b57600160ff1b93838503614c4157505050509190565b90919293508514614c5b575050600a600191045f03920190565b604051630ed8062160e21b8152600481019190915260248101919091526044810182905260648101849052608490fd5b5090915050600160ff1b811461288a575f039190565b90916001600160ff1b0380841115612852578514614c5b575050600a60019104920190565b9190918015614e6857827f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee800000000000000000080830515614d76575b507f19999999999999999999999999999999999999999999999999999999999999997f0ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc830110614d67575b8313614d515791905f90565b919060018060ff1b926001600160ff1b03030190565b9290600a02905f190192614d45565b6f4b3b4ca85a86c47a098a22400000000080840515614e56575b507728c87cb5c89a2571ebfdcb54864ada834a00000000000000830515614e3f575b7b097edd871cfda3a5697758bf0e3cbb5ac5741c640000000000000000830515614e2b575b7e3899162693736ac531a5a58f1fbb4b746504382ca7e4000000000000000000830515614e1b57820515614e0c575b5f614cfa565b9290600a02905f190192614e06565b9391606402916001190193614dd7565b93916402540be40002916009190193614dd7565b9391678ac7230489e8000002916012190193614db2565b6025198301955092909202915f614d90565b505f915081908190565b90915f198383099280830292838086109503948086039584871015614ef05714614ee8579082910960018219018216809204600280826003021880830282030280830282030280830282030280830282030280830282030280920290030293600183805f03040190848311900302920304170290565b505091500490565b60648386866040519263362ced0960e11b8452600484015260248301526044820152fd5b611a1991905f811215614f28575f036150a5565b6150a5565b909291600160ff1b91828101614fbf5750808414614fb557808413918215614fad578185035b604c811115614f9c5750505f915b15614f8d57507f8000000000000000000000000000000000000000000000000000000000000001019190565b92506001600160ff1b03039190565b600a0a9081156139a8570491614f61565b848203614f53565b505090505f905f90565b93614fcc92945f0361449f565b80939180928114614fe0575b50505f039190565b915092506001600160ff1b0383146145ab57600a600191059201915f80614fd8565b73200e12d10bb0c5e4a17e7018f0f1161919bb9389803b158015615040575b6150285750565b602490604051906373e6d7b360e01b82526004820152fd5b507f1de7d717526cba131d684e312dedbf0852adef9cced9e36798ae4937f7145d41813f1415615021565b815191906041830361509b576150949250602082015190606060408401519301515f1a90615134565b9192909190565b50505f9160029190565b90637ffffff581131561512e57637ffffffe1981019060438213615127575f8212156150fb57637fffffff91505f0301600a0a7b8000000000000000000000000000000000000000000000000000000202111590565b50600a0a80156139a8577b80000000000000000000000000000000000000000000000000000001041090565b5050151590565b50505f90565b91907f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a084116151ab579160209360809260ff5f9560405194855216868401526040830152606082015282805260015afa1561022c575f516001600160a01b038116156151a157905f905f90565b505f906001905f90565b5050505f916003919056", "linkReferences": {} } } diff --git a/crates/test_fixtures/abis/RaindexV6SubParser.json b/crates/test_fixtures/abis/RaindexV6SubParser.json index 6f79b6a5b6..208d153fc6 100644 --- a/crates/test_fixtures/abis/RaindexV6SubParser.json +++ b/crates/test_fixtures/abis/RaindexV6SubParser.json @@ -242,7 +242,7 @@ } ], "bytecode": { - "object": "0x6080604052348015600e575f80fd5b506126888061001c5f395ff3fe608060405234801561000f575f80fd5b506004361061007a575f3560e01c80636f5aa28d116100585780636f5aa28d146100dd578063c6c0cbb61461010b578063ccf4477514610135578063d6d8c9a814610148575f80fd5b806301ffc9a71461007e578063336284d4146100a6578063570c7a63146100bb575b5f80fd5b61009161008c366004612343565b610150565b60405190151581526020015b60405180910390f35b6100ae6101d7565b60405161009d919061239f565b6100ce6100c93660046123c5565b610b9f565b60405161009d9392919061246f565b6040517fe43208b51e17b3d887e8f3535d75526c0744eee6a200dac603462c6b3ca46511815260200161009d565b61011e6101193660046123c5565b610ce3565b60408051921515835260208301919091520161009d565b60408051602081019091525f81526100ae565b6100ae610d1b565b5f6001600160e01b031982166391ccb1d560e01b148061018057506001600160e01b03198216636f5aa28d60e01b145b8061019b57506001600160e01b03198216631a2c8edd60e01b145b806101b657506001600160e01b03198216630cd8a13560e21b145b806101d157506301ffc9a760e01b6001600160e01b03198316145b92915050565b60605f6101e6600960016124e0565b6001600160401b038111156101fd576101fd6123b1565b60405190808252806020026020018201604052801561023057816020015b606081526020019060019003908161021b5790505b506040805160018082528183019092529192505f9190816020015b61233981526020019060019003908161024b579050509050611682815f81518110610278576102786124f3565b6001600160401b03929092166020928302919091019091015260408051600480825260a082019092525f91816020015b6123398152602001906001900390816102a85790505090506116a0815f815181106102d5576102d56124f3565b60200260200101906001600160401b031690816001600160401b0316815250506116af8160018151811061030b5761030b6124f3565b60200260200101906001600160401b031690816001600160401b0316815250506116be81600281518110610341576103416124f3565b60200260200101906001600160401b031690816001600160401b0316815250506116ce81600381518110610377576103776124f3565b6001600160401b039290921660209283029190910190910152604080516002808252606082019092525f91816020015b6123398152602001906001900390816103a75790505090506116de815f815181106103d4576103d46124f3565b60200260200101906001600160401b031690816001600160401b0316815250506116ed8160018151811061040a5761040a6124f3565b6001600160401b03929092166020928302919091019091015260408051600580825260c082019092525f91816020015b61233981526020019060019003908161043a5790505090506116fd815f81518110610467576104676124f3565b60200260200101906001600160401b031690816001600160401b03168152505061170c8160018151811061049d5761049d6124f3565b60200260200101906001600160401b031690816001600160401b03168152505061171c816002815181106104d3576104d36124f3565b60200260200101906001600160401b031690816001600160401b03168152505061172c81600381518110610509576105096124f3565b60200260200101906001600160401b031690816001600160401b03168152505061173b8160048151811061053f5761053f6124f3565b6001600160401b03929092166020928302919091019091015260408051600580825260c082019092525f91816020015b61233981526020019060019003908161056f57905050905061174b815f8151811061059c5761059c6124f3565b60200260200101906001600160401b031690816001600160401b03168152505061175a816001815181106105d2576105d26124f3565b60200260200101906001600160401b031690816001600160401b03168152505061176a81600281518110610608576106086124f3565b60200260200101906001600160401b031690816001600160401b03168152505061177a8160038151811061063e5761063e6124f3565b60200260200101906001600160401b031690816001600160401b03168152505061178a81600481518110610674576106746124f3565b6001600160401b0392909216602092830291909101909101526040805160018082528183019092525f91816020015b6123398152602001906001900390816106a3579050509050611799815f815181106106d0576106d06124f3565b6001600160401b0392909216602092830291909101909101526040805160018082528183019092525f91816020015b6123398152602001906001900390816106ff5790505090506117a8815f8151811061072c5761072c6124f3565b60200260200101906001600160401b031690816001600160401b03168152505086885f8151811061075f5761075f6124f3565b6020026020010181905250858860018151811061077e5761077e6124f3565b6020026020010181905250848860028151811061079d5761079d6124f3565b602002602001018190525083886003815181106107bc576107bc6124f3565b602002602001018190525082886004815181106107db576107db6124f3565b602002602001018190525081886008815181106107fa576107fa6124f3565b60200260200101819052508088600981518110610819576108196124f3565b602090810291909101015260408051600680825260e082019092525f91816020015b61233981526020019060019003908161083b5790505090506117da815f81518110610868576108686124f3565b60200260200101906001600160401b031690816001600160401b0316815250506117e98160018151811061089e5761089e6124f3565b60200260200101906001600160401b031690816001600160401b0316815250506117f8816002815181106108d4576108d46124f3565b60200260200101906001600160401b031690816001600160401b0316815250506118088160038151811061090a5761090a6124f3565b60200260200101906001600160401b031690816001600160401b03168152505061181881600481518110610940576109406124f3565b60200260200101906001600160401b031690816001600160401b03168152505061182881600581518110610976576109766124f3565b60200260200101906001600160401b031690816001600160401b03168152505080896005815181106109aa576109aa6124f3565b602090810291909101015260408051600780825261010082019092525f91816020015b6123398152602001906001900390816109cd579050509050611838815f815181106109fa576109fa6124f3565b60200260200101906001600160401b031690816001600160401b03168152505061184781600181518110610a3057610a306124f3565b60200260200101906001600160401b031690816001600160401b03168152505061185681600281518110610a6657610a666124f3565b60200260200101906001600160401b031690816001600160401b03168152505061186681600381518110610a9c57610a9c6124f3565b60200260200101906001600160401b031690816001600160401b03168152505061187681600481518110610ad257610ad26124f3565b60200260200101906001600160401b031690816001600160401b03168152505061188681600581518110610b0857610b086124f3565b60200260200101906001600160401b031690816001600160401b03168152505061189681600681518110610b3e57610b3e6124f3565b60200260200101906001600160401b031690816001600160401b031681525050808a600681518110610b7257610b726124f3565b602090810291909101015289610b8f610b8a826118a6565b6118bb565b9b50505050505050505050505090565b5f6060805f805f610bbf87610bb261194a565b610bba61196a565b61198a565b9250925092505f610bd582610220015160200190565b90505f8261022001515182610bea91906124e0565b90505f610c0883836f07fffffe0000000003ff200000000000611a7b565b80925081945050505f80610c2186610240015184611b17565b915091508115610cb6575f610c368783611bee565b90506123395f610c44611c1d565b90505f60028251610c55919061251b565b9050808510610c86576040516303bdd1b160e51b815260048101869052602481018290526044015b60405180910390fd5b6001850160020282015161ffff169250610c9f8c8c8686565b9e509e509e50505050505050505050505050610cdc565b5050604080515f80825281830190925260208101828152919a5090985096505050505050505b9193909250565b5f805f805f610d0b866002810151815160228084019461ffff93909316840101920160200190565b505f988998509650505050505050565b60605f610d2a600960016124e0565b6001600160401b03811115610d4157610d416123b1565b604051908082528060200260200182016040528015610d7457816020015b6060815260200190600190039081610d5f5790505b506040805160018082528183019092529192505f9190816020015b612339815260200190600190039081610d8f579050509050611c3d815f81518110610dbc57610dbc6124f3565b6001600160401b03929092166020928302919091019091015260408051600480825260a082019092525f91816020015b612339815260200190600190039081610dec579050509050611c3d815f81518110610e1957610e196124f3565b60200260200101906001600160401b031690816001600160401b031681525050611c3d81600181518110610e4f57610e4f6124f3565b60200260200101906001600160401b031690816001600160401b031681525050611c3d81600281518110610e8557610e856124f3565b60200260200101906001600160401b031690816001600160401b031681525050611c3d81600381518110610ebb57610ebb6124f3565b6001600160401b039290921660209283029190910190910152604080516002808252606082019092525f91816020015b612339815260200190600190039081610eeb579050509050611c3d815f81518110610f1857610f186124f3565b60200260200101906001600160401b031690816001600160401b031681525050611c3d81600181518110610f4e57610f4e6124f3565b6001600160401b03929092166020928302919091019091015260408051600580825260c082019092525f91816020015b612339815260200190600190039081610f7e579050509050611c3d815f81518110610fab57610fab6124f3565b60200260200101906001600160401b031690816001600160401b031681525050611c3d81600181518110610fe157610fe16124f3565b60200260200101906001600160401b031690816001600160401b031681525050611c3d81600281518110611017576110176124f3565b60200260200101906001600160401b031690816001600160401b031681525050611c3d8160038151811061104d5761104d6124f3565b60200260200101906001600160401b031690816001600160401b031681525050611c3d81600481518110611083576110836124f3565b6001600160401b03929092166020928302919091019091015260408051600580825260c082019092525f91816020015b6123398152602001906001900390816110b3579050509050611c3d815f815181106110e0576110e06124f3565b60200260200101906001600160401b031690816001600160401b031681525050611c3d81600181518110611116576111166124f3565b60200260200101906001600160401b031690816001600160401b031681525050611c3d8160028151811061114c5761114c6124f3565b60200260200101906001600160401b031690816001600160401b031681525050611c3d81600381518110611182576111826124f3565b60200260200101906001600160401b031690816001600160401b031681525050611c3d816004815181106111b8576111b86124f3565b6001600160401b0392909216602092830291909101909101526040805160018082528183019092525f91816020015b6123398152602001906001900390816111e7579050509050611c66815f81518110611214576112146124f3565b6001600160401b0392909216602092830291909101909101526040805160018082528183019092525f91816020015b612339815260200190600190039081611243579050509050611d02815f81518110611270576112706124f3565b60200260200101906001600160401b031690816001600160401b03168152505086885f815181106112a3576112a36124f3565b602002602001018190525085886001815181106112c2576112c26124f3565b602002602001018190525084886002815181106112e1576112e16124f3565b60200260200101819052508388600381518110611300576113006124f3565b6020026020010181905250828860048151811061131f5761131f6124f3565b6020026020010181905250818860088151811061133e5761133e6124f3565b6020026020010181905250808860098151811061135d5761135d6124f3565b602090810291909101015260408051600680825260e082019092525f91816020015b61233981526020019060019003908161137f579050509050611c3d815f815181106113ac576113ac6124f3565b60200260200101906001600160401b031690816001600160401b031681525050611c3d816001815181106113e2576113e26124f3565b60200260200101906001600160401b031690816001600160401b031681525050611c3d81600281518110611418576114186124f3565b60200260200101906001600160401b031690816001600160401b031681525050611c3d8160038151811061144e5761144e6124f3565b60200260200101906001600160401b031690816001600160401b031681525050611c3d81600481518110611484576114846124f3565b60200260200101906001600160401b031690816001600160401b031681525050611c3d816005815181106114ba576114ba6124f3565b60200260200101906001600160401b031690816001600160401b03168152505080896005815181106114ee576114ee6124f3565b602090810291909101015260408051600780825261010082019092525f91816020015b612339815260200190600190039081611511579050509050611c3d815f8151811061153e5761153e6124f3565b60200260200101906001600160401b031690816001600160401b031681525050611c3d81600181518110611574576115746124f3565b60200260200101906001600160401b031690816001600160401b031681525050611c3d816002815181106115aa576115aa6124f3565b60200260200101906001600160401b031690816001600160401b031681525050611c3d816003815181106115e0576115e06124f3565b60200260200101906001600160401b031690816001600160401b031681525050611c3d81600481518110611616576116166124f3565b60200260200101906001600160401b031690816001600160401b031681525050611c3d8160058151811061164c5761164c6124f3565b60200260200101906001600160401b031690816001600160401b031681525050611c3d81600681518110610b3e57610b3e6124f3565b5f6060806116915f6001611dba565b92509250925093509350939050565b5f60608061169160015f611dba565b5f606080611691600180611dba565b5f60608061169160016002611dba565b5f60608061169160016003611dba565b5f60608061169160025f611dba565b5f60608061169160026001611dba565b5f60608061169160035f611dba565b5f60608061169160036001611dba565b5f60608061169160036002611dba565b5f606080611691600380611dba565b5f60608061169160036004611dba565b5f60608061169160045f611dba565b5f60608061169160046001611dba565b5f60608061169160046002611dba565b5f60608061169160046003611dba565b5f606080611691600480611dba565b5f606080611691600885611dba565b5f60608060ff8416600885901c6117c96117c38360096124e0565b82611dba565b945094509450505093509350939050565b5f606080611691600580611dba565b5f60608061169160055f611dba565b5f60608061169160056001611dba565b5f60608061169160056002611dba565b5f60608061169160056003611dba565b5f60608061169160056004611dba565b5f606080611691600680611dba565b5f60608061169160065f611dba565b5f60608061169160066001611dba565b5f60608061169160066002611dba565b5f60608061169160066003611dba565b5f60608061169160066004611dba565b5f60608061169160066005611dba565b6060815f6118b382611e3c565b949350505050565b60605f82516002026001600160401b038111156118da576118da6123b1565b6040519080825280601f01601f191660200182016040528015611904576020820181803683370190505b50905061ffff80196020850160208651028101600285015b8183101561193e5780518351861690851617815260209092019160020161191c565b50939695505050505050565b60606040518060e0016040528060a2815260200161256660a29139905090565b606060405180606001604052806040815260200161260860409139905090565b5f80611a196040518061026001604052805f81526020015f81526020015f81526020015f81526020015f81526020015f81526020015f80191681526020015f81526020015f81526020015f81526020015f81526020015f81526020015f80191681526020016060815260200160608152602001606081526020015f815260200160608152602001606081525090565b606061ffff600288015116935060ff600388015116925061ffff600588015116600588019750808852602081018801915050611a6587878760405180602001604052805f815250611eaa565b915080826101e001819052505093509350939050565b5f808060018187870360208111611a925780611a95565b60205b915050875192505b8519600184841a1b16158183101615611abb57600182019150611a9d565b9681019660208290036008810293841c90931b92611b065760408051602081018590520160408051601f198184030181529082905263e47fe8b760e01b8252610c7d9160040161239f565b50869350909150505b935093915050565b600182810180515f928392600560ff93909316602102870192830192909101835b81831015611bdc5760018301516021909301805190935f90819060ff168180611b61838e61205b565b915091508186165f03611b83575f809b509b5050505050505050505050611be7565b5f87611b93600185038916612086565b016004028b015195505062ffffff9081169350841683039150611bc79050575060019750601c1a9550611be7945050505050565b611bd083612086565b84019350505050611b38565b5f8095509550505050505b9250929050565b6101c08201516002828102820101516101e08401515f9261ffff9092169190611c149083565b95945050505050565b606060405180606001604052806040815260200161264860409139905090565b5f81515f14611c5f576040516304f8b58160e51b815260040160405180910390fd5b505f919050565b5f8151600103611cc3575060208101516001600160e01b038116601b0b60e082901d5f611c9483838361213f565b905061ffff811115611cb957604051631e4e01d760e21b815260040160405180910390fd5b9250611cfd915050565b81515f03611ce457604051630f16066b60e41b815260040160405180910390fd5b604051630358cd2160e31b815260040160405180910390fd5b919050565b5f8151600203611d9757602082015160408301516001600160e01b038216601b0b60e083901d5f611d3483838361213f565b6001600160e01b038516601b0b935060e085901d925090505f611d5884848361213f565b905060ff821180611d69575060ff81115b15611d8757604051631e4e01d760e21b815260040160405180910390fd5b60081b179450611cfd9350505050565b600282511015611ce457604051630f16066b60e41b815260040160405180910390fd5b5f60608060ff851180611dcd575060ff84115b15611df557604051639b0f326160e01b81526004810186905260248101859052604401610c7d565b6040805160248101909152600386602383015385602283015360106021830153806020830153506004815260408051602081019091525f8152600197919650945092505050565b60605f611e4883612181565b90505f611e5682602061253a565b9050606060405190508160200181016040528281526020850160208651028101602083015b81831015611e9e57602083515102806020855101835e6020939093019201611e7b565b50919695505050505050565b611f376040518061026001604052805f81526020015f81526020015f81526020015f81526020015f81526020015f81526020015f80191681526020015f81526020015f81526020015f81526020015f81526020015f81526020015f80191681526020016060815260200160608152602001606081526020015f815260200160608152602001606081525090565b5f6040518061026001604052805f81526020015f81526020015f81526020015f81526020015f81526020015f81526020015f801b81526020015f8152602001600481526020015f81526020015f81526020015f81526020015f801b815260200184815260200185815260200160046001600160401b03811115611fbc57611fbc6123b1565b604051908082528060200260200182016040528015611fe5578160200160208202803683370190505b5081525f602080830182905260408084018b905260609384018a90528051601f01601f19168281528083018252835161ffff191681178452855290840182905283018190529082018190526080820181905260a08201819052610120820181905261014082018190526102008201529050611c14565b5f80825f528360205360215f2090506001815f1a1b915062ffffff8116611be7575060019250929050565b5f5f1982036120985750610100919050565b507f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f7f5555555555555555555555555555555555555555555555555555555555555555600183901c16909103600281901c7f3333333333333333333333333333333333333333333333333333333333333333908116911601600481901c01167f01010101010101010101010101010101010101010101010101010101010101010260f81c90565b5f805f61214d8686866121ca565b91509150806121785760405162bc8ecf60e31b81526004810187905260248101869052604401610c7d565b50949350505050565b5f60208201602083510281015b808210156121c35781515192830192808410156121b757634e487b715f5260116020526024601cfd5b5060208201915061218e565b5050919050565b5f805f8512156121f757604051634a7d166b60e01b81526004810186905260248101859052604401610c7d565b845f0361220957505f90506001611b0f565b8460ff84168501858112156122445760405163c849483b60e01b8152600481018890526024810187905260ff86166044820152606401610c7d565b5f805f83121561229057604c19831215612267575f809550955050505050611b0f565b825f03600a0a915081848161227e5761227e612507565b0495505084029091149150611b0f9050565b5f83131561232957604d8313156122cd5760405163c849483b60e01b8152600481018a90526024810189905260ff88166044820152606401610c7d565b82600a0a9150815f19816122e3576122e3612507565b048411156123175760405163c849483b60e01b8152600481018a90526024810189905260ff88166044820152606401610c7d565b5091909102925060019150611b0f9050565b8360019550955050505050611b0f565b612341612551565b565b5f60208284031215612353575f80fd5b81356001600160e01b03198116811461236a575f80fd5b9392505050565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f61236a6020830184612371565b634e487b7160e01b5f52604160045260245ffd5b5f602082840312156123d5575f80fd5b81356001600160401b03808211156123eb575f80fd5b818401915084601f8301126123fe575f80fd5b813581811115612410576124106123b1565b604051601f8201601f19908116603f01168101908382118183101715612438576124386123b1565b81604052828152876020848701011115612450575f80fd5b826020860160208301375f928101602001929092525095945050505050565b83151581525f60206060602084015261248b6060840186612371565b8381036040850152845180825260208087019201905f5b818110156124be578351835292840192918401916001016124a2565b509098975050505050505050565b634e487b7160e01b5f52601160045260245ffd5b808201808211156101d1576101d16124cc565b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52601260045260245ffd5b5f8261253557634e487b7160e01b5f52601260045260245ffd5b500490565b80820281158282048414176101d1576101d16124cc565b634e487b7160e01b5f52605160045260245ffdfe0101180010800082000100010480300038412a001810000010020004200004002038028ff54904cc66c61df3dcab0616592209895f0b14fec9301902e0920c5bfe561b21609200e959460b1974270f844db208bcd3bf1c9893761e1049db11b93430180ae9a00af82a7805c138f40d28083f0742ef2103d561fd1215a13315716a6117d260cc107b9bfc0eec7ade13cba2891a6b14a51f792bdb01e0f147165655891c3d1c3d1c3d1c3d1c3d1c3d1c3d1c3d1c3d1c3d1c3d1c3d1c3d1c3d1c3d1c3d1c3d1c3d1c3d1c3d1c3d1c3d1c3d1c3d1c3d1c3d1c3d1c3d1c3d1c3d1c661d02168216a016af16be16ce16de16ed16fd170c171c172c173b174b175a176a177a178a17da17e917f81808181818281838184718561866187618861896179917a8", + "object": "0x6080604052348015600e575f80fd5b506127138061001c5f395ff3fe608060405234801561000f575f80fd5b506004361061007a575f3560e01c80636f5aa28d116100585780636f5aa28d146100dd578063c6c0cbb61461010b578063ccf4477514610135578063d6d8c9a814610148575f80fd5b806301ffc9a71461007e578063336284d4146100a6578063570c7a63146100bb575b5f80fd5b61009161008c3660046123ce565b610150565b60405190151581526020015b60405180910390f35b6100ae6101d7565b60405161009d919061242a565b6100ce6100c9366004612450565b610bd4565b60405161009d939291906124fa565b6040517fe43208b51e17b3d887e8f3535d75526c0744eee6a200dac603462c6b3ca46511815260200161009d565b61011e610119366004612450565b610d18565b60408051921515835260208301919091520161009d565b60408051602081019091525f81526100ae565b6100ae610d50565b5f6001600160e01b031982166391ccb1d560e01b148061018057506001600160e01b03198216636f5aa28d60e01b145b8061019b57506001600160e01b03198216631a2c8edd60e01b145b806101b657506001600160e01b03198216630cd8a13560e21b145b806101d157506301ffc9a760e01b6001600160e01b03198316145b92915050565b60605f6101e66006600161256b565b6101f190600161256b565b6101fc90600161256b565b6001600160401b038111156102135761021361243c565b60405190808252806020026020018201604052801561024657816020015b60608152602001906001900390816102315790505b506040805160018082528183019092529192505f9190816020015b6123c48152602001906001900390816102615790505090506116ec815f8151811061028e5761028e61257e565b6001600160401b03929092166020928302919091019091015260408051600480825260a082019092525f91816020015b6123c48152602001906001900390816102be57905050905061170a815f815181106102eb576102eb61257e565b60200260200101906001600160401b031690816001600160401b031681525050611719816001815181106103215761032161257e565b60200260200101906001600160401b031690816001600160401b031681525050611728816002815181106103575761035761257e565b60200260200101906001600160401b031690816001600160401b0316815250506117388160038151811061038d5761038d61257e565b6001600160401b039290921660209283029190910190910152604080516002808252606082019092525f91816020015b6123c48152602001906001900390816103bd579050509050611748815f815181106103ea576103ea61257e565b60200260200101906001600160401b031690816001600160401b031681525050611757816001815181106104205761042061257e565b6001600160401b03929092166020928302919091019091015260408051600580825260c082019092525f91816020015b6123c4815260200190600190039081610450579050509050611767815f8151811061047d5761047d61257e565b60200260200101906001600160401b031690816001600160401b031681525050611776816001815181106104b3576104b361257e565b60200260200101906001600160401b031690816001600160401b031681525050611786816002815181106104e9576104e961257e565b60200260200101906001600160401b031690816001600160401b0316815250506117968160038151811061051f5761051f61257e565b60200260200101906001600160401b031690816001600160401b0316815250506117a5816004815181106105555761055561257e565b6001600160401b03929092166020928302919091019091015260408051600580825260c082019092525f91816020015b6123c48152602001906001900390816105855790505090506117b5815f815181106105b2576105b261257e565b60200260200101906001600160401b031690816001600160401b0316815250506117c4816001815181106105e8576105e861257e565b60200260200101906001600160401b031690816001600160401b0316815250506117d48160028151811061061e5761061e61257e565b60200260200101906001600160401b031690816001600160401b0316815250506117e4816003815181106106545761065461257e565b60200260200101906001600160401b031690816001600160401b0316815250506117f48160048151811061068a5761068a61257e565b6001600160401b0392909216602092830291909101909101526040805160018082528183019092525f91816020015b6123c48152602001906001900390816106b9579050509050611803815f815181106106e6576106e661257e565b6001600160401b0392909216602092830291909101909101526040805160018082528183019092525f91816020015b6123c481526020019060019003908161071557905050905061181c815f815181106107425761074261257e565b60200260200101906001600160401b031690816001600160401b03168152505086885f815181106107755761077561257e565b602002602001018190525085886001815181106107945761079461257e565b602002602001018190525084886002815181106107b3576107b361257e565b602002602001018190525083886003815181106107d2576107d261257e565b602002602001018190525082886004815181106107f1576107f161257e565b6020908102919091010152818861080a6006600161256b565b8151811061081a5761081a61257e565b602090810291909101015280886108336006600161256b565b61083e90600161256b565b8151811061084e5761084e61257e565b602090810291909101015260408051600680825260e082019092525f91816020015b6123c4815260200190600190039081610870579050509050611865815f8151811061089d5761089d61257e565b60200260200101906001600160401b031690816001600160401b031681525050611874816001815181106108d3576108d361257e565b60200260200101906001600160401b031690816001600160401b031681525050611883816002815181106109095761090961257e565b60200260200101906001600160401b031690816001600160401b0316815250506118938160038151811061093f5761093f61257e565b60200260200101906001600160401b031690816001600160401b0316815250506118a3816004815181106109755761097561257e565b60200260200101906001600160401b031690816001600160401b0316815250506118b3816005815181106109ab576109ab61257e565b60200260200101906001600160401b031690816001600160401b03168152505080896005815181106109df576109df61257e565b602090810291909101015260408051600780825261010082019092525f91816020015b6123c4815260200190600190039081610a025790505090506118c3815f81518110610a2f57610a2f61257e565b60200260200101906001600160401b031690816001600160401b0316815250506118d281600181518110610a6557610a6561257e565b60200260200101906001600160401b031690816001600160401b0316815250506118e181600281518110610a9b57610a9b61257e565b60200260200101906001600160401b031690816001600160401b0316815250506118f181600381518110610ad157610ad161257e565b60200260200101906001600160401b031690816001600160401b03168152505061190181600481518110610b0757610b0761257e565b60200260200101906001600160401b031690816001600160401b03168152505061191181600581518110610b3d57610b3d61257e565b60200260200101906001600160401b031690816001600160401b03168152505061192181600681518110610b7357610b7361257e565b60200260200101906001600160401b031690816001600160401b031681525050808a600681518110610ba757610ba761257e565b602090810291909101015289610bc4610bbf82611931565b611946565b9b50505050505050505050505090565b5f6060805f805f610bf487610be76119d5565b610bef6119f5565b611a15565b9250925092505f610c0a82610220015160200190565b90505f8261022001515182610c1f919061256b565b90505f610c3d83836f07fffffe0000000003ff200000000000611b06565b80925081945050505f80610c5686610240015184611ba2565b915091508115610ceb575f610c6b8783611c79565b90506123c45f610c79611ca8565b90505f60028251610c8a91906125a6565b9050808510610cbb576040516303bdd1b160e51b815260048101869052602481018290526044015b60405180910390fd5b6001850160020282015161ffff169250610cd48c8c8686565b9e509e509e50505050505050505050505050610d11565b5050604080515f80825281830190925260208101828152919a5090985096505050505050505b9193909250565b5f805f805f610d40866002810151815160228084019461ffff93909316840101920160200190565b505f988998509650505050505050565b60605f610d5f6006600161256b565b610d6a90600161256b565b610d7590600161256b565b6001600160401b03811115610d8c57610d8c61243c565b604051908082528060200260200182016040528015610dbf57816020015b6060815260200190600190039081610daa5790505b506040805160018082528183019092529192505f9190816020015b6123c4815260200190600190039081610dda579050509050611cc8815f81518110610e0757610e0761257e565b6001600160401b03929092166020928302919091019091015260408051600480825260a082019092525f91816020015b6123c4815260200190600190039081610e37579050509050611cc8815f81518110610e6457610e6461257e565b60200260200101906001600160401b031690816001600160401b031681525050611cc881600181518110610e9a57610e9a61257e565b60200260200101906001600160401b031690816001600160401b031681525050611cc881600281518110610ed057610ed061257e565b60200260200101906001600160401b031690816001600160401b031681525050611cc881600381518110610f0657610f0661257e565b6001600160401b039290921660209283029190910190910152604080516002808252606082019092525f91816020015b6123c4815260200190600190039081610f36579050509050611cc8815f81518110610f6357610f6361257e565b60200260200101906001600160401b031690816001600160401b031681525050611cc881600181518110610f9957610f9961257e565b6001600160401b03929092166020928302919091019091015260408051600580825260c082019092525f91816020015b6123c4815260200190600190039081610fc9579050509050611cc8815f81518110610ff657610ff661257e565b60200260200101906001600160401b031690816001600160401b031681525050611cc88160018151811061102c5761102c61257e565b60200260200101906001600160401b031690816001600160401b031681525050611cc8816002815181106110625761106261257e565b60200260200101906001600160401b031690816001600160401b031681525050611cc8816003815181106110985761109861257e565b60200260200101906001600160401b031690816001600160401b031681525050611cc8816004815181106110ce576110ce61257e565b6001600160401b03929092166020928302919091019091015260408051600580825260c082019092525f91816020015b6123c48152602001906001900390816110fe579050509050611cc8815f8151811061112b5761112b61257e565b60200260200101906001600160401b031690816001600160401b031681525050611cc8816001815181106111615761116161257e565b60200260200101906001600160401b031690816001600160401b031681525050611cc8816002815181106111975761119761257e565b60200260200101906001600160401b031690816001600160401b031681525050611cc8816003815181106111cd576111cd61257e565b60200260200101906001600160401b031690816001600160401b031681525050611cc8816004815181106112035761120361257e565b6001600160401b0392909216602092830291909101909101526040805160018082528183019092525f91816020015b6123c4815260200190600190039081611232579050509050611cf1815f8151811061125f5761125f61257e565b6001600160401b0392909216602092830291909101909101526040805160018082528183019092525f91816020015b6123c481526020019060019003908161128e579050509050611d8d815f815181106112bb576112bb61257e565b60200260200101906001600160401b031690816001600160401b03168152505086885f815181106112ee576112ee61257e565b6020026020010181905250858860018151811061130d5761130d61257e565b6020026020010181905250848860028151811061132c5761132c61257e565b6020026020010181905250838860038151811061134b5761134b61257e565b6020026020010181905250828860048151811061136a5761136a61257e565b602090810291909101015281886113836006600161256b565b815181106113935761139361257e565b602090810291909101015280886113ac6006600161256b565b6113b790600161256b565b815181106113c7576113c761257e565b602090810291909101015260408051600680825260e082019092525f91816020015b6123c48152602001906001900390816113e9579050509050611cc8815f815181106114165761141661257e565b60200260200101906001600160401b031690816001600160401b031681525050611cc88160018151811061144c5761144c61257e565b60200260200101906001600160401b031690816001600160401b031681525050611cc8816002815181106114825761148261257e565b60200260200101906001600160401b031690816001600160401b031681525050611cc8816003815181106114b8576114b861257e565b60200260200101906001600160401b031690816001600160401b031681525050611cc8816004815181106114ee576114ee61257e565b60200260200101906001600160401b031690816001600160401b031681525050611cc8816005815181106115245761152461257e565b60200260200101906001600160401b031690816001600160401b03168152505080896005815181106115585761155861257e565b602090810291909101015260408051600780825261010082019092525f91816020015b6123c481526020019060019003908161157b579050509050611cc8815f815181106115a8576115a861257e565b60200260200101906001600160401b031690816001600160401b031681525050611cc8816001815181106115de576115de61257e565b60200260200101906001600160401b031690816001600160401b031681525050611cc8816002815181106116145761161461257e565b60200260200101906001600160401b031690816001600160401b031681525050611cc88160038151811061164a5761164a61257e565b60200260200101906001600160401b031690816001600160401b031681525050611cc8816004815181106116805761168061257e565b60200260200101906001600160401b031690816001600160401b031681525050611cc8816005815181106116b6576116b661257e565b60200260200101906001600160401b031690816001600160401b031681525050611cc881600681518110610b7357610b7361257e565b5f6060806116fb5f6001611e45565b92509250925093509350939050565b5f6060806116fb60015f611e45565b5f6060806116fb600180611e45565b5f6060806116fb60016002611e45565b5f6060806116fb60016003611e45565b5f6060806116fb60025f611e45565b5f6060806116fb60026001611e45565b5f6060806116fb60035f611e45565b5f6060806116fb60036001611e45565b5f6060806116fb60036002611e45565b5f6060806116fb600380611e45565b5f6060806116fb60036004611e45565b5f6060806116fb60045f611e45565b5f6060806116fb60046001611e45565b5f6060806116fb60046002611e45565b5f6060806116fb60046003611e45565b5f6060806116fb600480611e45565b5f6060806116fb6118166006600161256b565b85611e45565b5f60608060ff8416600885901c611854826118396006600161256b565b61184490600161256b565b61184e919061256b565b82611e45565b945094509450505093509350939050565b5f6060806116fb600580611e45565b5f6060806116fb60055f611e45565b5f6060806116fb60056001611e45565b5f6060806116fb60056002611e45565b5f6060806116fb60056003611e45565b5f6060806116fb60056004611e45565b5f6060806116fb600680611e45565b5f6060806116fb60065f611e45565b5f6060806116fb60066001611e45565b5f6060806116fb60066002611e45565b5f6060806116fb60066003611e45565b5f6060806116fb60066004611e45565b5f6060806116fb60066005611e45565b6060815f61193e82611ec7565b949350505050565b60605f82516002026001600160401b038111156119655761196561243c565b6040519080825280601f01601f19166020018201604052801561198f576020820181803683370190505b50905061ffff80196020850160208651028101600285015b818310156119c9578051835186169085161781526020909201916002016119a7565b50939695505050505050565b60606040518060e0016040528060a2815260200161267160a29139905090565b606060405180606001604052806040815260200161263160409139905090565b5f80611aa46040518061026001604052805f81526020015f81526020015f81526020015f81526020015f81526020015f81526020015f80191681526020015f81526020015f81526020015f81526020015f81526020015f81526020015f80191681526020016060815260200160608152602001606081526020015f815260200160608152602001606081525090565b606061ffff600288015116935060ff600388015116925061ffff600588015116600588019750808852602081018801915050611af087878760405180602001604052805f815250611f35565b915080826101e001819052505093509350939050565b5f808060018187870360208111611b1d5780611b20565b60205b915050875192505b8519600184841a1b16158183101615611b4657600182019150611b28565b9681019660208290036008810293841c90931b92611b915760408051602081018590520160408051601f198184030181529082905263e47fe8b760e01b8252610cb29160040161242a565b50869350909150505b935093915050565b600182810180515f928392600560ff93909316602102870192830192909101835b81831015611c675760018301516021909301805190935f90819060ff168180611bec838e6120e6565b915091508186165f03611c0e575f809b509b5050505050505050505050611c72565b5f87611c1e600185038916612111565b016004028b015195505062ffffff9081169350841683039150611c529050575060019750601c1a9550611c72945050505050565b611c5b83612111565b84019350505050611bc3565b5f8095509550505050505b9250929050565b6101c08201516002828102820101516101e08401515f9261ffff9092169190611c9f9083565b95945050505050565b60606040518060600160405280604081526020016125f160409139905090565b5f81515f14611cea576040516304f8b58160e51b815260040160405180910390fd5b505f919050565b5f8151600103611d4e575060208101516001600160e01b038116601b0b60e082901d5f611d1f8383836121ca565b905061ffff811115611d4457604051631e4e01d760e21b815260040160405180910390fd5b9250611d88915050565b81515f03611d6f57604051630f16066b60e41b815260040160405180910390fd5b604051630358cd2160e31b815260040160405180910390fd5b919050565b5f8151600203611e2257602082015160408301516001600160e01b038216601b0b60e083901d5f611dbf8383836121ca565b6001600160e01b038516601b0b935060e085901d925090505f611de38484836121ca565b905060ff821180611df4575060ff81115b15611e1257604051631e4e01d760e21b815260040160405180910390fd5b60081b179450611d889350505050565b600282511015611d6f57604051630f16066b60e41b815260040160405180910390fd5b5f60608060ff851180611e58575060ff84115b15611e8057604051639b0f326160e01b81526004810186905260248101859052604401610cb2565b6040805160248101909152600386602383015385602283015360106021830153806020830153506004815260408051602081019091525f8152600197919650945092505050565b60605f611ed38361220c565b90505f611ee18260206125c5565b9050606060405190508160200181016040528281526020850160208651028101602083015b81831015611f2957602083515102806020855101835e6020939093019201611f06565b50919695505050505050565b611fc26040518061026001604052805f81526020015f81526020015f81526020015f81526020015f81526020015f81526020015f80191681526020015f81526020015f81526020015f81526020015f81526020015f81526020015f80191681526020016060815260200160608152602001606081526020015f815260200160608152602001606081525090565b5f6040518061026001604052805f81526020015f81526020015f81526020015f81526020015f81526020015f81526020015f801b81526020015f8152602001600481526020015f81526020015f81526020015f81526020015f801b815260200184815260200185815260200160046001600160401b038111156120475761204761243c565b604051908082528060200260200182016040528015612070578160200160208202803683370190505b5081525f602080830182905260408084018b905260609384018a90528051601f01601f19168281528083018252835161ffff191681178452855290840182905283018190529082018190526080820181905260a08201819052610120820181905261014082018190526102008201529050611c9f565b5f80825f528360205360215f2090506001815f1a1b915062ffffff8116611c72575060019250929050565b5f5f1982036121235750610100919050565b507f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f7f5555555555555555555555555555555555555555555555555555555555555555600183901c16909103600281901c7f3333333333333333333333333333333333333333333333333333333333333333908116911601600481901c01167f01010101010101010101010101010101010101010101010101010101010101010260f81c90565b5f805f6121d8868686612255565b91509150806122035760405162bc8ecf60e31b81526004810187905260248101869052604401610cb2565b50949350505050565b5f60208201602083510281015b8082101561224e57815151928301928084101561224257634e487b715f5260116020526024601cfd5b50602082019150612219565b5050919050565b5f805f85121561228257604051634a7d166b60e01b81526004810186905260248101859052604401610cb2565b845f0361229457505f90506001611b9a565b8460ff84168501858112156122cf5760405163c849483b60e01b8152600481018890526024810187905260ff86166044820152606401610cb2565b5f805f83121561231b57604c198312156122f2575f809550955050505050611b9a565b825f03600a0a915081848161230957612309612592565b0495505084029091149150611b9a9050565b5f8313156123b457604d8313156123585760405163c849483b60e01b8152600481018a90526024810189905260ff88166044820152606401610cb2565b82600a0a9150815f198161236e5761236e612592565b048411156123a25760405163c849483b60e01b8152600481018a90526024810189905260ff88166044820152606401610cb2565b5091909102925060019150611b9a9050565b8360019550955050505050611b9a565b6123cc6125dc565b565b5f602082840312156123de575f80fd5b81356001600160e01b0319811681146123f5575f80fd5b9392505050565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f6123f560208301846123fc565b634e487b7160e01b5f52604160045260245ffd5b5f60208284031215612460575f80fd5b81356001600160401b0380821115612476575f80fd5b818401915084601f830112612489575f80fd5b81358181111561249b5761249b61243c565b604051601f8201601f19908116603f011681019083821181831017156124c3576124c361243c565b816040528281528760208487010111156124db575f80fd5b826020860160208301375f928101602001929092525095945050505050565b83151581525f60206060602084015261251660608401866123fc565b8381036040850152845180825260208087019201905f5b818110156125495783518352928401929184019160010161252d565b509098975050505050505050565b634e487b7160e01b5f52601160045260245ffd5b808201808211156101d1576101d1612557565b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52601260045260245ffd5b5f826125c057634e487b7160e01b5f52601260045260245ffd5b500490565b80820281158282048414176101d1576101d1612557565b634e487b7160e01b5f52605160045260245ffdfe16ec170a17191728173817481757176717761786179617a517b517c417d417e417f4186518741883189318a318b318c318d218e118f11901191119211803181c1cc81cc81cc81cc81cc81cc81cc81cc81cc81cc81cc81cc81cc81cc81cc81cc81cc81cc81cc81cc81cc81cc81cc81cc81cc81cc81cc81cc81cc81cc81cf11d8d0101180010800082000100010480300038412a001810000010020004200004002038028ff54904cc66c61df3dcab0616592209895f0b14fec9301902e0920c5bfe561b21609200e959460b1974270f844db208bcd3bf1c9893761e1049db11b93430180ae9a00af82a7805c138f40d28083f0742ef2103d561fd1215a13315716a6117d260cc107b9bfc0eec7ade13cba2891a6b14a51f792bdb01e0f14716565589", "linkReferences": {} } } diff --git a/src/generated/RaindexV6SubParserPointers.sol b/src/generated/RaindexV6SubParserPointers.sol index 7de264f929..b11d772ce6 100644 --- a/src/generated/RaindexV6SubParserPointers.sol +++ b/src/generated/RaindexV6SubParserPointers.sol @@ -5,7 +5,7 @@ pragma solidity ^0.8.25; // THIS FILE IS AUTOGENERATED BY THE BUILD SCRIPT. DO NOT EDIT BY HAND. /// @dev Hash of the known bytecode. -bytes32 constant BYTECODE_HASH = bytes32(0xb1b4649132a7ad03265562c1a423ea9c47c1c19d24882c98827e8f5c9b3fd439); +bytes32 constant BYTECODE_HASH = bytes32(0xfaadc632ff51c921c614024250a4da3c52780d22d85a928ec8e2f32b21a84ebd); /// @dev The hash of the meta that describes the contract. bytes32 constant DESCRIBED_BY_META_HASH = bytes32(0xe43208b51e17b3d887e8f3535d75526c0744eee6a200dac603462c6b3ca46511); @@ -39,13 +39,13 @@ uint8 constant PARSE_META_BUILD_DEPTH = 1; /// to things that happen entirely on the interpreter such as well known /// constants and references to the context grid. bytes constant SUB_PARSER_WORD_PARSERS = - hex"168216a016af16be16ce16de16ed16fd170c171c172c173b174b175a176a177a178a17da17e917f81808181818281838184718561866187618861896179917a8"; + hex"16ec170a17191728173817481757176717761786179617a517b517c417d417e417f4186518741883189318a318b318c318d218e118f11901191119211803181c"; /// @dev Every two bytes is a function pointer for an operand handler. /// These positional indexes all map to the same indexes looked up in the parse /// meta. bytes constant OPERAND_HANDLER_FUNCTION_POINTERS = - hex"1c3d1c3d1c3d1c3d1c3d1c3d1c3d1c3d1c3d1c3d1c3d1c3d1c3d1c3d1c3d1c3d1c3d1c3d1c3d1c3d1c3d1c3d1c3d1c3d1c3d1c3d1c3d1c3d1c3d1c3d1c661d02"; + hex"1cc81cc81cc81cc81cc81cc81cc81cc81cc81cc81cc81cc81cc81cc81cc81cc81cc81cc81cc81cc81cc81cc81cc81cc81cc81cc81cc81cc81cc81cc81cf11d8d"; /// @dev Every two bytes is a function pointer for a literal parser. /// Literal dispatches are determined by the first byte(s) of the literal diff --git a/src/generated/candidate/GenericPoolRaindexV6ArbOrderTaker.sol b/src/generated/candidate/GenericPoolRaindexV6ArbOrderTaker.sol index 5a2277fd93..53312e082c 100644 --- a/src/generated/candidate/GenericPoolRaindexV6ArbOrderTaker.sol +++ b/src/generated/candidate/GenericPoolRaindexV6ArbOrderTaker.sol @@ -5,23 +5,23 @@ pragma solidity ^0.8.25; // THIS FILE IS AUTOGENERATED BY THE BUILD SCRIPT. DO NOT EDIT BY HAND. /// @dev Hash of the known bytecode. -bytes32 constant BYTECODE_HASH = bytes32(0xe4ed1789f1c0ca71f79ac988892af9173dd35faec03c00fd0f1ac315964b1ad4); +bytes32 constant BYTECODE_HASH = bytes32(0x5ca22e5ff18d719a66d18e5f4f4676f9b7ac555f18ac15bd28d8e3eed6c3dce6); /// @dev The deterministic deploy address of the contract when deployed via /// the Zoltu factory. -address constant DEPLOYED_ADDRESS = address(0x54ff1b8C0EF23294e3B06ba476b14c07C93A5399); +address constant DEPLOYED_ADDRESS = address(0xAFa3Ed6FB28ea3A06cA8E550687084b4a01624e9); /// @dev The creation bytecode of the contract. bytes constant CREATION_CODE = - hex"6080604052348015600e575f80fd5b5060017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00556124c7806100405f395ff3fe608060405260043610610034575f3560e01c806301ffc9a71461003d578063691f9ed714610070578063b17c83c11461008f57005b3661003b57005b005b348015610048575f80fd5b5061005c610057366004611742565b6100a2565b604051901515815260200160405180910390f35b34801561007b575f80fd5b5061003b61008a36600461177d565b6100f3565b61003b61009d36600461181f565b610148565b5f6001600160e01b0319821663691f9ed760e01b14806100d257506001600160e01b0319821663b17c83c160e01b145b806100ed57506301ffc9a760e01b6001600160e01b03198316145b92915050565b61010186868686868661040a565b6101408683838080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525061046f92505050565b505050505050565b610150610520565b61015f61015c82611b0e565b50565b61016c6080830183611bca565b90505f0361018d57604051639c95219f60e01b815260040160405180910390fd5b6001600160a01b03831673522a6b8d2cd1e44d53475516fd3c55bc29a0e865146101da5760405163516e822d60e01b81526001600160a01b03841660048201526024015b60405180910390fd5b5f6101e86080840184611bca565b5f8181106101f8576101f8611c10565b905060200281019061020a9190611c24565b6102149080611c42565b610222906040810190611c56565b61022f6080860186611bca565b5f81811061023f5761023f611c10565b90506020028101906102519190611c24565b6020013581811061026457610264611c10565b61027a9260206040909202019081019150611c9c565b90505f61028a6080850185611bca565b5f81811061029a5761029a611c10565b90506020028101906102ac9190611c24565b6102b69080611c42565b6102c4906060810190611c56565b6102d16080870187611bca565b5f8181106102e1576102e1611c10565b90506020028101906102f39190611c24565b6040013581811061030657610306611c10565b61031c9260206040909202019081019150611c9c565b90506103336001600160a01b038316865f1961054e565b6040516334e3942b60e11b81526001600160a01b038616906369c728569061035f908790600401611f00565b60408051808303815f875af115801561037a573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061039e9190612100565b506103b590506001600160a01b038316865f61054e565b6103da6103c184611b0e565b836103cb856105c8565b846103d5866105c8565b61064c565b505061040560017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b505050565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0054600214801561044f57503373522a6b8d2cd1e44d53475516fd3c55bc29a0e86514155b156101405760405163f6688adf60e01b81523360048201526024016101d1565b5f805f838060200190518101906104869190612122565b919450925090506001600160a01b0383166104b4576040516398521dc560e01b815260040160405180910390fd5b6001600160a01b0382166104db5760405163456ac4c360e11b815260040160405180910390fd5b6104f06001600160a01b038616845f1961054e565b6105046001600160a01b038316824761089d565b506105196001600160a01b038616845f61054e565b5050505050565b61052861096a565b60027f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b61055a8383835f6109ae565b6104055761056b83835f60016109ae565b61059357604051635274afe760e01b81526001600160a01b03841660048201526024016101d1565b6105a083838360016109ae565b61040557604051635274afe760e01b81526001600160a01b03841660048201526024016101d1565b5f6105d1610a10565b6040516354636d2b60e01b81526001600160a01b038316600482015273200e12d10bb0c5e4a17e7018f0f1161919bb9389906354636d2b906024016020604051808303815f875af1158015610628573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906100ed91906121bd565b604080516003808252608082019092525f9160208201606080368337019050506040516370a0823160e01b81523060048201529091505f906001600160a01b038716906370a0823190602401602060405180830381865afa1580156106b3573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106d791906121dd565b905080156106f3576106f36001600160a01b0387163383610a9b565b5f6106fe8287610aa8565b50905080835f8151811061071457610714611c10565b602090810291909101015250506040516370a0823160e01b81523060048201525f906001600160a01b038516906370a0823190602401602060405180830381865afa158015610765573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061078991906121dd565b905080156107a5576107a56001600160a01b0385163383610a9b565b5f6107b08285610aa8565b50905080836001815181106107c7576107c7611c10565b60209081029190910101525047905080156107e6576107e63382610ae9565b5f6107f2826012610aa8565b509050808360028151811061080957610809611c10565b602090810291909101015250506040805160018082528183019092525f91816020015b6040805160a0810182525f918101828152606080830193909352608082018390528152602081019190915281526020019060019003908161082c57905050905086815f8151811061087f5761087f611c10565b60200260200101819052506108948282610b47565b50505050505050565b6060814710156108c95760405163cf47918160e01b8152476004820152602481018390526044016101d1565b5f6108d5858486610b5c565b90508080156108f657505f3d11806108f657505f856001600160a01b03163b115b1561090b57610903610b71565b915050610963565b801561093557604051639996b31560e01b81526001600160a01b03861660048201526024016101d1565b3d1561094857610943610b8a565b610961565b60405163d6bda27560e01b815260040160405180910390fd5b505b9392505050565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00546002036109ac57604051633ee5aeb560e01b815260040160405180910390fd5b565b60405163095ea7b360e01b5f8181526001600160a01b038616600452602485905291602083604481808b5af1925060015f51148316610a045783831516156109f8573d5f823e3d81fd5b5f873b113d1516831692505b60405250949350505050565b73200e12d10bb0c5e4a17e7018f0f1161919bb93893b1580610a67575073200e12d10bb0c5e4a17e7018f0f1161919bb93893f7f1de7d717526cba131d684e312dedbf0852adef9cced9e36798ae4937f7145d4114155b156109ac576040516373e6d7b360e01b815273200e12d10bb0c5e4a17e7018f0f1161919bb938960048201526024016101d1565b6105a08383836001610b95565b5f805f805f610ab78787610bdf565b9250925092505f80610ac98585610c3b565b9150915081838015610ad85750815b9650965050505050505b9250929050565b80471015610b135760405163cf47918160e01b8152476004820152602481018290526044016101d1565b610b2c828260405180602001604052805f815250610b5c565b15610b35575050565b3d1561094857610b43610b8a565b5050565b610b43610b55600784610eae565b825f610f10565b5f805f83516020850186885af1949350505050565b6040513d81523d5f602083013e3d602001810160405290565b6040513d5f823e3d81fd5b60405163a9059cbb60e01b5f8181526001600160a01b038616600452602485905291602083604481808b5af1925060015f51148316610a045783831516156109f8573d5f823e3d81fd5b5f808060ff841681037f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff861115610c2a57600a860460018201600a88065f1493509350935050610c34565b8593509150600190505b9250925092565b5f808383601b82900b821480610d86577d90e40fbeea1d3a4abc8955e946fe31cdcf66f634e1000000000000000000870515610cbc577f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee8000000000000000000870515610cad576305f5e10087059650600886019550610cbc565b620186a0870596506005860195505b8687601b0b14610cd757600a87059650856001019550610cbc565b7b0ccccccccccccccccccccccccccccccccccccccccccccccccccccccc7b1999999999999999999999999999999999999999999999999999999888820111610d80575f600188039050808160030b03610d7e5760e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff7b7fffffffffffffffffffffffffffffffffffffffffffffffffffffff60ff8b901d18161795505f9450610ae29350505050565b505b50610d9d565b865f03610d9d57505f935060019250610ae2915050565b858660030b14610e54575f821315610dfc57610db983836111c4565b15610de15760405163d556b11160e01b815260048101849052602481018390526044016101d1565b637ffffffe19909501600a0a82029550637fffffff94610e54565b637fffffff198690036043811315610e1e57505f9450849350610ae292505050565b80600a0a8881610e3057610e306121f4565b059750875f03610e4a57505f9450849350610ae292505050565b50637fffffff1995505b818613610e645760019350610e7d565b818603600a0a8381610e7857610e786121f4565b071593505b5050507bffffffffffffffffffffffffffffffffffffffffffffffffffffffff841660e084901b1791509250929050565b60408051600780825261010082019092526060915f9190816020015b6060815260200190600190039081610eca5790505090508281610eee600187612208565b81518110610efe57610efe611c10565b60209081029190910101529392505050565b60408051600780825261010082019092525f91816020015b6060815260200190600190039081610f285790505090505f5b8451811015610f8957848181518110610f5c57610f5c611c10565b6020026020010151828281518110610f7657610f76611c10565b6020908102919091010152600101610f41565b50335f8181523060209081526040808320815160a0810183528083018581526060808301879052608083018190529082528185015282518581529384018581528484019093529093909291905b88518110156111b857888181518110610ff157610ff1611c10565b602002602001015193505f845f0151604001515111156111b0575f61101a8886602001516111df565b90508861108d5761106f815f8151811061103657611036611c10565b60200260200101515f8151811061104f5761104f611c10565b602002602001015160408051600181526020810192909252818101905290565b815f8151811061108157611081611c10565b60200260200101819052505b8451516040805160e08101825287516020908101516001600160a01b0390811683529082018a90528851830151828401525f606083018190526080830186905260a0830189905260c08301889052925163d04dfe2360e01b81529293169163d04dfe23916110fd916004016122dc565b5f60405180830381865afa158015611117573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261113e91908101906123dd565b9150505f815111156111ad5785516020015160405163012c676d60e21b81526001600160a01b03909116906304b19db49061117f908b908590600401612493565b5f604051808303815f87803b158015611196575f80fd5b505af11580156111a8573d5f803e3d5ffd5b505050505b50505b600101610fd6565b50505050505050505050565b5f6109635f84126111d557836111d9565b835f035b836114c1565b60605f825167ffffffffffffffff8111156111fc576111fc61189d565b604051908082528060200260200182016040528015611225578160200160208202803683370190505b5090505f80845111611237575f61123d565b83516001015b85516001010190505f8167ffffffffffffffff81111561125f5761125f61189d565b60405190808252806020026020018201604052801561129257816020015b606081526020019060019003908161127d5790505b5090505f6112b6604080516002815233602082015230818301526060810190915290565b8282815181106112c8576112c8611c10565b60200260200101819052505f5b87518110156113255781806001019250508781815181106112f8576112f8611c10565b602002602001015183838151811061131257611312611c10565b60209081029190910101526001016112d5565b508551156114b75780806001019150508382828151811061134857611348611c10565b60200260200101819052505f5b86518110156114b55761140487828151811061137357611373611c10565b60200260200101515f01516113e16113af8a858151811061139657611396611c10565b6020026020010151602001518051602090810291012090565b7f19457468657265756d205369676e6564204d6573736167653a0a3332000000005f908152601c91909152603c902090565b8984815181106113f3576113f3611c10565b60200260200101516040015161155f565b61142457604051630a57f30960e31b8152600481018290526024016101d1565b86818151811061143657611436611c10565b60200260200101515f01516001600160a01b03165f1b85828151811061145e5761145e611c10565b602002602001018181525050818060010192505086818151811061148457611484611c10565b6020026020010151602001518383815181106114a2576114a2611c10565b6020908102919091010152600101611355565b505b5095945050505050565b5f637ffffff582136114d457505f6100ed565b637ffffffe19820160438113156114ef5750508115156100ed565b5f811261152f5780600a0a7b8000000000000000000000000000000000000000000000000000000181611524576115246121f4565b0484119150506100ed565b805f03600a0a7b800000000000000000000000000000000000000000000000000000020284101591505092915050565b5f836001600160a01b03163b5f036115bd575f8061157d85856115cf565b5090925090505f816003811115611596576115966124b3565b1480156115b45750856001600160a01b0316826001600160a01b0316145b92505050610963565b6115c8848484611615565b9050610963565b5f805f8351604103611606576020840151604085015160608601515f1a6115f88882858561167a565b955095509550505050610c34565b505081515f9150600290610c34565b805160408051630b135d3f60e11b8082526004820186905260248201929092525f92906020820185604483015e5f82606483010152601f820160051c60051b915060205f60648401838a5afa9050825f5114601f3d1116811693505050509392505050565b5f80807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08411156116b357505f91506003905082611738565b604080515f808252602082018084528a905260ff891692820192909252606081018790526080810186905260019060a0016020604051602081039080840390855afa158015611704573d5f803e3d5ffd5b5050604051601f1901519150506001600160a01b03811661172f57505f925060019150829050611738565b92505f91508190505b9450945094915050565b5f60208284031215611752575f80fd5b81356001600160e01b031981168114610963575f80fd5b6001600160a01b038116811461015c575f80fd5b5f805f805f8060a08789031215611792575f80fd5b863561179d81611769565b955060208701356117ad81611769565b94506040870135935060608701359250608087013567ffffffffffffffff808211156117d7575f80fd5b818901915089601f8301126117ea575f80fd5b8135818111156117f8575f80fd5b8a6020828501011115611809575f80fd5b6020830194508093505050509295509295509295565b5f805f60608486031215611831575f80fd5b833561183c81611769565b9250602084013567ffffffffffffffff80821115611858575f80fd5b9085019060c0828803121561186b575f80fd5b90925060408501359080821115611880575f80fd5b50840160408187031215611892575f80fd5b809150509250925092565b634e487b7160e01b5f52604160045260245ffd5b6040516060810167ffffffffffffffff811182821017156118d4576118d461189d565b60405290565b6040805190810167ffffffffffffffff811182821017156118d4576118d461189d565b604051601f8201601f1916810167ffffffffffffffff811182821017156119265761192661189d565b604052919050565b5f67ffffffffffffffff8211156119475761194761189d565b50601f01601f191660200190565b5f82601f830112611964575f80fd5b81356119776119728261192e565b6118fd565b81815284602083860101111561198b575f80fd5b816020850160208301375f918101602001919091529392505050565b5f67ffffffffffffffff8211156119c0576119c061189d565b5060051b60200190565b5f82601f8301126119d9575f80fd5b813560206119e9611972836119a7565b82815260059290921b84018101918181019086841115611a07575f80fd5b8286015b84811015611b0357803567ffffffffffffffff80821115611a2a575f80fd5b908801906060828b03601f19011215611a41575f80fd5b611a496118b1565b86830135611a5681611769565b815260408381013583811115611a6a575f80fd5b8401603f81018d13611a7a575f80fd5b88810135611a8a611972826119a7565b81815260059190911b82018301908a8101908f831115611aa8575f80fd5b928401925b82841015611ac65783358252928b0192908b0190611aad565b858c0152505050606084013583811115611ade575f80fd5b611aec8d8a83880101611955565b918301919091525085525050918301918301611a0b565b509695505050505050565b5f60408236031215611b1e575f80fd5b611b266118da565b823567ffffffffffffffff80821115611b3d575f80fd5b818501915060608236031215611b51575f80fd5b611b596118b1565b8235611b6481611769565b81526020830135611b7481611769565b6020820152604083013582811115611b8a575f80fd5b611b9636828601611955565b60408301525083526020850135915080821115611bb1575f80fd5b50611bbe368286016119ca565b60208301525092915050565b5f808335601e19843603018112611bdf575f80fd5b83018035915067ffffffffffffffff821115611bf9575f80fd5b6020019150600581901b3603821315610ae2575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235607e19833603018112611c38575f80fd5b9190910192915050565b5f8235609e19833603018112611c38575f80fd5b5f808335601e19843603018112611c6b575f80fd5b83018035915067ffffffffffffffff821115611c85575f80fd5b6020019150600681901b3603821315610ae2575f80fd5b5f60208284031215611cac575f80fd5b813561096381611769565b5f808335601e19843603018112611ccc575f80fd5b830160208101925035905067ffffffffffffffff811115611ceb575f80fd5b8060051b3603821315610ae2575f80fd5b5f8235605e19833603018112611d10575f80fd5b90910192915050565b5f808335601e19843603018112611d2e575f80fd5b830160208101925035905067ffffffffffffffff811115611d4d575f80fd5b803603821315610ae2575f80fd5b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b5f808335601e19843603018112611d98575f80fd5b830160208101925035905067ffffffffffffffff811115611db7575f80fd5b8060061b3603821315610ae2575f80fd5b8183525f60208085019450825f5b85811015611e0e578135611de981611769565b6001600160a01b03168752818301358388015260409687019690910190600101611dd6565b509495945050505050565b8183526020808401935f91600585811b8301820185855b88811015611ef257858303601f19018a52611e4b8289611cfc565b60608135611e5881611769565b6001600160a01b03168552611e6f82880183611cb7565b82898801528083880152608092507f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811115611ea9575f80fd5b871b808288850137860190506040611ec384820185611d19565b9450838884030182890152611edb8484018683611d5b565b9e8a019e9750505093870193505050600101611e30565b509098975050505050505050565b5f602080835260e08301843582850152604082860135818601526060818701358187015280870135801515808214611f36575f80fd5b8060808901525050611f4b6080880188611cb7565b60c060a08901529384905261010093848801600582901b89018601835f5b848110156120c7578b830360ff19018452813536879003607e19018112611f8e575f80fd5b8601803536829003609e19018112611fa4575f80fd5b6080855281018035611fb581611769565b6001600160a01b038082166080880152611fd18e840184611cfc565b915060a0808801528135611fe481611769565b8116610120880152818e0135611ff981611769565b1661014087015261200c818c0182611d19565b91508a61016088015261202461018088018383611d5b565b9150506120338b830183611d83565b607f19808985030160c08a015261204b848385611dc8565b93506120598d860186611d83565b93509150808985030160e08a015250612073838383611dc8565b9250505060808201358c8701528c8301358d8701528a8301358b87015261209c8a840184611cb7565b935091508581038a8701526120b2818484611e19565b968d019695505050918a019150600101611f69565b50506120d660a08c018c611d19565b8b8303601f190160c08d0152985096506120f1818989611d5b565b9b9a5050505050505050505050565b5f8060408385031215612111575f80fd5b505080516020909101519092909150565b5f805f60608486031215612134575f80fd5b835161213f81611769565b602085015190935061215081611769565b604085015190925067ffffffffffffffff81111561216c575f80fd5b8401601f8101861361217c575f80fd5b805161218a6119728261192e565b81815287602083850101111561219e575f80fd5b8160208401602083015e5f602083830101528093505050509250925092565b5f602082840312156121cd575f80fd5b815160ff81168114610963575f80fd5b5f602082840312156121ed575f80fd5b5051919050565b634e487b7160e01b5f52601260045260245ffd5b818103818111156100ed57634e487b7160e01b5f52601160045260245ffd5b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b5f815180845260208085019450602084015f5b83811015611e0e57815187529582019590820190600101612268565b5f8282518085526020808601955060208260051b840101602086015f5b848110156122cf57601f198684030189526122bd838351612255565b988401989250908301906001016122a1565b5090979650505050505050565b602081526001600160a01b038251166020820152602082015160408201525f604083015160e06060840152612315610100840182612227565b9050606084015160808401526080840151601f19808584030160a086015261233d8383612284565b925060a08601519150808584030160c086015261235a8383612255565b925060c08601519150808584030160e0860152506123788282612255565b95945050505050565b5f82601f830112612390575f80fd5b815160206123a0611972836119a7565b8083825260208201915060208460051b8701019350868411156123c1575f80fd5b602086015b84811015611b0357805183529183019183016123c6565b5f80604083850312156123ee575f80fd5b825167ffffffffffffffff80821115612405575f80fd5b818501915085601f830112612418575f80fd5b81516020612428611972836119a7565b82815260059290921b84018101918181019089841115612446575f80fd5b948201945b838610156124645785518252948201949082019061244b565b9188015191965090935050508082111561247c575f80fd5b5061248985828601612381565b9150509250929050565b828152604060208201525f6124ab6040830184612255565b949350505050565b634e487b7160e01b5f52602160045260245ffd"; + hex"6080604052348015600e575f80fd5b5060017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055612413806100405f395ff3fe608060405260043610610034575f3560e01c806301ffc9a71461003d578063691f9ed714610070578063b17c83c11461008f57005b3661003b57005b005b348015610048575f80fd5b5061005c6100573660046116ad565b6100a2565b604051901515815260200160405180910390f35b34801561007b575f80fd5b5061003b61008a3660046116e8565b6100f3565b61003b61009d36600461178a565b610148565b5f6001600160e01b0319821663691f9ed760e01b14806100d257506001600160e01b0319821663b17c83c160e01b145b806100ed57506301ffc9a760e01b6001600160e01b03198316145b92915050565b61010186868686868661040a565b6101408683838080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525061046f92505050565b505050505050565b610150610520565b61015f61015c82611a79565b50565b61016c6080830183611b35565b90505f0361018d57604051639c95219f60e01b815260040160405180910390fd5b6001600160a01b0383167350ad4ff129155d8f584deda447b11b4f5138840d146101da5760405163516e822d60e01b81526001600160a01b03841660048201526024015b60405180910390fd5b5f6101e86080840184611b35565b5f8181106101f8576101f8611b7b565b905060200281019061020a9190611b8f565b6102149080611bad565b610222906040810190611bc1565b61022f6080860186611b35565b5f81811061023f5761023f611b7b565b90506020028101906102519190611b8f565b6020013581811061026457610264611b7b565b61027a9260206040909202019081019150611c07565b90505f61028a6080850185611b35565b5f81811061029a5761029a611b7b565b90506020028101906102ac9190611b8f565b6102b69080611bad565b6102c4906060810190611bc1565b6102d16080870187611b35565b5f8181106102e1576102e1611b7b565b90506020028101906102f39190611b8f565b6040013581811061030657610306611b7b565b61031c9260206040909202019081019150611c07565b90506103336001600160a01b038316865f1961054e565b6040516334e3942b60e11b81526001600160a01b038616906369c728569061035f908790600401611e6b565b60408051808303815f875af115801561037a573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061039e919061206b565b506103b590506001600160a01b038316865f61054e565b6103da6103c184611a79565b836103cb856105c8565b846103d5866105c8565b61064c565b505061040560017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b505050565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0054600214801561044f5750337350ad4ff129155d8f584deda447b11b4f5138840d14155b156101405760405163f6688adf60e01b81523360048201526024016101d1565b5f805f83806020019051810190610486919061208d565b919450925090506001600160a01b0383166104b4576040516398521dc560e01b815260040160405180910390fd5b6001600160a01b0382166104db5760405163456ac4c360e11b815260040160405180910390fd5b6104f06001600160a01b038616845f1961054e565b6105046001600160a01b03831682476108eb565b506105196001600160a01b038616845f61054e565b5050505050565b6105286109b8565b60027f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b61055a8383835f6109fc565b6104055761056b83835f60016109fc565b61059357604051635274afe760e01b81526001600160a01b03841660048201526024016101d1565b6105a083838360016109fc565b61040557604051635274afe760e01b81526001600160a01b03841660048201526024016101d1565b5f6105d1610a5e565b6040516354636d2b60e01b81526001600160a01b038316600482015273200e12d10bb0c5e4a17e7018f0f1161919bb9389906354636d2b906024016020604051808303815f875af1158015610628573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906100ed9190612128565b6040805160018082528183019092525f91816020015b6060815260200190600190039081610662575050604080516003808252608082019092529192505f919060208201606080368337019050506040516370a0823160e01b81523060048201529091505f906001600160a01b038816906370a0823190602401602060405180830381865afa1580156106e1573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107059190612148565b90508015610721576107216001600160a01b0388163383610ae9565b5f61072c8288610af6565b50905080835f8151811061074257610742611b7b565b602090810291909101015250506040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa158015610793573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107b79190612148565b905080156107d3576107d36001600160a01b0386163383610ae9565b5f6107de8286610af6565b50905080836001815181106107f5576107f5611b7b565b6020908102919091010152504790508015610814576108143382610b37565b5f610820826012610af6565b509050808360028151811061083757610837611b7b565b602002602001018181525050505080825f8151811061085857610858611b7b565b60209081029190910101526040805160018082528183019092525f91816020015b6040805160a0810182525f918101828152606080830193909352608082018390528152602081019190915281526020019060019003908161087957905050905087815f815181106108cc576108cc611b7b565b60200260200101819052506108e18382610b95565b5050505050505050565b6060814710156109175760405163cf47918160e01b8152476004820152602481018390526044016101d1565b5f610923858486610ddd565b905080801561094457505f3d118061094457505f856001600160a01b03163b115b1561095957610951610df2565b9150506109b1565b801561098357604051639996b31560e01b81526001600160a01b03861660048201526024016101d1565b3d1561099657610991610e0b565b6109af565b60405163d6bda27560e01b815260040160405180910390fd5b505b9392505050565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00546002036109fa57604051633ee5aeb560e01b815260040160405180910390fd5b565b60405163095ea7b360e01b5f8181526001600160a01b038616600452602485905291602083604481808b5af1925060015f51148316610a52578383151615610a46573d5f823e3d81fd5b5f873b113d1516831692505b60405250949350505050565b73200e12d10bb0c5e4a17e7018f0f1161919bb93893b1580610ab5575073200e12d10bb0c5e4a17e7018f0f1161919bb93893f7f1de7d717526cba131d684e312dedbf0852adef9cced9e36798ae4937f7145d4114155b156109fa576040516373e6d7b360e01b815273200e12d10bb0c5e4a17e7018f0f1161919bb938960048201526024016101d1565b6105a08383836001610e16565b5f805f805f610b058787610e60565b9250925092505f80610b178585610ebc565b9150915081838015610b265750815b9650965050505050505b9250929050565b80471015610b615760405163cf47918160e01b8152476004820152602481018290526044016101d1565b610b7a828260405180602001604052805f815250610ddd565b15610b83575050565b3d1561099657610b91610e0b565b5050565b60408051600680825260e082019092525f91816020015b6060815260200190600190039081610bac5790505090505f5b8351811015610c0d57838181518110610be057610be0611b7b565b6020026020010151828281518110610bfa57610bfa611b7b565b6020908102919091010152600101610bc5565b50335f8181523060209081526040808320815160a0810183528083018581526060808301879052608083018190529082528185015282518581529384018581528484019093529093909291905b8751811015610dd257878181518110610c7557610c75611b7b565b602002602001015193505f845f015160400151511115610dca575f845f01515f01516001600160a01b031663d04dfe236040518060e00160405280885f0151602001516001600160a01b03168152602001898152602001885f01516040015181526020015f8152602001610ced8c8a6020015161112f565b8152602001878152602001868152506040518263ffffffff1660e01b8152600401610d189190612214565b5f60405180830381865afa158015610d32573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610d599190810190612315565b9150505f81511115610dc85784516020015160405163012c676d60e21b81526001600160a01b03909116906304b19db490610d9a908a9085906004016123cb565b5f604051808303815f87803b158015610db1575f80fd5b505af1158015610dc3573d5f803e3d5ffd5b505050505b505b600101610c5a565b505050505050505050565b5f805f83516020850186885af1949350505050565b6040513d81523d5f602083013e3d602001810160405290565b6040513d5f823e3d81fd5b60405163a9059cbb60e01b5f8181526001600160a01b038616600452602485905291602083604481808b5af1925060015f51148316610a52578383151615610a46573d5f823e3d81fd5b5f808060ff841681037f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff861115610eab57600a860460018201600a88065f1493509350935050610eb5565b8593509150600190505b9250925092565b5f808383601b82900b821480611007577d90e40fbeea1d3a4abc8955e946fe31cdcf66f634e1000000000000000000870515610f3d577f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee8000000000000000000870515610f2e576305f5e10087059650600886019550610f3d565b620186a0870596506005860195505b8687601b0b14610f5857600a87059650856001019550610f3d565b7b0ccccccccccccccccccccccccccccccccccccccccccccccccccccccc7b1999999999999999999999999999999999999999999999999999999888820111611001575f600188039050808160030b03610fff5760e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff7b7fffffffffffffffffffffffffffffffffffffffffffffffffffffff60ff8b901d18161795505f9450610b309350505050565b505b5061101e565b865f0361101e57505f935060019250610b30915050565b858660030b146110d5575f82131561107d5761103a8383611411565b156110625760405163d556b11160e01b815260048101849052602481018390526044016101d1565b637ffffffe19909501600a0a82029550637fffffff946110d5565b637fffffff19869003604381131561109f57505f9450849350610b3092505050565b80600a0a88816110b1576110b16123eb565b059750875f036110cb57505f9450849350610b3092505050565b50637fffffff1995505b8186136110e557600193506110fe565b818603600a0a83816110f9576110f96123eb565b071593505b5050507bffffffffffffffffffffffffffffffffffffffffffffffffffffffff841660e084901b1791509250929050565b60605f825167ffffffffffffffff81111561114c5761114c611808565b604051908082528060200260200182016040528015611175578160200160208202803683370190505b5090505f80845111611187575f61118d565b83516001015b85516001010190505f8167ffffffffffffffff8111156111af576111af611808565b6040519080825280602002602001820160405280156111e257816020015b60608152602001906001900390816111cd5790505b5090505f611206604080516002815233602082015230818301526060810190915290565b82828151811061121857611218611b7b565b60200260200101819052505f5b875181101561127557818060010192505087818151811061124857611248611b7b565b602002602001015183838151811061126257611262611b7b565b6020908102919091010152600101611225565b508551156114075780806001019150508382828151811061129857611298611b7b565b60200260200101819052505f5b8651811015611405576113548782815181106112c3576112c3611b7b565b60200260200101515f01516113316112ff8a85815181106112e6576112e6611b7b565b6020026020010151602001518051602090810291012090565b7f19457468657265756d205369676e6564204d6573736167653a0a3332000000005f908152601c91909152603c902090565b89848151811061134357611343611b7b565b60200260200101516040015161142c565b61137457604051630a57f30960e31b8152600481018290526024016101d1565b86818151811061138657611386611b7b565b60200260200101515f01516001600160a01b03165f1b8582815181106113ae576113ae611b7b565b60200260200101818152505081806001019250508681815181106113d4576113d4611b7b565b6020026020010151602001518383815181106113f2576113f2611b7b565b60209081029190910101526001016112a5565b505b5095945050505050565b5f6109b15f84126114225783611426565b835f035b8361149c565b5f836001600160a01b03163b5f0361148a575f8061144a858561153a565b5090925090505f816003811115611463576114636123ff565b1480156114815750856001600160a01b0316826001600160a01b0316145b925050506109b1565b611495848484611580565b90506109b1565b5f637ffffff582136114af57505f6100ed565b637ffffffe19820160438113156114ca5750508115156100ed565b5f811261150a5780600a0a7b80000000000000000000000000000000000000000000000000000001816114ff576114ff6123eb565b0484119150506100ed565b805f03600a0a7b800000000000000000000000000000000000000000000000000000020284101591505092915050565b5f805f8351604103611571576020840151604085015160608601515f1a611563888285856115e5565b955095509550505050610eb5565b505081515f9150600290610eb5565b805160408051630b135d3f60e11b8082526004820186905260248201929092525f92906020820185604483015e5f82606483010152601f820160051c60051b915060205f60648401838a5afa9050825f5114601f3d1116811693505050509392505050565b5f80807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a084111561161e57505f915060039050826116a3565b604080515f808252602082018084528a905260ff891692820192909252606081018790526080810186905260019060a0016020604051602081039080840390855afa15801561166f573d5f803e3d5ffd5b5050604051601f1901519150506001600160a01b03811661169a57505f9250600191508290506116a3565b92505f91508190505b9450945094915050565b5f602082840312156116bd575f80fd5b81356001600160e01b0319811681146109b1575f80fd5b6001600160a01b038116811461015c575f80fd5b5f805f805f8060a087890312156116fd575f80fd5b8635611708816116d4565b95506020870135611718816116d4565b94506040870135935060608701359250608087013567ffffffffffffffff80821115611742575f80fd5b818901915089601f830112611755575f80fd5b813581811115611763575f80fd5b8a6020828501011115611774575f80fd5b6020830194508093505050509295509295509295565b5f805f6060848603121561179c575f80fd5b83356117a7816116d4565b9250602084013567ffffffffffffffff808211156117c3575f80fd5b9085019060c082880312156117d6575f80fd5b909250604085013590808211156117eb575f80fd5b508401604081870312156117fd575f80fd5b809150509250925092565b634e487b7160e01b5f52604160045260245ffd5b6040516060810167ffffffffffffffff8111828210171561183f5761183f611808565b60405290565b6040805190810167ffffffffffffffff8111828210171561183f5761183f611808565b604051601f8201601f1916810167ffffffffffffffff8111828210171561189157611891611808565b604052919050565b5f67ffffffffffffffff8211156118b2576118b2611808565b50601f01601f191660200190565b5f82601f8301126118cf575f80fd5b81356118e26118dd82611899565b611868565b8181528460208386010111156118f6575f80fd5b816020850160208301375f918101602001919091529392505050565b5f67ffffffffffffffff82111561192b5761192b611808565b5060051b60200190565b5f82601f830112611944575f80fd5b813560206119546118dd83611912565b82815260059290921b84018101918181019086841115611972575f80fd5b8286015b84811015611a6e57803567ffffffffffffffff80821115611995575f80fd5b908801906060828b03601f190112156119ac575f80fd5b6119b461181c565b868301356119c1816116d4565b8152604083810135838111156119d5575f80fd5b8401603f81018d136119e5575f80fd5b888101356119f56118dd82611912565b81815260059190911b82018301908a8101908f831115611a13575f80fd5b928401925b82841015611a315783358252928b0192908b0190611a18565b858c0152505050606084013583811115611a49575f80fd5b611a578d8a838801016118c0565b918301919091525085525050918301918301611976565b509695505050505050565b5f60408236031215611a89575f80fd5b611a91611845565b823567ffffffffffffffff80821115611aa8575f80fd5b818501915060608236031215611abc575f80fd5b611ac461181c565b8235611acf816116d4565b81526020830135611adf816116d4565b6020820152604083013582811115611af5575f80fd5b611b01368286016118c0565b60408301525083526020850135915080821115611b1c575f80fd5b50611b2936828601611935565b60208301525092915050565b5f808335601e19843603018112611b4a575f80fd5b83018035915067ffffffffffffffff821115611b64575f80fd5b6020019150600581901b3603821315610b30575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235607e19833603018112611ba3575f80fd5b9190910192915050565b5f8235609e19833603018112611ba3575f80fd5b5f808335601e19843603018112611bd6575f80fd5b83018035915067ffffffffffffffff821115611bf0575f80fd5b6020019150600681901b3603821315610b30575f80fd5b5f60208284031215611c17575f80fd5b81356109b1816116d4565b5f808335601e19843603018112611c37575f80fd5b830160208101925035905067ffffffffffffffff811115611c56575f80fd5b8060051b3603821315610b30575f80fd5b5f8235605e19833603018112611c7b575f80fd5b90910192915050565b5f808335601e19843603018112611c99575f80fd5b830160208101925035905067ffffffffffffffff811115611cb8575f80fd5b803603821315610b30575f80fd5b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b5f808335601e19843603018112611d03575f80fd5b830160208101925035905067ffffffffffffffff811115611d22575f80fd5b8060061b3603821315610b30575f80fd5b8183525f60208085019450825f5b85811015611d79578135611d54816116d4565b6001600160a01b03168752818301358388015260409687019690910190600101611d41565b509495945050505050565b8183526020808401935f91600585811b8301820185855b88811015611e5d57858303601f19018a52611db68289611c67565b60608135611dc3816116d4565b6001600160a01b03168552611dda82880183611c22565b82898801528083880152608092507f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811115611e14575f80fd5b871b808288850137860190506040611e2e84820185611c84565b9450838884030182890152611e468484018683611cc6565b9e8a019e9750505093870193505050600101611d9b565b509098975050505050505050565b5f602080835260e08301843582850152604082860135818601526060818701358187015280870135801515808214611ea1575f80fd5b8060808901525050611eb66080880188611c22565b60c060a08901529384905261010093848801600582901b89018601835f5b84811015612032578b830360ff19018452813536879003607e19018112611ef9575f80fd5b8601803536829003609e19018112611f0f575f80fd5b6080855281018035611f20816116d4565b6001600160a01b038082166080880152611f3c8e840184611c67565b915060a0808801528135611f4f816116d4565b8116610120880152818e0135611f64816116d4565b16610140870152611f77818c0182611c84565b91508a610160880152611f8f61018088018383611cc6565b915050611f9e8b830183611cee565b607f19808985030160c08a0152611fb6848385611d33565b9350611fc48d860186611cee565b93509150808985030160e08a015250611fde838383611d33565b9250505060808201358c8701528c8301358d8701528a8301358b8701526120078a840184611c22565b935091508581038a87015261201d818484611d84565b968d019695505050918a019150600101611ed4565b505061204160a08c018c611c84565b8b8303601f190160c08d01529850965061205c818989611cc6565b9b9a5050505050505050505050565b5f806040838503121561207c575f80fd5b505080516020909101519092909150565b5f805f6060848603121561209f575f80fd5b83516120aa816116d4565b60208501519093506120bb816116d4565b604085015190925067ffffffffffffffff8111156120d7575f80fd5b8401601f810186136120e7575f80fd5b80516120f56118dd82611899565b818152876020838501011115612109575f80fd5b8160208401602083015e5f602083830101528093505050509250925092565b5f60208284031215612138575f80fd5b815160ff811681146109b1575f80fd5b5f60208284031215612158575f80fd5b5051919050565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b5f815180845260208085019450602084015f5b83811015611d79578151875295820195908201906001016121a0565b5f8282518085526020808601955060208260051b840101602086015f5b8481101561220757601f198684030189526121f583835161218d565b988401989250908301906001016121d9565b5090979650505050505050565b602081526001600160a01b038251166020820152602082015160408201525f604083015160e0606084015261224d61010084018261215f565b9050606084015160808401526080840151601f19808584030160a086015261227583836121bc565b925060a08601519150808584030160c0860152612292838361218d565b925060c08601519150808584030160e0860152506122b0828261218d565b95945050505050565b5f82601f8301126122c8575f80fd5b815160206122d86118dd83611912565b8083825260208201915060208460051b8701019350868411156122f9575f80fd5b602086015b84811015611a6e57805183529183019183016122fe565b5f8060408385031215612326575f80fd5b825167ffffffffffffffff8082111561233d575f80fd5b818501915085601f830112612350575f80fd5b815160206123606118dd83611912565b82815260059290921b8401810191818101908984111561237e575f80fd5b948201945b8386101561239c57855182529482019490820190612383565b918801519196509093505050808211156123b4575f80fd5b506123c1858286016122b9565b9150509250929050565b828152604060208201525f6123e3604083018461218d565b949350505050565b634e487b7160e01b5f52601260045260245ffd5b634e487b7160e01b5f52602160045260245ffd"; /// @dev The runtime bytecode of the contract. bytes constant RUNTIME_CODE = - hex"608060405260043610610034575f3560e01c806301ffc9a71461003d578063691f9ed714610070578063b17c83c11461008f57005b3661003b57005b005b348015610048575f80fd5b5061005c610057366004611742565b6100a2565b604051901515815260200160405180910390f35b34801561007b575f80fd5b5061003b61008a36600461177d565b6100f3565b61003b61009d36600461181f565b610148565b5f6001600160e01b0319821663691f9ed760e01b14806100d257506001600160e01b0319821663b17c83c160e01b145b806100ed57506301ffc9a760e01b6001600160e01b03198316145b92915050565b61010186868686868661040a565b6101408683838080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525061046f92505050565b505050505050565b610150610520565b61015f61015c82611b0e565b50565b61016c6080830183611bca565b90505f0361018d57604051639c95219f60e01b815260040160405180910390fd5b6001600160a01b03831673522a6b8d2cd1e44d53475516fd3c55bc29a0e865146101da5760405163516e822d60e01b81526001600160a01b03841660048201526024015b60405180910390fd5b5f6101e86080840184611bca565b5f8181106101f8576101f8611c10565b905060200281019061020a9190611c24565b6102149080611c42565b610222906040810190611c56565b61022f6080860186611bca565b5f81811061023f5761023f611c10565b90506020028101906102519190611c24565b6020013581811061026457610264611c10565b61027a9260206040909202019081019150611c9c565b90505f61028a6080850185611bca565b5f81811061029a5761029a611c10565b90506020028101906102ac9190611c24565b6102b69080611c42565b6102c4906060810190611c56565b6102d16080870187611bca565b5f8181106102e1576102e1611c10565b90506020028101906102f39190611c24565b6040013581811061030657610306611c10565b61031c9260206040909202019081019150611c9c565b90506103336001600160a01b038316865f1961054e565b6040516334e3942b60e11b81526001600160a01b038616906369c728569061035f908790600401611f00565b60408051808303815f875af115801561037a573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061039e9190612100565b506103b590506001600160a01b038316865f61054e565b6103da6103c184611b0e565b836103cb856105c8565b846103d5866105c8565b61064c565b505061040560017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b505050565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0054600214801561044f57503373522a6b8d2cd1e44d53475516fd3c55bc29a0e86514155b156101405760405163f6688adf60e01b81523360048201526024016101d1565b5f805f838060200190518101906104869190612122565b919450925090506001600160a01b0383166104b4576040516398521dc560e01b815260040160405180910390fd5b6001600160a01b0382166104db5760405163456ac4c360e11b815260040160405180910390fd5b6104f06001600160a01b038616845f1961054e565b6105046001600160a01b038316824761089d565b506105196001600160a01b038616845f61054e565b5050505050565b61052861096a565b60027f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b61055a8383835f6109ae565b6104055761056b83835f60016109ae565b61059357604051635274afe760e01b81526001600160a01b03841660048201526024016101d1565b6105a083838360016109ae565b61040557604051635274afe760e01b81526001600160a01b03841660048201526024016101d1565b5f6105d1610a10565b6040516354636d2b60e01b81526001600160a01b038316600482015273200e12d10bb0c5e4a17e7018f0f1161919bb9389906354636d2b906024016020604051808303815f875af1158015610628573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906100ed91906121bd565b604080516003808252608082019092525f9160208201606080368337019050506040516370a0823160e01b81523060048201529091505f906001600160a01b038716906370a0823190602401602060405180830381865afa1580156106b3573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106d791906121dd565b905080156106f3576106f36001600160a01b0387163383610a9b565b5f6106fe8287610aa8565b50905080835f8151811061071457610714611c10565b602090810291909101015250506040516370a0823160e01b81523060048201525f906001600160a01b038516906370a0823190602401602060405180830381865afa158015610765573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061078991906121dd565b905080156107a5576107a56001600160a01b0385163383610a9b565b5f6107b08285610aa8565b50905080836001815181106107c7576107c7611c10565b60209081029190910101525047905080156107e6576107e63382610ae9565b5f6107f2826012610aa8565b509050808360028151811061080957610809611c10565b602090810291909101015250506040805160018082528183019092525f91816020015b6040805160a0810182525f918101828152606080830193909352608082018390528152602081019190915281526020019060019003908161082c57905050905086815f8151811061087f5761087f611c10565b60200260200101819052506108948282610b47565b50505050505050565b6060814710156108c95760405163cf47918160e01b8152476004820152602481018390526044016101d1565b5f6108d5858486610b5c565b90508080156108f657505f3d11806108f657505f856001600160a01b03163b115b1561090b57610903610b71565b915050610963565b801561093557604051639996b31560e01b81526001600160a01b03861660048201526024016101d1565b3d1561094857610943610b8a565b610961565b60405163d6bda27560e01b815260040160405180910390fd5b505b9392505050565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00546002036109ac57604051633ee5aeb560e01b815260040160405180910390fd5b565b60405163095ea7b360e01b5f8181526001600160a01b038616600452602485905291602083604481808b5af1925060015f51148316610a045783831516156109f8573d5f823e3d81fd5b5f873b113d1516831692505b60405250949350505050565b73200e12d10bb0c5e4a17e7018f0f1161919bb93893b1580610a67575073200e12d10bb0c5e4a17e7018f0f1161919bb93893f7f1de7d717526cba131d684e312dedbf0852adef9cced9e36798ae4937f7145d4114155b156109ac576040516373e6d7b360e01b815273200e12d10bb0c5e4a17e7018f0f1161919bb938960048201526024016101d1565b6105a08383836001610b95565b5f805f805f610ab78787610bdf565b9250925092505f80610ac98585610c3b565b9150915081838015610ad85750815b9650965050505050505b9250929050565b80471015610b135760405163cf47918160e01b8152476004820152602481018290526044016101d1565b610b2c828260405180602001604052805f815250610b5c565b15610b35575050565b3d1561094857610b43610b8a565b5050565b610b43610b55600784610eae565b825f610f10565b5f805f83516020850186885af1949350505050565b6040513d81523d5f602083013e3d602001810160405290565b6040513d5f823e3d81fd5b60405163a9059cbb60e01b5f8181526001600160a01b038616600452602485905291602083604481808b5af1925060015f51148316610a045783831516156109f8573d5f823e3d81fd5b5f808060ff841681037f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff861115610c2a57600a860460018201600a88065f1493509350935050610c34565b8593509150600190505b9250925092565b5f808383601b82900b821480610d86577d90e40fbeea1d3a4abc8955e946fe31cdcf66f634e1000000000000000000870515610cbc577f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee8000000000000000000870515610cad576305f5e10087059650600886019550610cbc565b620186a0870596506005860195505b8687601b0b14610cd757600a87059650856001019550610cbc565b7b0ccccccccccccccccccccccccccccccccccccccccccccccccccccccc7b1999999999999999999999999999999999999999999999999999999888820111610d80575f600188039050808160030b03610d7e5760e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff7b7fffffffffffffffffffffffffffffffffffffffffffffffffffffff60ff8b901d18161795505f9450610ae29350505050565b505b50610d9d565b865f03610d9d57505f935060019250610ae2915050565b858660030b14610e54575f821315610dfc57610db983836111c4565b15610de15760405163d556b11160e01b815260048101849052602481018390526044016101d1565b637ffffffe19909501600a0a82029550637fffffff94610e54565b637fffffff198690036043811315610e1e57505f9450849350610ae292505050565b80600a0a8881610e3057610e306121f4565b059750875f03610e4a57505f9450849350610ae292505050565b50637fffffff1995505b818613610e645760019350610e7d565b818603600a0a8381610e7857610e786121f4565b071593505b5050507bffffffffffffffffffffffffffffffffffffffffffffffffffffffff841660e084901b1791509250929050565b60408051600780825261010082019092526060915f9190816020015b6060815260200190600190039081610eca5790505090508281610eee600187612208565b81518110610efe57610efe611c10565b60209081029190910101529392505050565b60408051600780825261010082019092525f91816020015b6060815260200190600190039081610f285790505090505f5b8451811015610f8957848181518110610f5c57610f5c611c10565b6020026020010151828281518110610f7657610f76611c10565b6020908102919091010152600101610f41565b50335f8181523060209081526040808320815160a0810183528083018581526060808301879052608083018190529082528185015282518581529384018581528484019093529093909291905b88518110156111b857888181518110610ff157610ff1611c10565b602002602001015193505f845f0151604001515111156111b0575f61101a8886602001516111df565b90508861108d5761106f815f8151811061103657611036611c10565b60200260200101515f8151811061104f5761104f611c10565b602002602001015160408051600181526020810192909252818101905290565b815f8151811061108157611081611c10565b60200260200101819052505b8451516040805160e08101825287516020908101516001600160a01b0390811683529082018a90528851830151828401525f606083018190526080830186905260a0830189905260c08301889052925163d04dfe2360e01b81529293169163d04dfe23916110fd916004016122dc565b5f60405180830381865afa158015611117573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261113e91908101906123dd565b9150505f815111156111ad5785516020015160405163012c676d60e21b81526001600160a01b03909116906304b19db49061117f908b908590600401612493565b5f604051808303815f87803b158015611196575f80fd5b505af11580156111a8573d5f803e3d5ffd5b505050505b50505b600101610fd6565b50505050505050505050565b5f6109635f84126111d557836111d9565b835f035b836114c1565b60605f825167ffffffffffffffff8111156111fc576111fc61189d565b604051908082528060200260200182016040528015611225578160200160208202803683370190505b5090505f80845111611237575f61123d565b83516001015b85516001010190505f8167ffffffffffffffff81111561125f5761125f61189d565b60405190808252806020026020018201604052801561129257816020015b606081526020019060019003908161127d5790505b5090505f6112b6604080516002815233602082015230818301526060810190915290565b8282815181106112c8576112c8611c10565b60200260200101819052505f5b87518110156113255781806001019250508781815181106112f8576112f8611c10565b602002602001015183838151811061131257611312611c10565b60209081029190910101526001016112d5565b508551156114b75780806001019150508382828151811061134857611348611c10565b60200260200101819052505f5b86518110156114b55761140487828151811061137357611373611c10565b60200260200101515f01516113e16113af8a858151811061139657611396611c10565b6020026020010151602001518051602090810291012090565b7f19457468657265756d205369676e6564204d6573736167653a0a3332000000005f908152601c91909152603c902090565b8984815181106113f3576113f3611c10565b60200260200101516040015161155f565b61142457604051630a57f30960e31b8152600481018290526024016101d1565b86818151811061143657611436611c10565b60200260200101515f01516001600160a01b03165f1b85828151811061145e5761145e611c10565b602002602001018181525050818060010192505086818151811061148457611484611c10565b6020026020010151602001518383815181106114a2576114a2611c10565b6020908102919091010152600101611355565b505b5095945050505050565b5f637ffffff582136114d457505f6100ed565b637ffffffe19820160438113156114ef5750508115156100ed565b5f811261152f5780600a0a7b8000000000000000000000000000000000000000000000000000000181611524576115246121f4565b0484119150506100ed565b805f03600a0a7b800000000000000000000000000000000000000000000000000000020284101591505092915050565b5f836001600160a01b03163b5f036115bd575f8061157d85856115cf565b5090925090505f816003811115611596576115966124b3565b1480156115b45750856001600160a01b0316826001600160a01b0316145b92505050610963565b6115c8848484611615565b9050610963565b5f805f8351604103611606576020840151604085015160608601515f1a6115f88882858561167a565b955095509550505050610c34565b505081515f9150600290610c34565b805160408051630b135d3f60e11b8082526004820186905260248201929092525f92906020820185604483015e5f82606483010152601f820160051c60051b915060205f60648401838a5afa9050825f5114601f3d1116811693505050509392505050565b5f80807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08411156116b357505f91506003905082611738565b604080515f808252602082018084528a905260ff891692820192909252606081018790526080810186905260019060a0016020604051602081039080840390855afa158015611704573d5f803e3d5ffd5b5050604051601f1901519150506001600160a01b03811661172f57505f925060019150829050611738565b92505f91508190505b9450945094915050565b5f60208284031215611752575f80fd5b81356001600160e01b031981168114610963575f80fd5b6001600160a01b038116811461015c575f80fd5b5f805f805f8060a08789031215611792575f80fd5b863561179d81611769565b955060208701356117ad81611769565b94506040870135935060608701359250608087013567ffffffffffffffff808211156117d7575f80fd5b818901915089601f8301126117ea575f80fd5b8135818111156117f8575f80fd5b8a6020828501011115611809575f80fd5b6020830194508093505050509295509295509295565b5f805f60608486031215611831575f80fd5b833561183c81611769565b9250602084013567ffffffffffffffff80821115611858575f80fd5b9085019060c0828803121561186b575f80fd5b90925060408501359080821115611880575f80fd5b50840160408187031215611892575f80fd5b809150509250925092565b634e487b7160e01b5f52604160045260245ffd5b6040516060810167ffffffffffffffff811182821017156118d4576118d461189d565b60405290565b6040805190810167ffffffffffffffff811182821017156118d4576118d461189d565b604051601f8201601f1916810167ffffffffffffffff811182821017156119265761192661189d565b604052919050565b5f67ffffffffffffffff8211156119475761194761189d565b50601f01601f191660200190565b5f82601f830112611964575f80fd5b81356119776119728261192e565b6118fd565b81815284602083860101111561198b575f80fd5b816020850160208301375f918101602001919091529392505050565b5f67ffffffffffffffff8211156119c0576119c061189d565b5060051b60200190565b5f82601f8301126119d9575f80fd5b813560206119e9611972836119a7565b82815260059290921b84018101918181019086841115611a07575f80fd5b8286015b84811015611b0357803567ffffffffffffffff80821115611a2a575f80fd5b908801906060828b03601f19011215611a41575f80fd5b611a496118b1565b86830135611a5681611769565b815260408381013583811115611a6a575f80fd5b8401603f81018d13611a7a575f80fd5b88810135611a8a611972826119a7565b81815260059190911b82018301908a8101908f831115611aa8575f80fd5b928401925b82841015611ac65783358252928b0192908b0190611aad565b858c0152505050606084013583811115611ade575f80fd5b611aec8d8a83880101611955565b918301919091525085525050918301918301611a0b565b509695505050505050565b5f60408236031215611b1e575f80fd5b611b266118da565b823567ffffffffffffffff80821115611b3d575f80fd5b818501915060608236031215611b51575f80fd5b611b596118b1565b8235611b6481611769565b81526020830135611b7481611769565b6020820152604083013582811115611b8a575f80fd5b611b9636828601611955565b60408301525083526020850135915080821115611bb1575f80fd5b50611bbe368286016119ca565b60208301525092915050565b5f808335601e19843603018112611bdf575f80fd5b83018035915067ffffffffffffffff821115611bf9575f80fd5b6020019150600581901b3603821315610ae2575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235607e19833603018112611c38575f80fd5b9190910192915050565b5f8235609e19833603018112611c38575f80fd5b5f808335601e19843603018112611c6b575f80fd5b83018035915067ffffffffffffffff821115611c85575f80fd5b6020019150600681901b3603821315610ae2575f80fd5b5f60208284031215611cac575f80fd5b813561096381611769565b5f808335601e19843603018112611ccc575f80fd5b830160208101925035905067ffffffffffffffff811115611ceb575f80fd5b8060051b3603821315610ae2575f80fd5b5f8235605e19833603018112611d10575f80fd5b90910192915050565b5f808335601e19843603018112611d2e575f80fd5b830160208101925035905067ffffffffffffffff811115611d4d575f80fd5b803603821315610ae2575f80fd5b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b5f808335601e19843603018112611d98575f80fd5b830160208101925035905067ffffffffffffffff811115611db7575f80fd5b8060061b3603821315610ae2575f80fd5b8183525f60208085019450825f5b85811015611e0e578135611de981611769565b6001600160a01b03168752818301358388015260409687019690910190600101611dd6565b509495945050505050565b8183526020808401935f91600585811b8301820185855b88811015611ef257858303601f19018a52611e4b8289611cfc565b60608135611e5881611769565b6001600160a01b03168552611e6f82880183611cb7565b82898801528083880152608092507f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811115611ea9575f80fd5b871b808288850137860190506040611ec384820185611d19565b9450838884030182890152611edb8484018683611d5b565b9e8a019e9750505093870193505050600101611e30565b509098975050505050505050565b5f602080835260e08301843582850152604082860135818601526060818701358187015280870135801515808214611f36575f80fd5b8060808901525050611f4b6080880188611cb7565b60c060a08901529384905261010093848801600582901b89018601835f5b848110156120c7578b830360ff19018452813536879003607e19018112611f8e575f80fd5b8601803536829003609e19018112611fa4575f80fd5b6080855281018035611fb581611769565b6001600160a01b038082166080880152611fd18e840184611cfc565b915060a0808801528135611fe481611769565b8116610120880152818e0135611ff981611769565b1661014087015261200c818c0182611d19565b91508a61016088015261202461018088018383611d5b565b9150506120338b830183611d83565b607f19808985030160c08a015261204b848385611dc8565b93506120598d860186611d83565b93509150808985030160e08a015250612073838383611dc8565b9250505060808201358c8701528c8301358d8701528a8301358b87015261209c8a840184611cb7565b935091508581038a8701526120b2818484611e19565b968d019695505050918a019150600101611f69565b50506120d660a08c018c611d19565b8b8303601f190160c08d0152985096506120f1818989611d5b565b9b9a5050505050505050505050565b5f8060408385031215612111575f80fd5b505080516020909101519092909150565b5f805f60608486031215612134575f80fd5b835161213f81611769565b602085015190935061215081611769565b604085015190925067ffffffffffffffff81111561216c575f80fd5b8401601f8101861361217c575f80fd5b805161218a6119728261192e565b81815287602083850101111561219e575f80fd5b8160208401602083015e5f602083830101528093505050509250925092565b5f602082840312156121cd575f80fd5b815160ff81168114610963575f80fd5b5f602082840312156121ed575f80fd5b5051919050565b634e487b7160e01b5f52601260045260245ffd5b818103818111156100ed57634e487b7160e01b5f52601160045260245ffd5b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b5f815180845260208085019450602084015f5b83811015611e0e57815187529582019590820190600101612268565b5f8282518085526020808601955060208260051b840101602086015f5b848110156122cf57601f198684030189526122bd838351612255565b988401989250908301906001016122a1565b5090979650505050505050565b602081526001600160a01b038251166020820152602082015160408201525f604083015160e06060840152612315610100840182612227565b9050606084015160808401526080840151601f19808584030160a086015261233d8383612284565b925060a08601519150808584030160c086015261235a8383612255565b925060c08601519150808584030160e0860152506123788282612255565b95945050505050565b5f82601f830112612390575f80fd5b815160206123a0611972836119a7565b8083825260208201915060208460051b8701019350868411156123c1575f80fd5b602086015b84811015611b0357805183529183019183016123c6565b5f80604083850312156123ee575f80fd5b825167ffffffffffffffff80821115612405575f80fd5b818501915085601f830112612418575f80fd5b81516020612428611972836119a7565b82815260059290921b84018101918181019089841115612446575f80fd5b948201945b838610156124645785518252948201949082019061244b565b9188015191965090935050508082111561247c575f80fd5b5061248985828601612381565b9150509250929050565b828152604060208201525f6124ab6040830184612255565b949350505050565b634e487b7160e01b5f52602160045260245ffd"; + hex"608060405260043610610034575f3560e01c806301ffc9a71461003d578063691f9ed714610070578063b17c83c11461008f57005b3661003b57005b005b348015610048575f80fd5b5061005c6100573660046116ad565b6100a2565b604051901515815260200160405180910390f35b34801561007b575f80fd5b5061003b61008a3660046116e8565b6100f3565b61003b61009d36600461178a565b610148565b5f6001600160e01b0319821663691f9ed760e01b14806100d257506001600160e01b0319821663b17c83c160e01b145b806100ed57506301ffc9a760e01b6001600160e01b03198316145b92915050565b61010186868686868661040a565b6101408683838080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525061046f92505050565b505050505050565b610150610520565b61015f61015c82611a79565b50565b61016c6080830183611b35565b90505f0361018d57604051639c95219f60e01b815260040160405180910390fd5b6001600160a01b0383167350ad4ff129155d8f584deda447b11b4f5138840d146101da5760405163516e822d60e01b81526001600160a01b03841660048201526024015b60405180910390fd5b5f6101e86080840184611b35565b5f8181106101f8576101f8611b7b565b905060200281019061020a9190611b8f565b6102149080611bad565b610222906040810190611bc1565b61022f6080860186611b35565b5f81811061023f5761023f611b7b565b90506020028101906102519190611b8f565b6020013581811061026457610264611b7b565b61027a9260206040909202019081019150611c07565b90505f61028a6080850185611b35565b5f81811061029a5761029a611b7b565b90506020028101906102ac9190611b8f565b6102b69080611bad565b6102c4906060810190611bc1565b6102d16080870187611b35565b5f8181106102e1576102e1611b7b565b90506020028101906102f39190611b8f565b6040013581811061030657610306611b7b565b61031c9260206040909202019081019150611c07565b90506103336001600160a01b038316865f1961054e565b6040516334e3942b60e11b81526001600160a01b038616906369c728569061035f908790600401611e6b565b60408051808303815f875af115801561037a573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061039e919061206b565b506103b590506001600160a01b038316865f61054e565b6103da6103c184611a79565b836103cb856105c8565b846103d5866105c8565b61064c565b505061040560017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b505050565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0054600214801561044f5750337350ad4ff129155d8f584deda447b11b4f5138840d14155b156101405760405163f6688adf60e01b81523360048201526024016101d1565b5f805f83806020019051810190610486919061208d565b919450925090506001600160a01b0383166104b4576040516398521dc560e01b815260040160405180910390fd5b6001600160a01b0382166104db5760405163456ac4c360e11b815260040160405180910390fd5b6104f06001600160a01b038616845f1961054e565b6105046001600160a01b03831682476108eb565b506105196001600160a01b038616845f61054e565b5050505050565b6105286109b8565b60027f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b61055a8383835f6109fc565b6104055761056b83835f60016109fc565b61059357604051635274afe760e01b81526001600160a01b03841660048201526024016101d1565b6105a083838360016109fc565b61040557604051635274afe760e01b81526001600160a01b03841660048201526024016101d1565b5f6105d1610a5e565b6040516354636d2b60e01b81526001600160a01b038316600482015273200e12d10bb0c5e4a17e7018f0f1161919bb9389906354636d2b906024016020604051808303815f875af1158015610628573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906100ed9190612128565b6040805160018082528183019092525f91816020015b6060815260200190600190039081610662575050604080516003808252608082019092529192505f919060208201606080368337019050506040516370a0823160e01b81523060048201529091505f906001600160a01b038816906370a0823190602401602060405180830381865afa1580156106e1573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107059190612148565b90508015610721576107216001600160a01b0388163383610ae9565b5f61072c8288610af6565b50905080835f8151811061074257610742611b7b565b602090810291909101015250506040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa158015610793573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107b79190612148565b905080156107d3576107d36001600160a01b0386163383610ae9565b5f6107de8286610af6565b50905080836001815181106107f5576107f5611b7b565b6020908102919091010152504790508015610814576108143382610b37565b5f610820826012610af6565b509050808360028151811061083757610837611b7b565b602002602001018181525050505080825f8151811061085857610858611b7b565b60209081029190910101526040805160018082528183019092525f91816020015b6040805160a0810182525f918101828152606080830193909352608082018390528152602081019190915281526020019060019003908161087957905050905087815f815181106108cc576108cc611b7b565b60200260200101819052506108e18382610b95565b5050505050505050565b6060814710156109175760405163cf47918160e01b8152476004820152602481018390526044016101d1565b5f610923858486610ddd565b905080801561094457505f3d118061094457505f856001600160a01b03163b115b1561095957610951610df2565b9150506109b1565b801561098357604051639996b31560e01b81526001600160a01b03861660048201526024016101d1565b3d1561099657610991610e0b565b6109af565b60405163d6bda27560e01b815260040160405180910390fd5b505b9392505050565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00546002036109fa57604051633ee5aeb560e01b815260040160405180910390fd5b565b60405163095ea7b360e01b5f8181526001600160a01b038616600452602485905291602083604481808b5af1925060015f51148316610a52578383151615610a46573d5f823e3d81fd5b5f873b113d1516831692505b60405250949350505050565b73200e12d10bb0c5e4a17e7018f0f1161919bb93893b1580610ab5575073200e12d10bb0c5e4a17e7018f0f1161919bb93893f7f1de7d717526cba131d684e312dedbf0852adef9cced9e36798ae4937f7145d4114155b156109fa576040516373e6d7b360e01b815273200e12d10bb0c5e4a17e7018f0f1161919bb938960048201526024016101d1565b6105a08383836001610e16565b5f805f805f610b058787610e60565b9250925092505f80610b178585610ebc565b9150915081838015610b265750815b9650965050505050505b9250929050565b80471015610b615760405163cf47918160e01b8152476004820152602481018290526044016101d1565b610b7a828260405180602001604052805f815250610ddd565b15610b83575050565b3d1561099657610b91610e0b565b5050565b60408051600680825260e082019092525f91816020015b6060815260200190600190039081610bac5790505090505f5b8351811015610c0d57838181518110610be057610be0611b7b565b6020026020010151828281518110610bfa57610bfa611b7b565b6020908102919091010152600101610bc5565b50335f8181523060209081526040808320815160a0810183528083018581526060808301879052608083018190529082528185015282518581529384018581528484019093529093909291905b8751811015610dd257878181518110610c7557610c75611b7b565b602002602001015193505f845f015160400151511115610dca575f845f01515f01516001600160a01b031663d04dfe236040518060e00160405280885f0151602001516001600160a01b03168152602001898152602001885f01516040015181526020015f8152602001610ced8c8a6020015161112f565b8152602001878152602001868152506040518263ffffffff1660e01b8152600401610d189190612214565b5f60405180830381865afa158015610d32573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610d599190810190612315565b9150505f81511115610dc85784516020015160405163012c676d60e21b81526001600160a01b03909116906304b19db490610d9a908a9085906004016123cb565b5f604051808303815f87803b158015610db1575f80fd5b505af1158015610dc3573d5f803e3d5ffd5b505050505b505b600101610c5a565b505050505050505050565b5f805f83516020850186885af1949350505050565b6040513d81523d5f602083013e3d602001810160405290565b6040513d5f823e3d81fd5b60405163a9059cbb60e01b5f8181526001600160a01b038616600452602485905291602083604481808b5af1925060015f51148316610a52578383151615610a46573d5f823e3d81fd5b5f808060ff841681037f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff861115610eab57600a860460018201600a88065f1493509350935050610eb5565b8593509150600190505b9250925092565b5f808383601b82900b821480611007577d90e40fbeea1d3a4abc8955e946fe31cdcf66f634e1000000000000000000870515610f3d577f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee8000000000000000000870515610f2e576305f5e10087059650600886019550610f3d565b620186a0870596506005860195505b8687601b0b14610f5857600a87059650856001019550610f3d565b7b0ccccccccccccccccccccccccccccccccccccccccccccccccccccccc7b1999999999999999999999999999999999999999999999999999999888820111611001575f600188039050808160030b03610fff5760e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff7b7fffffffffffffffffffffffffffffffffffffffffffffffffffffff60ff8b901d18161795505f9450610b309350505050565b505b5061101e565b865f0361101e57505f935060019250610b30915050565b858660030b146110d5575f82131561107d5761103a8383611411565b156110625760405163d556b11160e01b815260048101849052602481018390526044016101d1565b637ffffffe19909501600a0a82029550637fffffff946110d5565b637fffffff19869003604381131561109f57505f9450849350610b3092505050565b80600a0a88816110b1576110b16123eb565b059750875f036110cb57505f9450849350610b3092505050565b50637fffffff1995505b8186136110e557600193506110fe565b818603600a0a83816110f9576110f96123eb565b071593505b5050507bffffffffffffffffffffffffffffffffffffffffffffffffffffffff841660e084901b1791509250929050565b60605f825167ffffffffffffffff81111561114c5761114c611808565b604051908082528060200260200182016040528015611175578160200160208202803683370190505b5090505f80845111611187575f61118d565b83516001015b85516001010190505f8167ffffffffffffffff8111156111af576111af611808565b6040519080825280602002602001820160405280156111e257816020015b60608152602001906001900390816111cd5790505b5090505f611206604080516002815233602082015230818301526060810190915290565b82828151811061121857611218611b7b565b60200260200101819052505f5b875181101561127557818060010192505087818151811061124857611248611b7b565b602002602001015183838151811061126257611262611b7b565b6020908102919091010152600101611225565b508551156114075780806001019150508382828151811061129857611298611b7b565b60200260200101819052505f5b8651811015611405576113548782815181106112c3576112c3611b7b565b60200260200101515f01516113316112ff8a85815181106112e6576112e6611b7b565b6020026020010151602001518051602090810291012090565b7f19457468657265756d205369676e6564204d6573736167653a0a3332000000005f908152601c91909152603c902090565b89848151811061134357611343611b7b565b60200260200101516040015161142c565b61137457604051630a57f30960e31b8152600481018290526024016101d1565b86818151811061138657611386611b7b565b60200260200101515f01516001600160a01b03165f1b8582815181106113ae576113ae611b7b565b60200260200101818152505081806001019250508681815181106113d4576113d4611b7b565b6020026020010151602001518383815181106113f2576113f2611b7b565b60209081029190910101526001016112a5565b505b5095945050505050565b5f6109b15f84126114225783611426565b835f035b8361149c565b5f836001600160a01b03163b5f0361148a575f8061144a858561153a565b5090925090505f816003811115611463576114636123ff565b1480156114815750856001600160a01b0316826001600160a01b0316145b925050506109b1565b611495848484611580565b90506109b1565b5f637ffffff582136114af57505f6100ed565b637ffffffe19820160438113156114ca5750508115156100ed565b5f811261150a5780600a0a7b80000000000000000000000000000000000000000000000000000001816114ff576114ff6123eb565b0484119150506100ed565b805f03600a0a7b800000000000000000000000000000000000000000000000000000020284101591505092915050565b5f805f8351604103611571576020840151604085015160608601515f1a611563888285856115e5565b955095509550505050610eb5565b505081515f9150600290610eb5565b805160408051630b135d3f60e11b8082526004820186905260248201929092525f92906020820185604483015e5f82606483010152601f820160051c60051b915060205f60648401838a5afa9050825f5114601f3d1116811693505050509392505050565b5f80807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a084111561161e57505f915060039050826116a3565b604080515f808252602082018084528a905260ff891692820192909252606081018790526080810186905260019060a0016020604051602081039080840390855afa15801561166f573d5f803e3d5ffd5b5050604051601f1901519150506001600160a01b03811661169a57505f9250600191508290506116a3565b92505f91508190505b9450945094915050565b5f602082840312156116bd575f80fd5b81356001600160e01b0319811681146109b1575f80fd5b6001600160a01b038116811461015c575f80fd5b5f805f805f8060a087890312156116fd575f80fd5b8635611708816116d4565b95506020870135611718816116d4565b94506040870135935060608701359250608087013567ffffffffffffffff80821115611742575f80fd5b818901915089601f830112611755575f80fd5b813581811115611763575f80fd5b8a6020828501011115611774575f80fd5b6020830194508093505050509295509295509295565b5f805f6060848603121561179c575f80fd5b83356117a7816116d4565b9250602084013567ffffffffffffffff808211156117c3575f80fd5b9085019060c082880312156117d6575f80fd5b909250604085013590808211156117eb575f80fd5b508401604081870312156117fd575f80fd5b809150509250925092565b634e487b7160e01b5f52604160045260245ffd5b6040516060810167ffffffffffffffff8111828210171561183f5761183f611808565b60405290565b6040805190810167ffffffffffffffff8111828210171561183f5761183f611808565b604051601f8201601f1916810167ffffffffffffffff8111828210171561189157611891611808565b604052919050565b5f67ffffffffffffffff8211156118b2576118b2611808565b50601f01601f191660200190565b5f82601f8301126118cf575f80fd5b81356118e26118dd82611899565b611868565b8181528460208386010111156118f6575f80fd5b816020850160208301375f918101602001919091529392505050565b5f67ffffffffffffffff82111561192b5761192b611808565b5060051b60200190565b5f82601f830112611944575f80fd5b813560206119546118dd83611912565b82815260059290921b84018101918181019086841115611972575f80fd5b8286015b84811015611a6e57803567ffffffffffffffff80821115611995575f80fd5b908801906060828b03601f190112156119ac575f80fd5b6119b461181c565b868301356119c1816116d4565b8152604083810135838111156119d5575f80fd5b8401603f81018d136119e5575f80fd5b888101356119f56118dd82611912565b81815260059190911b82018301908a8101908f831115611a13575f80fd5b928401925b82841015611a315783358252928b0192908b0190611a18565b858c0152505050606084013583811115611a49575f80fd5b611a578d8a838801016118c0565b918301919091525085525050918301918301611976565b509695505050505050565b5f60408236031215611a89575f80fd5b611a91611845565b823567ffffffffffffffff80821115611aa8575f80fd5b818501915060608236031215611abc575f80fd5b611ac461181c565b8235611acf816116d4565b81526020830135611adf816116d4565b6020820152604083013582811115611af5575f80fd5b611b01368286016118c0565b60408301525083526020850135915080821115611b1c575f80fd5b50611b2936828601611935565b60208301525092915050565b5f808335601e19843603018112611b4a575f80fd5b83018035915067ffffffffffffffff821115611b64575f80fd5b6020019150600581901b3603821315610b30575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235607e19833603018112611ba3575f80fd5b9190910192915050565b5f8235609e19833603018112611ba3575f80fd5b5f808335601e19843603018112611bd6575f80fd5b83018035915067ffffffffffffffff821115611bf0575f80fd5b6020019150600681901b3603821315610b30575f80fd5b5f60208284031215611c17575f80fd5b81356109b1816116d4565b5f808335601e19843603018112611c37575f80fd5b830160208101925035905067ffffffffffffffff811115611c56575f80fd5b8060051b3603821315610b30575f80fd5b5f8235605e19833603018112611c7b575f80fd5b90910192915050565b5f808335601e19843603018112611c99575f80fd5b830160208101925035905067ffffffffffffffff811115611cb8575f80fd5b803603821315610b30575f80fd5b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b5f808335601e19843603018112611d03575f80fd5b830160208101925035905067ffffffffffffffff811115611d22575f80fd5b8060061b3603821315610b30575f80fd5b8183525f60208085019450825f5b85811015611d79578135611d54816116d4565b6001600160a01b03168752818301358388015260409687019690910190600101611d41565b509495945050505050565b8183526020808401935f91600585811b8301820185855b88811015611e5d57858303601f19018a52611db68289611c67565b60608135611dc3816116d4565b6001600160a01b03168552611dda82880183611c22565b82898801528083880152608092507f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811115611e14575f80fd5b871b808288850137860190506040611e2e84820185611c84565b9450838884030182890152611e468484018683611cc6565b9e8a019e9750505093870193505050600101611d9b565b509098975050505050505050565b5f602080835260e08301843582850152604082860135818601526060818701358187015280870135801515808214611ea1575f80fd5b8060808901525050611eb66080880188611c22565b60c060a08901529384905261010093848801600582901b89018601835f5b84811015612032578b830360ff19018452813536879003607e19018112611ef9575f80fd5b8601803536829003609e19018112611f0f575f80fd5b6080855281018035611f20816116d4565b6001600160a01b038082166080880152611f3c8e840184611c67565b915060a0808801528135611f4f816116d4565b8116610120880152818e0135611f64816116d4565b16610140870152611f77818c0182611c84565b91508a610160880152611f8f61018088018383611cc6565b915050611f9e8b830183611cee565b607f19808985030160c08a0152611fb6848385611d33565b9350611fc48d860186611cee565b93509150808985030160e08a015250611fde838383611d33565b9250505060808201358c8701528c8301358d8701528a8301358b8701526120078a840184611c22565b935091508581038a87015261201d818484611d84565b968d019695505050918a019150600101611ed4565b505061204160a08c018c611c84565b8b8303601f190160c08d01529850965061205c818989611cc6565b9b9a5050505050505050505050565b5f806040838503121561207c575f80fd5b505080516020909101519092909150565b5f805f6060848603121561209f575f80fd5b83516120aa816116d4565b60208501519093506120bb816116d4565b604085015190925067ffffffffffffffff8111156120d7575f80fd5b8401601f810186136120e7575f80fd5b80516120f56118dd82611899565b818152876020838501011115612109575f80fd5b8160208401602083015e5f602083830101528093505050509250925092565b5f60208284031215612138575f80fd5b815160ff811681146109b1575f80fd5b5f60208284031215612158575f80fd5b5051919050565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b5f815180845260208085019450602084015f5b83811015611d79578151875295820195908201906001016121a0565b5f8282518085526020808601955060208260051b840101602086015f5b8481101561220757601f198684030189526121f583835161218d565b988401989250908301906001016121d9565b5090979650505050505050565b602081526001600160a01b038251166020820152602082015160408201525f604083015160e0606084015261224d61010084018261215f565b9050606084015160808401526080840151601f19808584030160a086015261227583836121bc565b925060a08601519150808584030160c0860152612292838361218d565b925060c08601519150808584030160e0860152506122b0828261218d565b95945050505050565b5f82601f8301126122c8575f80fd5b815160206122d86118dd83611912565b8083825260208201915060208460051b8701019350868411156122f9575f80fd5b602086015b84811015611a6e57805183529183019183016122fe565b5f8060408385031215612326575f80fd5b825167ffffffffffffffff8082111561233d575f80fd5b818501915085601f830112612350575f80fd5b815160206123606118dd83611912565b82815260059290921b8401810191818101908984111561237e575f80fd5b948201945b8386101561239c57855182529482019490820190612383565b918801519196509093505050808211156123b4575f80fd5b506123c1858286016122b9565b9150509250929050565b828152604060208201525f6123e3604083018461218d565b949350505050565b634e487b7160e01b5f52601260045260245ffd5b634e487b7160e01b5f52602160045260245ffd"; /// @dev What MUST already be on a network before this release can be /// broadcast there: an address, and the runtime code that belongs at it. /// `abi.encode`d as a `DeployDependency[]` because Solidity has no /// file-scope constant of dynamic array type. bytes constant DEPENDENCIES = - hex"0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000005280000000000000000000000000522a6b8d2cd1e44d53475516fd3c55bc29a0e865000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000051c26080806040526004361015610012575f80fd5b5f3560e01c90816301ffc9a714611792575080631f69cb751461155c5780632cb77e9f146115305780632fbc4ba0146113ce57806341d1514f146113975780635cffe9de1461123b578063607461191461109f578063613255ab1461101c57806369c728561461072b578063709fb8a5146104375780639235084d146103e3578063ac9650d814610295578063d7e442ec14610237578063d9d98ce4146101865763fa501182146100c1575f80fd5b34610182576101403660031901126101825767ffffffffffffffff600435818111610182576100f4903690600401611b44565b6024358281116101825761010c903690600401611b44565b60c0366043190112610182576101043583811161018257610131903690600401611cea565b90610124359384116101825761014e61015c943690600401611cea565b926101576126da565b612220565b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055005b5f80fd5b34610182576040366003190112610182576001600160a01b036101a7611816565b166040516370a0823160e01b8152306004820152602081602481855afa90811561022c575f916101fa575b50156101e25760206040515f8152f35b60249060405190633c5bf76960e21b82526004820152fd5b90506020813d602011610224575b81610215602093836119b3565b810103126101825751826101d2565b3d9150610208565b6040513d5f823e3d90fd5b346101825760203660031901126101825760043567ffffffffffffffff81116101825761028f61026e61015c9236906004016117e5565b91906102786126da565b6040519261028584611997565b5f84523691611dbe565b90612991565b34610182576020806003193601126101825760043567ffffffffffffffff8111610182576102c79036906004016117e5565b9190604051926102d684611997565b5f84528284016102e582611a97565b946102f360405196876119b3565b8286526102ff83611a97565b9361031186880195601f190186612204565b5f5b84811061037557604080518881528951818a018190525f92600582901b83018101918a918c9085015b8287106103495785850386f35b909192938280610365600193603f198a820301865288516118a2565b960192019601959291909261033c565b806103c4886103be61039160019560059d9c9d1b8701876120e4565b929089846040519586938585013782018381015f81528b519283915e015f838201520380845201826119b3565b30613a32565b6103ce828a611fca565b526103d98189611fca565b5001969596610313565b3461018257600319602036820112610182576004359067ffffffffffffffff82116101825760809082360301126101825761042260609160040161212c565b90604051921515835260208301526040820152f35b34610182576003196040368201126101825760043567ffffffffffffffff8082116101825760c08260040193833603011261018257602435908111610182576104849036906004016117e5565b61048f9291926126da565b6104c06104bb6104b66104af6104a58880612117565b60408101906120e4565b36916119d5565b6139c8565b613a1d565b801561071957600110156107075760248201926104dd8486611f27565b9050156106f55760448301936104f38587611f27565b9050156106e3576105596105219561054d6105186105118a80612117565b948a611f27565b9890928a611f27565b91909261053e60405196610534886118c6565b3388523690611a39565b9960209a8b8801523691611aaf565b60408501523691611aaf565b6060820152606484013560808201526105718161271c565b90815f525f865260405f209485541595866105b5575b878760017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055604051908152f35b6001905560a46001600160a01b03917f87491344dfbcf91f6cbbc610cbbeedc85313d37a02df0c93527f7ea5f8db717f83855116604051908152868b82015260606040820152806106096060820188612032565b0390a10191610618838a6120e4565b905061063b575b50505061062e9394955061274d565b8190838080808080610587565b6106486104af848b6120e4565b610651816147b9565b156106bc57509761068f7fd46c2c56b35c8210e9e712ec3f02242d5fc90187c0ac8ed80cc33626846ec369936106af9361062e999a9b5116926120e4565b92906040519384938452868c850152606060408501526060840191611d19565b0390a1859493878061061f565b886106df604051928392630c89984b60e31b8452600484015260248301906118a2565b0390fd5b60405163540e5f0b60e01b8152600490fd5b604051636c44ef8f60e01b8152600490fd5b604051633c8270bd60e21b8152600490fd5b604051632cff108b60e21b8152600490fd5b34610182576003196020368201126101825767ffffffffffffffff600435116101825760c09060043536030112610182576107646126da565b5f808061077960048035608481019101611e70565b90501561100a576024600435013592610791846127dd565b15610ff8576060806040516107a58161192e565b6107ad611ec5565b81525f60208201525f604082015201526107c5611ec5565b506108256108206107ff6107f56107ef6107e9608460043501600435600401611e70565b90611ef7565b80611f12565b6040810190611f27565b60206108186107e9608460043501600435600401611e70565b013591611f5d565b611d05565b936001600160a01b0361087461082061085b6108516107ef6107e9608460043501600435600401611e70565b6060810190611f27565b60406108186107e9608460043501600435600401611e70565b8160405197610882896118f6565b16875216602086015260408501526108a4608460043501600435600401611e70565b9490506001604051955f87520160051b85016040525f905f5b6108d1608460043501600435600401611e70565b9050811080610fe5575b15610e32576108f4608460043501600435600401611e70565b821015610e1e578160051b810135607e198236030181121561018257608081830136031261018257604051916109298361192e565b8181013567ffffffffffffffff81116101825761094b90369084840101611b44565b835280820160208181013590850152604080820135908501526060013567ffffffffffffffff8111610182576109849236920101611cea565b606082015280516001600160a01b036109a66040830151602085015190611fca565b5151166001600160a01b0385511614801590610dea575b610dd8576109d5602083015160408401519083612ed1565b6109de8161271c565b91825f525f60205260405f2054155f14610a42575051604080513381526001600160a01b039092166020830152810191909152600191907fb70c12fa453793fa6818ec07c91e74363a47aa6a6829dcd9533937fdf30314f390606090a15b016108bd565b9190610a73602084979597015160408501519060608601519060405192610a6884611997565b5f8452339186613102565b925f93610a8b60608201516044600435013590612800565b15610af257505051604080513381526001600160a01b03909216602083015281019190915260019291907fe3151dc8cb7a54ffc4baabd28c1f241c94d510b5e5b502491ac3cad6c16316d590606090a15b8115610aea575b5092610a3c565b905088610ae3565b610aff60408201516127dd565b158015610dc5575b15610b5c57505051604080513381526001600160a01b03909216602083015281019190915260019291907f500b713857325f9e6dcb52ae832eca9109d107ed1aae9cb4928b4c1e13f051aa90606090a1610adc565b9250925050600196959691610b75606460043501611fde565b15610d325796610be597610bf560408401516040880151610b968183613461565b15610d2a5750925b610bef848592610bd8610bd260608a01516001600160e01b03601b918660e01d92828816810b928260e01d9216900b613e72565b9061402d565b9d8e9260408d015161352c565b60408c0152613556565b99613556565b98610c008484613580565b610c0a84826135de565b60405192338452608060208501526060610c308451608080880152610100870190612032565b93602081015160a0870152604081015160c0870152015192607f198582030160e0860152835180825260208201906020808260051b8501019601925f5b828110610ccc57505050505092806001979695937f194f1feb3b4d7076a2c272e774e792e0c48bb8c7aa1a9a3671c1cd6da9e6b4c193610cc796604084015260608301520390a180858c5101808d5260051b8c0152613731565b610adc565b9091929396602080610d1d600193601f198782030189528b51906001600160a01b0382511681526040610d0c8584015160608785015260608401906120b1565b9201519060408184039101526118a2565b9901950193929101610c6d565b905092610b9e565b610be590610bf56060840151610bef610d70610bd260408801516001600160e01b0394601b90868360e01d9316820b91878260e01d9216900b613e72565b60408a0151610d7f8183613461565b15610dbd5750915b829c8d916060890151908116155f14610dae575060408801515b96879460408d015161352c565b610db89085613488565b610da1565b905091610d87565b50610dd3606082015161343e565b610b07565b60405163936bb5ad60e01b8152600490fd5b506001600160a01b03610e066060830151604085015190611fca565b5151166001600160a01b0360208601511614156109bd565b634e487b7160e01b5f52603260045260245ffd5b50919390610e44606460043501611fde565b15610fdf57835b6004356004013590610e5d8282613461565b610fc15750508490610e7d856001600160a01b0360208701511633612e68565b505060a46004350190610e95826004356004016120e4565b905015159081610fb9575b50610f18575b506001600160a01b03610ebc9293511633612827565b50505b8351811015610ee45780610ede610ed860019387611fca565b5161390a565b01610ebf565b5060409160017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f005582519182526020820152f35b90506001600160a01b03602084015116610f426001600160a01b03855116926004356004016120e4565b929091333b1561018257610f8a5f93604051958694859463691f9ed760e01b8652600486015260248501528960448501528a606485015260a0608485015260a4840191611d19565b038183335af190811561022c57859115610ea6579050610faa915061194a565b5f836001600160a01b03610ea6565b905088610ea0565b604492506040519163573b6f4160e01b835260048301526024820152fd5b84610e4b565b50610ff360408301516127dd565b6108db565b60405163315f9e2360e21b8152600490fd5b604051639c95219f60e01b8152600490fd5b3461018257602080600319360112610182576024816001600160a01b03611041611816565b16604051928380926370a0823160e01b82523060048301525afa90811561022c575f91611072575b50604051908152f35b90508181813d8311611098575b61108981836119b3565b81010312610182575182611069565b503d61107f565b34610182576110ad36611856565b6110b56126da565b6110c08486336127a9565b6110c9836127dd565b1561120e576110d9848633612b9b565b6110e38185613461565b15611208575082935b6110f885828833612e0a565b9690947f8045c25080b0868951141ed0a91720bcad09a8364a2b3109ee1fd49c1f0bc8b860c0611129898533612e68565b94906001600160a01b0360405192338452169a8b6020840152876040840152856060840152608083015260a0820152a1836111845760017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055005b6111fb9761028f9660ff946040519960078b5260208b015260408a01526060890152608088015260a08701521660c08501523360e0850152610100840193846040526111cf8561197a565b600785526111e061012082016121e8565b6111e985611fba565b526111f384611fba565b503691611dbe565b808080808080808061015c565b936110ec565b604051623a3a4d60e21b81523360048201526001600160a01b038616602482015260448101859052606490fd5b34610182576080366003190112610182576004356001600160a01b03908181168091036101825761126a61182c565b6044359167ffffffffffffffff916064358381116101825736602382011215610182578060040135938411610182573660248583010111610182576112f79560209216936112b9868587612d2b565b60405196879283926323e30c8b60e01b84523360048501528760248501528860448501525f606485015260a06084850152602460a485019201611d19565b03815f855af193841561022c575f94611363575b507f439148f0bbc682ca079e46d6e2c2f0c1e3b820f1a291b069d8882abf8cf18dd9840361134a5761133f93503091612da4565b602060405160018152f35b604051630b6c58a960e31b815260048101859052602490fd5b9093506020813d60201161138f575b8161137f602093836119b3565b810103126101825751928461130b565b3d9150611372565b346101825760603660031901126101825760206113c66113b5611816565b6113bd61182c565b60443591612b9b565b604051908152f35b34610182576113dc36611856565b839493926113e86126da565b6113f38486336127a9565b6113fc816127dd565b15611502578061141061145f928733612827565b9590967f7f9dfa19cf1cc2f806f2f860fbc9c056b601fb1afc0e9b843dfe5c63616268e660806040513381526001600160a01b0384169a8b60208301528560408301526060820152a1336128cd565b9590938261148d5760017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055005b6114f69661028f9560ff936040519860068a5260208a01526040890152606088015260808701521660a08501523360c085015260e0840193846040526114d28561197a565b600785526114e361010082016121e8565b6114ec85611faa565b526111f384611faa565b8080808080808061015c565b6040516306dde9c360e41b81523360048201526001600160a01b038616602482015260448101859052606490fd5b34610182576020366003190112610182576004355f525f6020526020600160405f205414604051908152f35b3461018257600319604036820112610182576004359067ffffffffffffffff808311610182578260040160a08436039384011261018257602435828111610182576115ab9036906004016117e5565b906115b46126da565b5f946001600160a01b0394856115c986611d05565b163303611770576115e26115dd3687611b44565b61271c565b91825f525f60205260405f2096600188541461162a575b60208960017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00556040519015158152f35b9091929394959697505f6001985560405191338352846020840152606060408401528161165689611842565b16606084015260248a013590606219018112156101825789019060a060808401528061168460048401611842565b1661010084015261169760248301611842565b1661012083015260448101356022198236030181121561018257019560246004880135970192871161018257863603831361018257602098608461175384936117127f09d18501db0080ca2d6cd7c17fa7255daff4b2d503ea93b76ff68b6752ea8e63976117639c6060610140890152610160880191611d19565b6117446117396117256044880185611d39565b605f198a8603810160a08c01529491611d6e565b926064870190611d39565b918784030160c0880152611d6e565b91013560e08301520390a161274d565b82808080808080806115f9565b60248661177c87611d05565b6040516335252be360e01b815291166004820152fd5b34610182576020366003190112610182576004359063ffffffff60e01b82168092036101825760209163e414309160e01b81149081156117d4575b5015158152f35b6301ffc9a760e01b149050836117cd565b9181601f840112156101825782359167ffffffffffffffff8311610182576020808501948460051b01011161018257565b600435906001600160a01b038216820361018257565b602435906001600160a01b038216820361018257565b35906001600160a01b038216820361018257565b906080600319830112610182576004356001600160a01b0381168103610182579160243591604435916064359067ffffffffffffffff82116101825761189e916004016117e5565b9091565b805180835260209291819084018484015e5f828201840152601f01601f1916010190565b60a0810190811067ffffffffffffffff8211176118e257604052565b634e487b7160e01b5f52604160045260245ffd5b6060810190811067ffffffffffffffff8211176118e257604052565b6040810190811067ffffffffffffffff8211176118e257604052565b6080810190811067ffffffffffffffff8211176118e257604052565b67ffffffffffffffff81116118e257604052565b60e0810190811067ffffffffffffffff8211176118e257604052565b610100810190811067ffffffffffffffff8211176118e257604052565b6020810190811067ffffffffffffffff8211176118e257604052565b90601f8019910116810190811067ffffffffffffffff8211176118e257604052565b92919267ffffffffffffffff82116118e257604051916119ff601f8201601f1916602001846119b3565b829481845281830111610182578281602093845f960137010152565b9080601f8301121561018257816020611a36933591016119d5565b90565b91906060838203126101825760405190611a52826118f6565b8193611a5d81611842565b8352611a6b60208201611842565b602084015260408101359167ffffffffffffffff831161018257604092611a929201611a1b565b910152565b67ffffffffffffffff81116118e25760051b60200190565b929192611abb82611a97565b604092611acb60405192836119b3565b819581835260208093019160061b84019381851161018257915b848310611af457505050505050565b8583830312610182578386918251611b0b81611912565b611b1486611842565b81528286013583820152815201920191611ae5565b9080601f8301121561018257816020611a3693359101611aaf565b91909160a0818403126101825760405190611b5e826118c6565b8193611b6982611842565b835267ffffffffffffffff9160208101358381116101825782611b8d918301611a39565b602085015260408101358381116101825782611baa918301611b29565b6040850152606081013592831161018257611bcb6080939284938301611b29565b60608501520135910152565b909291611be384611a97565b916040611bf360405194856119b3565b839580855260208095019160059160051b8401948086116101825784935b868510611c22575050505050505050565b67ffffffffffffffff90853582811161018257870190606082850312610182578451611c4d816118f6565b611c5683611842565b81528a83013584811161018257830185601f8201121561018257803590611c7c82611a97565b91611c89895193846119b3565b8083528d808401918b1b83010191888311610182578e809101915b838310611cda57509150508201528583013593841161018257611ccb858c95869501611a1b565b86820152815201940193611c11565b82358152918101918f9101611ca4565b9080601f8301121561018257816020611a3693359101611bd7565b356001600160a01b03811681036101825790565b908060209392818452848401375f828201840152601f01601f1916010190565b9035601e198236030181121561018257016020813591019167ffffffffffffffff8211610182578160061b3603831361018257565b9190808252602080920192915f905b828210611d8b575050505090565b909192936001906001600160a01b03611da387611842565b16815285830135838201526040908101950193920190611d7d565b90929192611dcb81611a97565b91604091611ddc60405194856119b3565b839581855260208095019160051b8301938185116101825783925b858410611e075750505050505050565b67ffffffffffffffff908435828111610182578601908382860312610182578351611e3181611912565b82358481116101825786611e46918501611a39565b81528983013593841161018257611e61868b95869501611cea565b83820152815201930192611df7565b903590601e1981360301821215610182570180359067ffffffffffffffff821161018257602001918160051b3603831361018257565b60405190611eb3826118f6565b60606040835f81525f60208201520152565b60405190611ed2826118c6565b5f608083828152611ee1611ea6565b6020820152606060408201526060808201520152565b9015610e1e57803590607e1981360301821215610182570190565b903590609e1981360301821215610182570190565b903590601e1981360301821215610182570180359067ffffffffffffffff821161018257602001918160061b3603831361018257565b9190811015610e1e5760061b0190565b805115610e1e5760200190565b805160011015610e1e5760400190565b805160021015610e1e5760600190565b805160031015610e1e5760800190565b805160041015610e1e5760a00190565b805160051015610e1e5760c00190565b8051821015610e1e5760209160051b010190565b3580151581036101825790565b9081518082526020808093019301915f5b82811061200a575050505090565b835180516001600160a01b031686528201518583015260409094019392810192600101611ffc565b906080806120a861209661208460406001600160a01b0380895116885260208901519060a060208a01528082511660a08a015260208201511660c08901520151606060e08801526101008701906118a2565b60408701518682036040880152611feb565b60608601518582036060870152611feb565b93015191015290565b9081518082526020808093019301915f5b8281106120d0575050505090565b8351855293810193928101926001016120c2565b903590601e1981360301821215610182570180359067ffffffffffffffff82116101825760200191813603831361018257565b903590605e1981360301821215610182570190565b6121436115dd61213c8380611f12565b3690611b44565b5f525f602052600160405f2054036121df5780612163816121cf93611f12565b6121c76121826121876020850135938460408701359384923690611b44565b612ed1565b61219f6121948580611f12565b946060810190611e70565b92906121bf604051966121b188611997565b5f88525f3681373690611b44565b933691611bd7565b923392613102565b6040810151606090910151600192565b505f905f905f90565b5f5b60e081106121f6575050565b6060828201526020016121ea565b5f5b82811061221257505050565b606082820152602001612206565b926001600160a01b038451166001600160a01b03835116146126c8576001600160a01b03612255606086015160643590611fca565b515116906040830151916001600160a01b036122746084358095611fca565b51511614801590612688575b610dd8576040850151906001600160a01b0361229f6044358094611fca565b5151166001600160a01b036122ba60643560608a0151611fca565b51511614612676576122cb8661271c565b805f525f60205260405f20541561262357506122e68461271c565b805f525f60205260405f2054156125cf57506123c992916123a3917f6fa7f4c28634b0a9d6831401c45ae468195fb63aed07308935c35374ff5d9e396040518061234e61234061012033845280602085015283018d612032565b82810360408401528a612032565b85606083015260643560808301528760a083015260a43560c083015260c43560e083015260e4356101008301520390a16001600160a01b038651166040519261239684611997565b5f8452606435908a613102565b936001600160a01b03865116604051926123bc84611997565b5f845260a4359086613102565b916123d760408201516127dd565b1580156125bb575b80156125a8575b8015612595575b61258357604051916123fe8361192e565b5f83525f60208401525f60408401525f606084015261241d84836147dd565b8452604084015261244361243183866147dd565b6020860152806060860152845161352c565b94612457602085015160408601519061352c565b936124618761343e565b8015612574575b6125625761252961255b957fd9fa84dd790c969daa5c33d8050dc06b4a9b59d5b42e2be5f5e8ae20447f618d9461250b6125609a60a0966124aa8a8851613580565b6124b88c6020890151613580565b6124c68a60408901516135de565b6124d48c60608901516135de565b6124dd8a61390a565b6124e68c61390a565b6001600160a01b0361250260c435926060606435910151611fca565b515116336128cd565b50506001600160a01b0361250260e43592606060a435910151611fca565b5050606060405191338352805160208401526020810151604084015260408101518284015201516080820152a1613731565b613731565b565b604051630d86822160e01b8152600490fd5b5061257e8561343e565b612468565b6040516321badf1f60e01b8152600490fd5b506125a3606084015161343e565b6123ed565b506125b6606082015161343e565b6123e6565b506125c960408401516127dd565b156123df565b9351604080513381526001600160a01b039092166020830152810194909452507fb70c12fa453793fa6818ec07c91e74363a47aa6a6829dcd9533937fdf30314f3945091925082915050606081015b0390a1565b9551604080513381526001600160a01b039092166020830152810196909652507fb70c12fa453793fa6818ec07c91e74363a47aa6a6829dcd9533937fdf30314f39493508392505060608201905061261e565b604051631cd2f1c760e21b8152600490fd5b506001600160a01b036126a2606085015160a43590611fca565b5151166001600160a01b036126be604088015160443590611fca565b5151161415612280565b604051630a98f1f360e21b8152600490fd5b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00600281541461270a5760029055565b604051633ee5aeb560e01b8152600490fd5b604051612747816127396020820194602086526040830190612032565b03601f1981018352826119b3565b51902090565b612560929161277861028f923390919060405192600284526020840152604083015260608201604052565b92604051936127868561197a565b60078552612796602086016121e8565b61279f85611f6d565b526111f384611f6d565b9091156127b4575050565b6040516305dbdfd960e41b81526001600160a01b03918216600482015291166024820152604490fd5b6127fc905f60e01d906001600160e01b038160e01d9116601b0b614840565b1290565b906127fc916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b6148c1565b92919261283382613b05565b9361283d8161343e565b6128bb5784816001600160e01b0361285c9360e01d9116601b0b614940565b9290809315612892575b50829081612876575b5050509190565b61288a926001600160a01b03309216612da4565b5f818161286f565b9092505f1981146128a757600101915f612866565b634e487b7160e01b5f52601160045260245ffd5b604051632eaefac360e21b8152600490fd5b939291936128da8361343e565b61297857846128f6576128ee939450612e68565b50505f905f90565b6001600160a01b039392919380911694855f52602060018152604092835f20961695865f528152825f20825f528152612933835f20549485613556565b9561293d8761343e565b612960575f97885260018252838820908852815282872091875252909320829055565b835163c5e12af560e01b815260048101889052602490fd5b60405163793a8f5560e01b815260048101849052602490fd5b6040805192936129a08461197a565b6007845260206129b18186016121e8565b5f5b84518110156129e657806129c960019287611fca565b516129d48289611fca565b526129df8188611fca565b50016129b3565b50925092939093335f52308352845f2092855191612a0383611912565b612a0b611ea6565b835260608281940152865193612a2085611997565b5f8552875190612a2f82611997565b5f82525f3681375f5b8151811015612b8f57612a4b8183611fca565b51908a8251015151612a62575b6001915001612a38565b8a89875f612a73828701518a613c40565b938651946001600160a01b0394828680895116968901511697015190835197612a9b8961195e565b88528d88015282870152828d87015260808601528c60a08601528860c086015251809263d04dfe2360e01b82528180612ad860049889830161304a565b03915afa948515612b855789915f96612b5f575b508551612afd575b50505050612a58565b5101511692833b1561018257612b2b935f92838f5180978195829463012c676d60e21b8452339084016136f0565b03925af1918215612b5557600192612b46575b808781612af4565b612b4f9061194a565b5f612b3e565b8b513d5f823e3d90fd5b612b7c9196503d805f833e612b7481836119b3565b810190612f06565b9050945f612aec565b8e513d5f823e3d90fd5b50505050505050509050565b8215612bd0576001600160a01b038091165f52600160205260405f2091165f5260205260405f20905f5260205260405f205490565b909150612bdc82613be4565b6001600160a01b03809316906040918251946370a0823160e01b86528416938460048701526020928387602481865afa968715612cf2575f97612cfc575b5083612c33612c2c83612c639a614a6c565b5090614280565b508651636eb1769f60e11b81526001600160a01b0390941660048501523060248501529297889081906044820190565b0381865afa968715612cf2575f97612cc1575b50612c2c612c8791611a3698614a6c565b50612c928183613461565b15612cb95750935b5f5260018252825f20905f528152815f20905f8052525f205490613556565b905093612c9a565b96508387813d8311612ceb575b612cd881836119b3565b8101031261018257955195612c2c612c76565b503d612cce565b85513d5f823e3d90fd5b96508387813d8311612d24575b612d1381836119b3565b810103126101825795519583612c1a565b503d612d09565b6040519263a9059cbb60e01b5f526001600160a01b0380931660045260245260205f60448180855af160015f5114811615612d85575b8360405215612d6f57505050565b635274afe760e01b835216600482015260249150fd5b6001811516612d9b57813b15153d151616612d61565b833d5f823e3d90fd5b9092604051936323b872dd60e01b5f526001600160a01b0393848092166004521660245260445260205f60648180855af160015f5114811615612df4575b836040525f60605215612d6f57505050565b6001811516612d9b57813b15153d151616612de2565b93929193612e178361343e565b6129785784612e2b576128ee939450612827565b6001600160a01b039392919380911694855f52602060018152604092835f20961695865f528152825f20825f528152612933835f2054948561352c565b90929192612e7581613b05565b93612e7f8161343e565b612ebf5784816001600160e01b03612e9e9360e01d9116601b0b614940565b50809281612ead575050509190565b6001600160a01b0361288a9316612d2b565b604051632d1671a360e11b8152600490fd5b91612efc906060612ef1936001600160a01b039485916040880151611fca565b515116940151611fca565b5151161461267657565b919060408382031261018257825167ffffffffffffffff908181116101825784019082601f83011215610182578151602092612f4182611a97565b91612f4f60405193846119b3565b808352848084019160051b830101918683116101825785809101915b838310612fde5750505050948281015191821161018257019180601f84011215610182578251612f9a81611a97565b93612fa860405195866119b3565b818552838086019260051b820101928311610182578301905b828210612fcf575050505090565b81518152908301908301612fc1565b8251815291810191869101612f6b565b90808251908181526020809101926020808460051b8301019501935f915b84831061301c5750505050505090565b909192939495848061303a600193601f198682030187528a516120b1565b980193019301919493929061300c565b91906020928381526001600160a01b0382511684820152838201516040820152613084604083015160e060608401526101008301906118a2565b90606083015160808201526130ab608084015192601f1993848483030160a0850152612fee565b9260a081015193838382030160c08401528680865192838152019501905f5b8181106130ee57505050611a3694955060c060e091015192828503019101526120b1565b8251875295880195918801916001016130ca565b949193613347919360c0915f6132ce6040928351946131208661195e565b613128611ec5565b86526020958487820152848682015260609781868a809401528260808201528660a0820152015261327e85519161315e8361197a565b6007835261316d8884016121e8565b8d6131778161271c565b9c896001600160a01b039e8f94859182865116908d5194600486528501528c840152168c82015233608082015260a081018a526131b386611f6d565b526131bd85611f6d565b5088516131c9816118f6565b6002815289368c8301376131dc86611f7a565b526131e685611f7a565b5060ff8a6132498b8501936132338761320c81613204858a51611fca565b515116613be4565b9751168861321b848951611fca565b5151168561322a858a51611fca565b51015191612b9b565b9661323f828751611fca565b5151169451611fca565b51015192169093929190604051946005865260208601526040850152606084015260808301525f60a083015260c08201604052565b61328782611f8a565b5261329181611f8a565b506132b58a8d8d60ff8a6132498d8501936132338761320c81613204858a51611fca565b6132be82611f9a565b526132c881611f9a565b50613c40565b95878a511697848b0191825191868184511693015116928a855230875285808620915101518651916132ff83611997565b86835287519561330e8761195e565b86528886015286850152848885015289608085015260a084015260c08301528351808098819463d04dfe2360e01b83526004830161304a565b03915afa968715613434575f945f98613412575b508451600281106133fb5750818386015195015161338161337b88611faa565b51611f9a565b5161338c8183613461565b156133f35750925b6133b68685919060405192600284526020840152604083015260608201604052565b6133bf88611f8a565b526133c987611f8a565b508251996133d68b61195e565b8a52890152870152850152608084015260a083015260c082015290565b905092613394565b602490835190630fbb8e5560e21b82526004820152fd5b90975061342a9194503d805f833e612b7481836119b3565b939093965f61335b565b50513d5f823e3d90fd5b61345d905f60e01d906001600160e01b038160e01d9116601b0b614840565b1390565b9061345d916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b6148c1565b6134af6001600160e01b0392838316601b0b9260e01d938160e01d9116601b0b8484614037565b90637ffffff582136134ff575b906134c691614280565b92909215806134f7575b6134d957505090565b6044925060405191638eba4d0760e01b835260048301526024820152fd5b5082156134d0565b6135098282614f20565b156134bc57604483856040519163d556b11160e01b835260048301526024820152fd5b611a3691610bd2916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b614486565b611a3691610bd2916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b61464a565b6135da91608081018261359c6135968351611faa565b51611faa565b526135d36135cd6001600160a01b038094515116936135c46135be8551611faa565b51611f6d565b51169251611faa565b51611f8a565b5191612e0a565b5050565b906080810191806135f26135968551611f9a565b526001600160a01b0380925151169161360e6135be8551611f9a565b511661361d6135cd8551611f9a565b5190816136b85761362d8361343e565b612978579183917f4cb6e22a3e7e651d7cf0376cff48f20f5007a54147777865be7f5f6c38c50f4a959361261e955f5260209060018252613683604094855f20835f528452855f20855f528452855f2054613556565b945f5260018252835f20905f528152825f20915f52525f20555b51604051918291338352604060208401526040830190612fee565b916136e9917f4cb6e22a3e7e651d7cf0376cff48f20f5007a54147777865be7f5f6c38c50f4a959361261e956128cd565b505061369d565b90604082019082526020606081936040838201528551809452019301915f5b82811061371d575050505090565b83518552938101939281019260010161370f565b60c0810151908151915f926138a5575b506137e66020918281510151926001600160a01b039081818187511696015116928660a082019485518252308452604097888320898686510151015160808601518b519161378e83611997565b8683528c519361379d85611997565b8785528d51966137ac8861195e565b8752898701528c86015260016060860152608085015260a084015260c08301528851808099819463d04dfe2360e01b83526004830161304a565b03915afa94851561389b57879561387d575b508451613809575b50505050505050565b81905101510151169051813b156138795791849184938361383e965180978195829463012c676d60e21b8452600484016136f0565b03925af19081156138705750613859575b8080808080613800565b613863829161194a565b61386d578061384f565b80fd5b513d84823e3d90fd5b8480fd5b6138929195503d8089833e612b7481836119b3565b9050935f6137f8565b86513d89823e3d90fd5b6001600160a01b03602080845101510151169060a083015190823b15610182576138e8925f928360405180968195829463012c676d60e21b8452600484016136f0565b03925af1801561022c57156137415761390291925061194a565b5f905f613741565b6080810161391b6135cd8251611f9a565b5191821561392857505050565b6139426135be6001600160a01b0380935151169351611f9a565b5116815f5260209160018352604092835f20835f528152835f20855f528152835f2054936001600160e01b03851661397d575b505050505050565b6139a1955f9284845260018152828420868552815282842091845252812055612e68565b5f808080613975565b81156139b4570490565b634e487b7160e01b5f52601260045260245ffd5b6040815110613a10576020810151908051603f1981019081116128a75760051c82116139fc5760016020920160051b010190565b5050604051613a0a81611997565b5f815290565b50604051613a0a81611997565b805115613a2d57602001515f1a90565b505f90565b905f8091602081519101845af48080613ab0575b15613a665750506040513d81523d5f602083013e60203d82010160405290565b15613a8d57604051639996b31560e01b81526001600160a01b039091166004820152602490fd5b3d15613a9e576040513d5f823e3d90fd5b60405163d6bda27560e01b8152600490fd5b503d151580613a465750813b1515613a46565b60041115613acd57565b634e487b7160e01b5f52602160045260245ffd5b602090939291936001600160a01b036040820195168152613b0183613ac3565b0152565b613b0d61500e565b6040805163b7bad1b160e01b81526001600160a01b0383166004820152909182826024815f73200e12d10bb0c5e4a17e7018f0f1161919bb93895af1928315613bdb575f925f94613ba6575b50613b6383613ac3565b600183141580613b94575b613b785750505090565b5163ee07877f60e01b81529182916106df919060048401613ae1565b50613b9e83613ac3565b821515613b6e565b90809450613bca9293503d8511613bd4575b613bc281836119b3565b810190614916565b919091925f613b59565b503d613bb8565b513d5f823e3d90fd5b613bec61500e565b60408051630782d7e160e01b81526001600160a01b03831660048201529091828260248173200e12d10bb0c5e4a17e7018f0f1161919bb93895afa928315613bdb575f925f94613ba65750613b6383613ac3565b90805191613c4d83611a97565b91613c68604094613c60865195866119b3565b808552611a97565b601f199460209186013686840137835183519095908015613e67576001613cbe9101965b6001978891010197613cb5613ca08a611a97565b99613cad86519b8c6119b3565b808b52611a97565b01848901612204565b85805f9684516002815233878201523086820152606081018652613ce18b611f6d565b52613ceb8a611f6d565b505f925b613e23575b5050508351613d07575b50505050505090565b85809598979692980181613d1b8289611fca565b52613d268188611fca565b505f925b613d39575b5085969750613cfe565b8451831015613e1e576001600160a01b03613db081613d588689611fca565b51511686613d66878a611fca565b51015187815160051b9101207f19457468657265756d205369676e6564204d6573736167653a0a3332000000005f52601c52603c5f208c613da7888b611fca565b51015191614a9a565b15613e0657868098999a928192613dc7878a611fca565b515116613dd48787611fca565b52019385613de28289611fca565b510151613def868c611fca565b52613dfa858b611fca565b50019290989796613d2a565b8951630a57f30960e31b815260048101859052602490fd5b613d2f565b9091968151881015613e5e578280910197613e3e8184611fca565b51613e498a8d611fca565b52613e54898c611fca565b5001919081613cef565b96829150613cf4565b50613cbe5f96613c8c565b9091939284158215175f14613e8c5750505090505f905f90565b82810192600160fd1b8082019083011760fe1c613fc3575b5050613eaf81614be5565b93613eb981614be5565b94613ec48682614c05565b90918215613fb4575f9083986f0785ee10d5da46d900f436a000000000808611613fa6575b50670de0b6b3a7640000808b11613f97575b50633b9aca00808b11613f88575b50612710808b11613f7a575b5098805b613f695750819061189e989982600a0a9109960195817fcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccd0a93838211900382610100031b9203901c170291614c18565b60019290920191600a900480613f19565b60049a04998a930192613f15565b600991939a049901915f613f09565b601291939a049901915f613efb565b85049950602592505f613ee9565b5092905061189e949550614c18565b5f82121561401757808413614009575b7f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb2841315613ea45790925061189e939491614b23565b90925061189e939491614b8a565b80841215613fd35790925061189e939491614b23565b6134c68282614280565b9290918061405d576044848460405191637a97930f60e01b835260048301526024820152fd5b90919280155f1461407257505050505f905f90565b61408b9361407f91614cd2565b92919490938492614cd2565b909391928461409988614be5565b916140a386614be5565b947f161bcca7119915b50764b4abe86529797775a5f171951000000000000000000094604c9186881061424a575b030191600160ff1b98838a018112155f14614217575050035b5f955f82128061420e575b6141f0575b5f8112806141de575b6141c05786820103966001600160ff1b03881490816141b6575b50806141ad575b806141a4575b61418657509061413a9291614e7e565b915f811361414d575b5061189e93614c18565b9091604c821361417b5761416491600a0a906139aa565b908115614171575f614143565b505050505f905f90565b50505050505f905f90565b876044916040519163d556b11160e01b835260048301526024820152fd5b505f851261412a565b50828414614124565b905088145f61411d565b604489836040519163d556b11160e01b835260048301526024820152fd5b50806001600160ff1b03018213614103565b95508087018613156142085786818703015b956140fa565b5f614202565b505f81136140f5565b89985090920390506001600160ff1b038190038701821361423b57018601946140ea565b5050505050505050505f905f90565b7f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee80000000000000000009650604b92506140d1565b81156139b4570590565b8082601b82810b8314614475577d90e40fbeea1d3a4abc8955e946fe31cdcf66f634e10000000000000000008405614421575b8380820b0361441057507b199999999999999999999999999999999999999999999999999999987b0ccccccccccccccccccccccccccccccccccccccccccccccccccccccc840111156143c1575b838060030b03614345575b8084136143295750506001600160e01b036001925b60e01b91161791565b8303600a0a80156139b4576001600160e01b0391071592614320565b92915f84131561439557509061435b8383614f20565b61437757637ffffffe1901600a0a810290637fffffff9261430b565b506044916040519163d556b11160e01b835260048301526024820152fd5b637fffffff19928303906043821361417b576143b491600a0a90614276565b918215614171579261430b565b5f198401808060030b146143d55750614300565b90506001600160e01b039293507b7fffffffffffffffffffffffffffffffffffffffffffffffffffffff915060e01b9260ff1d181617905f90565b600190940193600a909305926142b3565b937f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee8000000000000000000840515614462576305f5e100600894058094819201955b9150506142b3565b620186a06005940580948192019561445a565b508261430057505050505f90600190565b919291600160ff1b840161449e5761189e9350614f39565b9061189e935f039161464a565b919291600160ff1b91908015806146385750906144c791614cd2565b9490929091905f86858585828213801561462f575b614612575b505050508682841860ff1c94860391039081604c0381116145f75701600a0a8082059190846145dd575b505081019182821860ff1c11156145d557826001600160ff1b03146145b757905f600192135f1461458857600a9004915b01925b8115811761454c57509190565b80614565575b50801561455d579190565b505f91508190565b919261457b9203600160ff1b01600a0a90614276565b600160ff1b91905f614552565b600a60037fe666666666666666666666666666666666666666666666666666666666666667920104019161453c565b604490836040519163d556b11160e01b835260048301526024820152fd5b50909261453f565b81076145ea575b8061450b565b60ff1d600117015f6145e4565b505050919350614605579190565b60018160ff1d1790039190565b5f9a50909750909550600160ff1b945092509050868080806144e1565b50835f126144dc565b156146435750509190565b9350919050565b939291938415811581811761479b5750509061466591614cd2565b919490829561467682958294614cd2565b8096929491969387868482138015614792575b614779575b5050505050508682841860ff1c94860391039081604c0381116145f75701600a0a80820591908461475f575b505081019182821860ff1c111561475757826001600160ff1b03146145b757905f600192135f1461472857600a9004915b01925b811581176146fb57509190565b8061470b5750801561455d579190565b600160ff1b936147229291038401600a0a90614276565b5f614552565b600a60037fe66666666666666666666666666666666666666666666666666666666666666792010401916146eb565b5090926146ee565b810761476c575b806146ba565b60ff1d600117015f614766565b929b5098509196509450925090505f808080808061468e565b50858412614689565b93959390929190156147b157505061455d579190565b945092915050565b6008815110613a2d576008015167ffffffffffffffff1667ff0a89c674ee78741490565b9160408301926040614817610bd2606087519401938451906001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b613e72565b94519301614826815186612800565b61482e575050565b909350611a3691925051925183613488565b92915f9060018184145f871287151717176148ba575f928082136148ac575b03604c81135f8212176148a057600a0a908461487e8382029384614276565b146148935750501561488f575f9190565b5f90565b9093509015611a36579190565b50501561488f575f9190565b5f956001945092509061485f565b5050505f90565b93929190918083145f83125f87121883158715171717614910575f928082136149035703604c81135f8212176148a057600a0a908461487e8382029384614276565b919460019350919061485f565b50919050565b919082604091031261018257815160048110156101825760209092015160ff811681036101825790565b91925f831215614968576044838360405191634a7d166b60e01b835260048301526024820152fd5b91928361497a57505090505f90600190565b60ff8116820191808312614a42575f8312156149b2575050604c19811261455d575f03600a0a916149ab83826139aa565b9283021490565b909293915f81135f14614a3857604d8113614a0d57600a0a9283156139b457835f190483116149e45750500290600190565b60405163c849483b60e01b815260048101849052602481019290925260ff166044820152606490fd5b5060405163c849483b60e01b81526004810192909252602482015260ff919091166044820152606490fd5b5050905090600190565b60405163c849483b60e01b815260048101869052602481019190915260ff82166044820152606490fd5b9060ff165f03916001600160ff1b0382115f14614a9257600a6001818404940192061590565b909190600190565b9091813b614ad557614aac9192615077565b50614ab681613ac3565b159182614ac257505090565b6001600160a01b03918216911614919050565b6020918160645f935160405192630b135d3f60e11b9788855260048501526040602485015286820190604485015e8281018201859052601f01601f191601915afa905f5114601f3d11161690565b909392915f614b33918184613e72565b9490945f8483019182019412159081614b80575b8115614b76575b50614b5857505090565b604492506040519163d556b11160e01b835260048301526024820152fd5b905083125f614b4e565b8281129150614b47565b614b9f93600160fe1b90810193920190613e72565b9081815f821215614bd6575050604b1982126128ee57614bc4915f03600a0a90614276565b9081614bce575f90565b600160ff1b90565b93600160ff1b90910192509050565b5f811215611a3657600160ff1b90808203614bfe575090565b90505f0390565b905f198183099102908180821091030391565b92939291905f8184181215614cad576001600160ff1b039283831115614c9757600160ff1b93838503614c4d57505050509190565b90919293508514614c67575050600a600191045f03920190565b604051630ed8062160e21b8152600481019190915260248101919091526044810182905260648101849052608490fd5b5090915050600160ff1b81146128a7575f039190565b90916001600160ff1b038084111561286f578514614c67575050600a60019104920190565b9190918015614e7457827f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee800000000000000000080830515614d82575b507f19999999999999999999999999999999999999999999999999999999999999997f0ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc830110614d73575b8313614d5d5791905f90565b919060018060ff1b926001600160ff1b03030190565b9290600a02905f190192614d51565b6f4b3b4ca85a86c47a098a22400000000080840515614e62575b507728c87cb5c89a2571ebfdcb54864ada834a00000000000000830515614e4b575b7b097edd871cfda3a5697758bf0e3cbb5ac5741c640000000000000000830515614e37575b7e3899162693736ac531a5a58f1fbb4b746504382ca7e4000000000000000000830515614e2757820515614e18575b5f614d06565b9290600a02905f190192614e12565b9391606402916001190193614de3565b93916402540be40002916009190193614de3565b9391678ac7230489e8000002916012190193614dbe565b6025198301955092909202915f614d9c565b505f915081908190565b90915f198383099280830292838086109503948086039584871015614efc5714614ef4579082910960018219018216809204600280826003021880830282030280830282030280830282030280830282030280830282030280920290030293600183805f03040190848311900302920304170290565b505091500490565b60648386866040519263362ced0960e11b8452600484015260248301526044820152fd5b611a3691905f811215614f34575f036150b1565b6150b1565b909291600160ff1b91828101614fcb5750808414614fc157808413918215614fb9578185035b604c811115614fa85750505f915b15614f9957507f8000000000000000000000000000000000000000000000000000000000000001019190565b92506001600160ff1b03039190565b600a0a9081156139b4570491614f6d565b848203614f5f565b505090505f905f90565b93614fd892945f036144ab565b80939180928114614fec575b50505f039190565b915092506001600160ff1b0383146145b757600a600191059201915f80614fe4565b73200e12d10bb0c5e4a17e7018f0f1161919bb9389803b15801561504c575b6150345750565b602490604051906373e6d7b360e01b82526004820152fd5b507f1de7d717526cba131d684e312dedbf0852adef9cced9e36798ae4937f7145d41813f141561502d565b81519190604183036150a7576150a09250602082015190606060408401519301515f1a90615140565b9192909190565b50505f9160029190565b90637ffffff581131561513a57637ffffffe1981019060438213615133575f82121561510757637fffffff91505f0301600a0a7b8000000000000000000000000000000000000000000000000000000202111590565b50600a0a80156139b4577b80000000000000000000000000000000000000000000000000000001041090565b5050151590565b50505f90565b91907f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a084116151b7579160209360809260ff5f9560405194855216868401526040830152606082015282805260015afa1561022c575f516001600160a01b038116156151ad57905f905f90565b505f906001905f90565b5050505f916003919056000000000000000000000000000000000000000000000000000000000000000000000000000000000000200e12d10bb0c5e4a17e7018f0f1161919bb93890000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000044b608060405234801561000f575f80fd5b506004361061004a575f3560e01c80630782d7e11461004e57806354636d2b14610078578063b7bad1b11461009d578063f5c36eaf146100b0575b5f80fd5b61006161005c366004610363565b6100c3565b60405161006f929190610403565b60405180910390f35b61008b610086366004610363565b6100d8565b60405160ff909116815260200161006f565b6100616100ab366004610363565b6100e9565b61008b6100be366004610363565b6100f5565b5f806100cf5f84610100565b91509150915091565b5f6100e35f836101f0565b92915050565b5f806100cf5f84610281565b5f6100e35f83610356565b73ffffffffffffffffffffffffffffffffffffffff81165f9081526020838152604080832081518083019092525460ff8082161515835261010090910416818301527f313ce56700000000000000000000000000000000000000000000000000000000808452839283908190816004818a5afa915060203d1015610182575f91505b811561019857505f5160ff811115610198575f91505b816101af57505050602001516003925090506101e9565b83516101c3575f955093506101e992505050565b836020015160ff1681146101d85760026101db565b60015b846020015195509550505050505b9250929050565b5f805f6101fd8585610281565b909250905060018260038111156102165761021661039d565b1415801561023557505f8260038111156102325761023261039d565b14155b156102795783826040517fee07877f000000000000000000000000000000000000000000000000000000008152600401610270929190610421565b60405180910390fd5b949350505050565b5f805f8061028f8686610100565b90925090505f8260038111156102a7576102a761039d565b0361034b576040805180820182526001815260ff838116602080840191825273ffffffffffffffffffffffffffffffffffffffff8a165f908152908b9052939093209151825493517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00009094169015157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff161761010093909116929092029190911790555b909590945092505050565b5f805f6101fd8585610100565b5f60208284031215610373575f80fd5b813573ffffffffffffffffffffffffffffffffffffffff81168114610396575f80fd5b9392505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b600481106103ff577f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b9052565b6040810161041182856103ca565b60ff831660208301529392505050565b73ffffffffffffffffffffffffffffffffffffffff831681526040810161039660208301846103ca56000000000000000000000000000000000000000000"; + hex"000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000526000000000000000000000000050ad4ff129155d8f584deda447b11b4f5138840d000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000051b66080806040526004361015610012575f80fd5b5f3560e01c90816301ffc9a714611792575080631f69cb751461155c5780632cb77e9f146115305780632fbc4ba0146113ce57806341d1514f146113975780635cffe9de1461123b578063607461191461109f578063613255ab1461101c57806369c728561461072b578063709fb8a5146104375780639235084d146103e3578063ac9650d814610295578063d7e442ec14610237578063d9d98ce4146101865763fa501182146100c1575f80fd5b34610182576101403660031901126101825767ffffffffffffffff600435818111610182576100f4903690600401611b27565b6024358281116101825761010c903690600401611b27565b60c0366043190112610182576101043583811161018257610131903690600401611ccd565b90610124359384116101825761014e61015c943690600401611ccd565b926101576126bd565b612203565b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055005b5f80fd5b34610182576040366003190112610182576001600160a01b036101a7611816565b166040516370a0823160e01b8152306004820152602081602481855afa90811561022c575f916101fa575b50156101e25760206040515f8152f35b60249060405190633c5bf76960e21b82526004820152fd5b90506020813d602011610224575b8161021560209383611996565b810103126101825751826101d2565b3d9150610208565b6040513d5f823e3d90fd5b346101825760203660031901126101825760043567ffffffffffffffff81116101825761028f61026e61015c9236906004016117e5565b91906102786126bd565b604051926102858461197a565b5f84523691611da1565b90612bb1565b34610182576020806003193601126101825760043567ffffffffffffffff8111610182576102c79036906004016117e5565b9190604051926102d68461197a565b5f84528284016102e582611a7a565b946102f36040519687611996565b8286526102ff83611a7a565b9361031186880195601f1901866121e7565b5f5b84811061037557604080518881528951818a018190525f92600582901b83018101918a918c9085015b8287106103495785850386f35b909192938280610365600193603f198a820301865288516118a2565b960192019601959291909261033c565b806103c4886103be61039160019560059d9c9d1b8701876120c7565b929089846040519586938585013782018381015f81528b519283915e015f83820152038084520182611996565b30613a26565b6103ce828a611fad565b526103d98189611fad565b5001969596610313565b3461018257600319602036820112610182576004359067ffffffffffffffff82116101825760809082360301126101825761042260609160040161210f565b90604051921515835260208301526040820152f35b34610182576003196040368201126101825760043567ffffffffffffffff8082116101825760c08260040193833603011261018257602435908111610182576104849036906004016117e5565b61048f9291926126bd565b6104c06104bb6104b66104af6104a588806120fa565b60408101906120c7565b36916119b8565b6139bc565b613a11565b801561071957600110156107075760248201926104dd8486611f0a565b9050156106f55760448301936104f38587611f0a565b9050156106e3576105596105219561054d6105186105118a806120fa565b948a611f0a565b9890928a611f0a565b91909261053e60405196610534886118c6565b3388523690611a1c565b9960209a8b8801523691611a92565b60408501523691611a92565b606082015260648401356080820152610571816126ff565b90815f525f865260405f209485541595866105b5575b878760017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055604051908152f35b6001905560a46001600160a01b03917f87491344dfbcf91f6cbbc610cbbeedc85313d37a02df0c93527f7ea5f8db717f83855116604051908152868b82015260606040820152806106096060820188612015565b0390a10191610618838a6120c7565b905061063b575b50505061062e93949550612730565b8190838080808080610587565b6106486104af848b6120c7565b610651816147ad565b156106bc57509761068f7fd46c2c56b35c8210e9e712ec3f02242d5fc90187c0ac8ed80cc33626846ec369936106af9361062e999a9b5116926120c7565b92906040519384938452868c850152606060408501526060840191611cfc565b0390a1859493878061061f565b886106df604051928392630c89984b60e31b8452600484015260248301906118a2565b0390fd5b60405163540e5f0b60e01b8152600490fd5b604051636c44ef8f60e01b8152600490fd5b604051633c8270bd60e21b8152600490fd5b604051632cff108b60e21b8152600490fd5b34610182576003196020368201126101825767ffffffffffffffff600435116101825760c09060043536030112610182576107646126bd565b5f808061077960048035608481019101611e53565b90501561100a576024600435013592610791846127c0565b15610ff8576060806040516107a58161192e565b6107ad611ea8565b81525f60208201525f604082015201526107c5611ea8565b506108256108206107ff6107f56107ef6107e9608460043501600435600401611e53565b90611eda565b80611ef5565b6040810190611f0a565b60206108186107e9608460043501600435600401611e53565b013591611f40565b611ce8565b936001600160a01b0361087461082061085b6108516107ef6107e9608460043501600435600401611e53565b6060810190611f0a565b60406108186107e9608460043501600435600401611e53565b8160405197610882896118f6565b16875216602086015260408501526108a4608460043501600435600401611e53565b9490506001604051955f87520160051b85016040525f905f5b6108d1608460043501600435600401611e53565b9050811080610fe5575b15610e32576108f4608460043501600435600401611e53565b821015610e1e578160051b810135607e198236030181121561018257608081830136031261018257604051916109298361192e565b8181013567ffffffffffffffff81116101825761094b90369084840101611b27565b835280820160208181013590850152604080820135908501526060013567ffffffffffffffff8111610182576109849236920101611ccd565b606082015280516001600160a01b036109a66040830151602085015190611fad565b5151166001600160a01b0385511614801590610dea575b610dd8576109d5602083015160408401519083613102565b6109de816126ff565b91825f525f60205260405f2054155f14610a42575051604080513381526001600160a01b039092166020830152810191909152600191907fb70c12fa453793fa6818ec07c91e74363a47aa6a6829dcd9533937fdf30314f390606090a15b016108bd565b9190610a73602084979597015160408501519060608601519060405192610a688461197a565b5f8452339186613137565b925f93610a8b606082015160446004350135906127e3565b15610af257505051604080513381526001600160a01b03909216602083015281019190915260019291907fe3151dc8cb7a54ffc4baabd28c1f241c94d510b5e5b502491ac3cad6c16316d590606090a15b8115610aea575b5092610a3c565b905088610ae3565b610aff60408201516127c0565b158015610dc5575b15610b5c57505051604080513381526001600160a01b03909216602083015281019190915260019291907f500b713857325f9e6dcb52ae832eca9109d107ed1aae9cb4928b4c1e13f051aa90606090a1610adc565b9250925050600196959691610b75606460043501611fc1565b15610d325796610be597610bf560408401516040880151610b968183613496565b15610d2a5750925b610bef848592610bd8610bd260608a01516001600160e01b03601b918660e01d92828816810b928260e01d9216900b613e66565b90614021565b9d8e9260408d0151613561565b60408c015261358b565b9961358b565b98610c0084846135b5565b610c0a8482613613565b60405192338452608060208501526060610c308451608080880152610100870190612015565b93602081015160a0870152604081015160c0870152015192607f198582030160e0860152835180825260208201906020808260051b8501019601925f5b828110610ccc57505050505092806001979695937f194f1feb3b4d7076a2c272e774e792e0c48bb8c7aa1a9a3671c1cd6da9e6b4c193610cc796604084015260608301520390a180858c5101808d5260051b8c0152613725565b610adc565b9091929396602080610d1d600193601f198782030189528b51906001600160a01b0382511681526040610d0c858401516060878501526060840190612094565b9201519060408184039101526118a2565b9901950193929101610c6d565b905092610b9e565b610be590610bf56060840151610bef610d70610bd260408801516001600160e01b0394601b90868360e01d9316820b91878260e01d9216900b613e66565b60408a0151610d7f8183613496565b15610dbd5750915b829c8d916060890151908116155f14610dae575060408801515b96879460408d0151613561565b610db890856134bd565b610da1565b905091610d87565b50610dd36060820151613473565b610b07565b60405163936bb5ad60e01b8152600490fd5b506001600160a01b03610e066060830151604085015190611fad565b5151166001600160a01b0360208601511614156109bd565b634e487b7160e01b5f52603260045260245ffd5b50919390610e44606460043501611fc1565b15610fdf57835b6004356004013590610e5d8282613496565b610fc15750508490610e7d856001600160a01b0360208701511633613099565b505060a46004350190610e95826004356004016120c7565b905015159081610fb9575b50610f18575b506001600160a01b03610ebc929351163361280a565b50505b8351811015610ee45780610ede610ed860019387611fad565b516138fe565b01610ebf565b5060409160017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f005582519182526020820152f35b90506001600160a01b03602084015116610f426001600160a01b03855116926004356004016120c7565b929091333b1561018257610f8a5f93604051958694859463691f9ed760e01b8652600486015260248501528960448501528a606485015260a0608485015260a4840191611cfc565b038183335af190811561022c57859115610ea6579050610faa915061194a565b5f836001600160a01b03610ea6565b905088610ea0565b604492506040519163573b6f4160e01b835260048301526024820152fd5b84610e4b565b50610ff360408301516127c0565b6108db565b60405163315f9e2360e21b8152600490fd5b604051639c95219f60e01b8152600490fd5b3461018257602080600319360112610182576024816001600160a01b03611041611816565b16604051928380926370a0823160e01b82523060048301525afa90811561022c575f91611072575b50604051908152f35b90508181813d8311611098575b6110898183611996565b81010312610182575182611069565b503d61107f565b34610182576110ad36611856565b6110b56126bd565b6110c084863361278c565b6110c9836127c0565b1561120e576110d9848633612dcc565b6110e38185613496565b15611208575082935b6110f88582883361303b565b9690947f8045c25080b0868951141ed0a91720bcad09a8364a2b3109ee1fd49c1f0bc8b860c0611129898533613099565b94906001600160a01b0360405192338452169a8b6020840152876040840152856060840152608083015260a0820152a1836111845760017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055005b6111fb9761028f9660ff946040519960078b5260208b015260408a01526060890152608088015260a08701521660c08501523360e0850152610100840193846040526111cf8561195e565b600685526111e061012082016121cb565b6111e985611f9d565b526111f384611f9d565b503691611da1565b808080808080808061015c565b936110ec565b604051623a3a4d60e21b81523360048201526001600160a01b038616602482015260448101859052606490fd5b34610182576080366003190112610182576004356001600160a01b03908181168091036101825761126a61182c565b6044359167ffffffffffffffff916064358381116101825736602382011215610182578060040135938411610182573660248583010111610182576112f79560209216936112b9868587612f5c565b60405196879283926323e30c8b60e01b84523360048501528760248501528860448501525f606485015260a06084850152602460a485019201611cfc565b03815f855af193841561022c575f94611363575b507f439148f0bbc682ca079e46d6e2c2f0c1e3b820f1a291b069d8882abf8cf18dd9840361134a5761133f93503091612fd5565b602060405160018152f35b604051630b6c58a960e31b815260048101859052602490fd5b9093506020813d60201161138f575b8161137f60209383611996565b810103126101825751928461130b565b3d9150611372565b346101825760603660031901126101825760206113c66113b5611816565b6113bd61182c565b60443591612dcc565b604051908152f35b34610182576113dc36611856565b839493926113e86126bd565b6113f384863361278c565b6113fc816127c0565b15611502578061141061145f92873361280a565b9590967f7f9dfa19cf1cc2f806f2f860fbc9c056b601fb1afc0e9b843dfe5c63616268e660806040513381526001600160a01b0384169a8b60208301528560408301526060820152a1336128b0565b9590938261148d5760017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055005b6114f69661028f9560ff936040519860068a5260208a01526040890152606088015260808701521660a08501523360c085015260e0840193846040526114d28561195e565b600685526114e361010082016121cb565b6114ec85611f8d565b526111f384611f8d565b8080808080808061015c565b6040516306dde9c360e41b81523360048201526001600160a01b038616602482015260448101859052606490fd5b34610182576020366003190112610182576004355f525f6020526020600160405f205414604051908152f35b3461018257600319604036820112610182576004359067ffffffffffffffff808311610182578260040160a08436039384011261018257602435828111610182576115ab9036906004016117e5565b906115b46126bd565b5f946001600160a01b0394856115c986611ce8565b163303611770576115e26115dd3687611b27565b6126ff565b91825f525f60205260405f2096600188541461162a575b60208960017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00556040519015158152f35b9091929394959697505f6001985560405191338352846020840152606060408401528161165689611842565b16606084015260248a013590606219018112156101825789019060a060808401528061168460048401611842565b1661010084015261169760248301611842565b1661012083015260448101356022198236030181121561018257019560246004880135970192871161018257863603831361018257602098608461175384936117127f09d18501db0080ca2d6cd7c17fa7255daff4b2d503ea93b76ff68b6752ea8e63976117639c6060610140890152610160880191611cfc565b6117446117396117256044880185611d1c565b605f198a8603810160a08c01529491611d51565b926064870190611d1c565b918784030160c0880152611d51565b91013560e08301520390a1612730565b82808080808080806115f9565b60248661177c87611ce8565b6040516335252be360e01b815291166004820152fd5b34610182576020366003190112610182576004359063ffffffff60e01b82168092036101825760209163e414309160e01b81149081156117d4575b5015158152f35b6301ffc9a760e01b149050836117cd565b9181601f840112156101825782359167ffffffffffffffff8311610182576020808501948460051b01011161018257565b600435906001600160a01b038216820361018257565b602435906001600160a01b038216820361018257565b35906001600160a01b038216820361018257565b906080600319830112610182576004356001600160a01b0381168103610182579160243591604435916064359067ffffffffffffffff82116101825761189e916004016117e5565b9091565b805180835260209291819084018484015e5f828201840152601f01601f1916010190565b60a0810190811067ffffffffffffffff8211176118e257604052565b634e487b7160e01b5f52604160045260245ffd5b6060810190811067ffffffffffffffff8211176118e257604052565b6040810190811067ffffffffffffffff8211176118e257604052565b6080810190811067ffffffffffffffff8211176118e257604052565b67ffffffffffffffff81116118e257604052565b60e0810190811067ffffffffffffffff8211176118e257604052565b6020810190811067ffffffffffffffff8211176118e257604052565b90601f8019910116810190811067ffffffffffffffff8211176118e257604052565b92919267ffffffffffffffff82116118e257604051916119e2601f8201601f191660200184611996565b829481845281830111610182578281602093845f960137010152565b9080601f8301121561018257816020611a19933591016119b8565b90565b91906060838203126101825760405190611a35826118f6565b8193611a4081611842565b8352611a4e60208201611842565b602084015260408101359167ffffffffffffffff831161018257604092611a7592016119fe565b910152565b67ffffffffffffffff81116118e25760051b60200190565b929192611a9e82611a7a565b604092611aae6040519283611996565b819581835260208093019160061b84019381851161018257915b848310611ad757505050505050565b8583830312610182578386918251611aee81611912565b611af786611842565b81528286013583820152815201920191611ac8565b9080601f8301121561018257816020611a1993359101611a92565b91909160a0818403126101825760405190611b41826118c6565b8193611b4c82611842565b835267ffffffffffffffff9160208101358381116101825782611b70918301611a1c565b602085015260408101358381116101825782611b8d918301611b0c565b6040850152606081013592831161018257611bae6080939284938301611b0c565b60608501520135910152565b909291611bc684611a7a565b916040611bd66040519485611996565b839580855260208095019160059160051b8401948086116101825784935b868510611c05575050505050505050565b67ffffffffffffffff90853582811161018257870190606082850312610182578451611c30816118f6565b611c3983611842565b81528a83013584811161018257830185601f8201121561018257803590611c5f82611a7a565b91611c6c89519384611996565b8083528d808401918b1b83010191888311610182578e809101915b838310611cbd57509150508201528583013593841161018257611cae858c958695016119fe565b86820152815201940193611bf4565b82358152918101918f9101611c87565b9080601f8301121561018257816020611a1993359101611bba565b356001600160a01b03811681036101825790565b908060209392818452848401375f828201840152601f01601f1916010190565b9035601e198236030181121561018257016020813591019167ffffffffffffffff8211610182578160061b3603831361018257565b9190808252602080920192915f905b828210611d6e575050505090565b909192936001906001600160a01b03611d8687611842565b16815285830135838201526040908101950193920190611d60565b90929192611dae81611a7a565b91604091611dbf6040519485611996565b839581855260208095019160051b8301938185116101825783925b858410611dea5750505050505050565b67ffffffffffffffff908435828111610182578601908382860312610182578351611e1481611912565b82358481116101825786611e29918501611a1c565b81528983013593841161018257611e44868b95869501611ccd565b83820152815201930192611dda565b903590601e1981360301821215610182570180359067ffffffffffffffff821161018257602001918160051b3603831361018257565b60405190611e96826118f6565b60606040835f81525f60208201520152565b60405190611eb5826118c6565b5f608083828152611ec4611e89565b6020820152606060408201526060808201520152565b9015610e1e57803590607e1981360301821215610182570190565b903590609e1981360301821215610182570190565b903590601e1981360301821215610182570180359067ffffffffffffffff821161018257602001918160061b3603831361018257565b9190811015610e1e5760061b0190565b805115610e1e5760200190565b805160011015610e1e5760400190565b805160021015610e1e5760600190565b805160031015610e1e5760800190565b805160041015610e1e5760a00190565b805160051015610e1e5760c00190565b8051821015610e1e5760209160051b010190565b3580151581036101825790565b9081518082526020808093019301915f5b828110611fed575050505090565b835180516001600160a01b031686528201518583015260409094019392810192600101611fdf565b9060808061208b61207961206760406001600160a01b0380895116885260208901519060a060208a01528082511660a08a015260208201511660c08901520151606060e08801526101008701906118a2565b60408701518682036040880152611fce565b60608601518582036060870152611fce565b93015191015290565b9081518082526020808093019301915f5b8281106120b3575050505090565b8351855293810193928101926001016120a5565b903590601e1981360301821215610182570180359067ffffffffffffffff82116101825760200191813603831361018257565b903590605e1981360301821215610182570190565b6121266115dd61211f8380611ef5565b3690611b27565b5f525f602052600160405f2054036121c25780612146816121b293611ef5565b6121aa61216561216a6020850135938460408701359384923690611b27565b613102565b6121826121778580611ef5565b946060810190611e53565b92906121a2604051966121948861197a565b5f88525f3681373690611b27565b933691611bba565b923392613137565b6040810151606090910151600192565b505f905f905f90565b5f5b60c081106121d9575050565b6060828201526020016121cd565b5f5b8281106121f557505050565b6060828201526020016121e9565b926001600160a01b038451166001600160a01b03835116146126ab576001600160a01b03612238606086015160643590611fad565b515116906040830151916001600160a01b036122576084358095611fad565b5151161480159061266b575b610dd8576040850151906001600160a01b036122826044358094611fad565b5151166001600160a01b0361229d60643560608a0151611fad565b51511614612659576122ae866126ff565b805f525f60205260405f20541561260657506122c9846126ff565b805f525f60205260405f2054156125b257506123ac9291612386917f6fa7f4c28634b0a9d6831401c45ae468195fb63aed07308935c35374ff5d9e396040518061233161232361012033845280602085015283018d612015565b82810360408401528a612015565b85606083015260643560808301528760a083015260a43560c083015260c43560e083015260e4356101008301520390a16001600160a01b03865116604051926123798461197a565b5f8452606435908a613137565b936001600160a01b038651166040519261239f8461197a565b5f845260a4359086613137565b916123ba60408201516127c0565b15801561259e575b801561258b575b8015612578575b61256657604051916123e18361192e565b5f83525f60208401525f60408401525f606084015261240084836147d1565b8452604084015261242661241483866147d1565b60208601528060608601528451613561565b9461243a6020850151604086015190613561565b9361244487613473565b8015612557575b6125455761250c61253e957fd9fa84dd790c969daa5c33d8050dc06b4a9b59d5b42e2be5f5e8ae20447f618d946124ee6125439a60a09661248d8a88516135b5565b61249b8c60208901516135b5565b6124a98a6040890151613613565b6124b78c6060890151613613565b6124c08a6138fe565b6124c98c6138fe565b6001600160a01b036124e560c435926060606435910151611fad565b515116336128b0565b50506001600160a01b036124e560e43592606060a435910151611fad565b5050606060405191338352805160208401526020810151604084015260408101518284015201516080820152a1613725565b613725565b565b604051630d86822160e01b8152600490fd5b5061256185613473565b61244b565b6040516321badf1f60e01b8152600490fd5b506125866060840151613473565b6123d0565b506125996060820151613473565b6123c9565b506125ac60408401516127c0565b156123c2565b9351604080513381526001600160a01b039092166020830152810194909452507fb70c12fa453793fa6818ec07c91e74363a47aa6a6829dcd9533937fdf30314f3945091925082915050606081015b0390a1565b9551604080513381526001600160a01b039092166020830152810196909652507fb70c12fa453793fa6818ec07c91e74363a47aa6a6829dcd9533937fdf30314f394935083925050606082019050612601565b604051631cd2f1c760e21b8152600490fd5b506001600160a01b03612685606085015160a43590611fad565b5151166001600160a01b036126a1604088015160443590611fad565b5151161415612263565b604051630a98f1f360e21b8152600490fd5b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0060028154146126ed5760029055565b604051633ee5aeb560e01b8152600490fd5b60405161272a8161271c6020820194602086526040830190612015565b03601f198101835282611996565b51902090565b612543929161275b61028f923390919060405192600284526020840152604083015260608201604052565b92604051936127698561195e565b60068552612779602086016121cb565b61278285611f50565b526111f384611f50565b909115612797575050565b6040516305dbdfd960e41b81526001600160a01b03918216600482015291166024820152604490fd5b6127df905f60e01d906001600160e01b038160e01d9116601b0b614834565b1290565b906127df916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b6148b5565b92919261281682613af9565b9361282081613473565b61289e5784816001600160e01b0361283f9360e01d9116601b0b614934565b9290809315612875575b50829081612859575b5050509190565b61286d926001600160a01b03309216612fd5565b5f8181612852565b9092505f19811461288a57600101915f612849565b634e487b7160e01b5f52601160045260245ffd5b604051632eaefac360e21b8152600490fd5b939291936128bd83613473565b61295b57846128d9576128d1939450613099565b50505f905f90565b6001600160a01b039392919380911694855f52602060018152604092835f20961695865f528152825f20825f528152612916835f2054948561358b565b9561292087613473565b612943575f97885260018252838820908852815282872091875252909320829055565b835163c5e12af560e01b815260048101889052602490fd5b60405163793a8f5560e01b815260048101849052602490fd5b919060408382031261018257825167ffffffffffffffff908181116101825784019082601f830112156101825781516020926129af82611a7a565b916129bd6040519384611996565b808352848084019160051b830101918683116101825785809101915b838310612a4c5750505050948281015191821161018257019180601f84011215610182578251612a0881611a7a565b93612a166040519586611996565b818552838086019260051b820101928311610182578301905b828210612a3d575050505090565b81518152908301908301612a2f565b82518152918101918691016129d9565b90808251908181526020809101926020808460051b8301019501935f915b848310612a8a5750505050505090565b9091929394958480612aa8600193601f198682030187528a51612094565b9801930193019194939290612a7a565b91906020928381526001600160a01b0382511684820152838201516040820152612af2604083015160e060608401526101008301906118a2565b9060608301516080820152612b19608084015192601f1993848483030160a0850152612a5c565b9260a081015193838382030160c08401528680865192838152019501905f5b818110612b5c57505050611a1994955060c060e09101519282850301910152612094565b825187529588019591880191600101612b38565b90604082019082526020606081936040838201528551809452019301915f5b828110612b9d575050505090565b835185529381019392810192600101612b8f565b919091604092835192612bc38461195e565b60068452602094612bd58686016121cb565b5f5b8451811015612c0a5780612bed60019287611fad565b51612bf88289611fad565b52612c038188611fad565b5001612bd7565b50925092939093335f52308252825f2091835195612c2787611912565b612c2f611e89565b875260608281980152845190612c448261197a565b5f8252855190612c538261197a565b5f82525f3681375f5b8151811015612dc057898688612c728486611fad565b51888151948d80870151908151612c94575b5050505050505050600101612c5c565b905f92916001600160a01b0396612cb98887818d51169c015116998789015190613bd8565b95825199612cc68b61195e565b8a5289015287015285015260808401528760a08401528660c08401525f8c51809563d04dfe2360e01b82528180612d01600498898301612ab8565b03915afa938415612db6579089915f95612d90575b508451612d2c575b50899250808e8c938e612c84565b5101511691823b1561018257612d5a925f92838d5180968195829463012c676d60e21b845233908401612b70565b03925af18015612d86579060019291612d77575b81928782612d1e565b612d809061194a565b5f612d6e565b89513d5f823e3d90fd5b612dad9195503d805f833e612da58183611996565b810190612974565b9050935f612d16565b8c513d5f823e3d90fd5b50505050505050509050565b8215612e01576001600160a01b038091165f52600160205260405f2091165f5260205260405f20905f5260205260405f205490565b909150612e0d82613e0a565b6001600160a01b03809316906040918251946370a0823160e01b86528416938460048701526020928387602481865afa968715612f23575f97612f2d575b5083612e64612e5d83612e949a614ae9565b5090614274565b508651636eb1769f60e11b81526001600160a01b0390941660048501523060248501529297889081906044820190565b0381865afa968715612f23575f97612ef2575b50612e5d612eb891611a1998614ae9565b50612ec38183613496565b15612eea5750935b5f5260018252825f20905f528152815f20905f8052525f20549061358b565b905093612ecb565b96508387813d8311612f1c575b612f098183611996565b8101031261018257955195612e5d612ea7565b503d612eff565b85513d5f823e3d90fd5b96508387813d8311612f55575b612f448183611996565b810103126101825795519583612e4b565b503d612f3a565b6040519263a9059cbb60e01b5f526001600160a01b0380931660045260245260205f60448180855af160015f5114811615612fb6575b8360405215612fa057505050565b635274afe760e01b835216600482015260249150fd5b6001811516612fcc57813b15153d151616612f92565b833d5f823e3d90fd5b9092604051936323b872dd60e01b5f526001600160a01b0393848092166004521660245260445260205f60648180855af160015f5114811615613025575b836040525f60605215612fa057505050565b6001811516612fcc57813b15153d151616613013565b9392919361304883613473565b61295b578461305c576128d193945061280a565b6001600160a01b039392919380911694855f52602060018152604092835f20961695865f528152825f20825f528152612916835f20549485613561565b909291926130a681613af9565b936130b081613473565b6130f05784816001600160e01b036130cf9360e01d9116601b0b614934565b508092816130de575050509190565b6001600160a01b0361286d9316612f5c565b604051632d1671a360e11b8152600490fd5b9161312d906060613122936001600160a01b039485916040880151611fad565b515116940151611fad565b5151161461265957565b94919361337c919360c0915f6133036040928351946131558661195e565b61315d611ea8565b86526020958487820152848682015260609781868a809401528260808201528660a082015201526132b38551916131938361195e565b600683526131a28884016121cb565b8d6131ac816126ff565b9c896001600160a01b039e8f94859182865116908d5194600486528501528c840152168c82015233608082015260a081018a526131e886611f50565b526131f285611f50565b5088516131fe816118f6565b6002815289368c83013761321186611f5d565b5261321b85611f5d565b5060ff8a61327e8b8501936132688761324181613239858a51611fad565b515116613e0a565b97511688613250848951611fad565b5151168561325f858a51611fad565b51015191612dcc565b96613274828751611fad565b5151169451611fad565b51015192169093929190604051946005865260208601526040850152606084015260808301525f60a083015260c08201604052565b6132bc82611f6d565b526132c681611f6d565b506132ea8a8d8d60ff8a61327e8d8501936132688761324181613239858a51611fad565b6132f382611f7d565b526132fd81611f7d565b50613bd8565b95878a511697848b0191825191868184511693015116928a855230875285808620915101518651916133348361197a565b8683528751956133438761195e565b86528886015286850152848885015289608085015260a084015260c08301528351808098819463d04dfe2360e01b835260048301612ab8565b03915afa968715613469575f945f98613447575b50845160028110613430575081838601519501516133b66133b088611f8d565b51611f7d565b516133c18183613496565b156134285750925b6133eb8685919060405192600284526020840152604083015260608201604052565b6133f488611f6d565b526133fe87611f6d565b5082519961340b8b61195e565b8a52890152870152850152608084015260a083015260c082015290565b9050926133c9565b602490835190630fbb8e5560e21b82526004820152fd5b90975061345f9194503d805f833e612da58183611996565b939093965f613390565b50513d5f823e3d90fd5b613492905f60e01d906001600160e01b038160e01d9116601b0b614834565b1390565b90613492916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b6148b5565b6134e46001600160e01b0392838316601b0b9260e01d938160e01d9116601b0b848461402b565b90637ffffff58213613534575b906134fb91614274565b929092158061352c575b61350e57505090565b6044925060405191638eba4d0760e01b835260048301526024820152fd5b508215613505565b61353e8282614f14565b156134f157604483856040519163d556b11160e01b835260048301526024820152fd5b611a1991610bd2916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b61447a565b611a1991610bd2916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b61463e565b61360f9160808101826135d16135cb8351611f8d565b51611f8d565b526136086136026001600160a01b038094515116936135f96135f38551611f8d565b51611f50565b51169251611f8d565b51611f6d565b519161303b565b5050565b906080810191806136276135cb8551611f7d565b526001600160a01b038092515116916136436135f38551611f7d565b51166136526136028551611f7d565b5190816136ed5761366283613473565b61295b579183917f4cb6e22a3e7e651d7cf0376cff48f20f5007a54147777865be7f5f6c38c50f4a9593612601955f52602090600182526136b8604094855f20835f528452855f20855f528452855f205461358b565b945f5260018252835f20905f528152825f20915f52525f20555b51604051918291338352604060208401526040830190612a5c565b9161371e917f4cb6e22a3e7e651d7cf0376cff48f20f5007a54147777865be7f5f6c38c50f4a9593612601956128b0565b50506136d2565b60c0810151908151915f92613899575b506137da6020918281510151926001600160a01b039081818187511696015116928660a082019485518252308452604097888320898686510151015160808601518b51916137828361197a565b8683528c51936137918561197a565b8785528d51966137a08861195e565b8752898701528c86015260016060860152608085015260a084015260c08301528851808099819463d04dfe2360e01b835260048301612ab8565b03915afa94851561388f578795613871575b5084516137fd575b50505050505050565b81905101510151169051813b1561386d57918491849383613832965180978195829463012c676d60e21b845260048401612b70565b03925af1908115613864575061384d575b80808080806137f4565b613857829161194a565b6138615780613843565b80fd5b513d84823e3d90fd5b8480fd5b6138869195503d8089833e612da58183611996565b9050935f6137ec565b86513d89823e3d90fd5b6001600160a01b03602080845101510151169060a083015190823b15610182576138dc925f928360405180968195829463012c676d60e21b845260048401612b70565b03925af1801561022c5715613735576138f691925061194a565b5f905f613735565b6080810161390f6136028251611f7d565b5191821561391c57505050565b6139366135f36001600160a01b0380935151169351611f7d565b5116815f5260209160018352604092835f20835f528152835f20855f528152835f2054936001600160e01b038516613971575b505050505050565b613995955f9284845260018152828420868552815282842091845252812055613099565b5f808080613969565b81156139a8570490565b634e487b7160e01b5f52601260045260245ffd5b6040815110613a04576020810151908051603f19810190811161288a5760051c82116139f05760016020920160051b010190565b50506040516139fe8161197a565b5f815290565b506040516139fe8161197a565b805115613a2157602001515f1a90565b505f90565b905f8091602081519101845af48080613aa4575b15613a5a5750506040513d81523d5f602083013e60203d82010160405290565b15613a8157604051639996b31560e01b81526001600160a01b039091166004820152602490fd5b3d15613a92576040513d5f823e3d90fd5b60405163d6bda27560e01b8152600490fd5b503d151580613a3a5750813b1515613a3a565b60041115613ac157565b634e487b7160e01b5f52602160045260245ffd5b602090939291936001600160a01b036040820195168152613af583613ab7565b0152565b613b01615002565b6040805163b7bad1b160e01b81526001600160a01b0383166004820152909182826024815f73200e12d10bb0c5e4a17e7018f0f1161919bb93895af1928315613bcf575f925f94613b9a575b50613b5783613ab7565b600183141580613b88575b613b6c5750505090565b5163ee07877f60e01b81529182916106df919060048401613ad5565b50613b9283613ab7565b821515613b62565b90809450613bbe9293503d8511613bc8575b613bb68183611996565b81019061490a565b919091925f613b4d565b503d613bac565b513d5f823e3d90fd5b90805191613be583611a7a565b91613c00604094613bf886519586611996565b808552611a7a565b601f199460209186013686840137835183519095908015613dff576001613c569101965b6001978891010197613c4d613c388a611a7a565b99613c4586519b8c611996565b808b52611a7a565b018489016121e7565b85805f9684516002815233878201523086820152606081018652613c798b611f50565b52613c838a611f50565b505f925b613dbb575b5050508351613c9f575b50505050505090565b85809598979692980181613cb38289611fad565b52613cbe8188611fad565b505f925b613cd1575b5085969750613c96565b8451831015613db6576001600160a01b03613d4881613cf08689611fad565b51511686613cfe878a611fad565b51015187815160051b9101207f19457468657265756d205369676e6564204d6573736167653a0a3332000000005f52601c52603c5f208c613d3f888b611fad565b51015191614a60565b15613d9e57868098999a928192613d5f878a611fad565b515116613d6c8787611fad565b52019385613d7a8289611fad565b510151613d87868c611fad565b52613d92858b611fad565b50019290989796613cc2565b8951630a57f30960e31b815260048101859052602490fd5b613cc7565b9091968151881015613df6578280910197613dd68184611fad565b51613de18a8d611fad565b52613dec898c611fad565b5001919081613c87565b96829150613c8c565b50613c565f96613c24565b613e12615002565b60408051630782d7e160e01b81526001600160a01b03831660048201529091828260248173200e12d10bb0c5e4a17e7018f0f1161919bb93895afa928315613bcf575f925f94613b9a5750613b5783613ab7565b9091939284158215175f14613e805750505090505f905f90565b82810192600160fd1b8082019083011760fe1c613fb7575b5050613ea381614bd9565b93613ead81614bd9565b94613eb88682614bf9565b90918215613fa8575f9083986f0785ee10d5da46d900f436a000000000808611613f9a575b50670de0b6b3a7640000808b11613f8b575b50633b9aca00808b11613f7c575b50612710808b11613f6e575b5098805b613f5d5750819061189e989982600a0a9109960195817fcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccd0a93838211900382610100031b9203901c170291614c0c565b60019290920191600a900480613f0d565b60049a04998a930192613f09565b600991939a049901915f613efd565b601291939a049901915f613eef565b85049950602592505f613edd565b5092905061189e949550614c0c565b5f82121561400b57808413613ffd575b7f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb2841315613e985790925061189e939491614b17565b90925061189e939491614b7e565b80841215613fc75790925061189e939491614b17565b6134fb8282614274565b92909180614051576044848460405191637a97930f60e01b835260048301526024820152fd5b90919280155f1461406657505050505f905f90565b61407f9361407391614cc6565b92919490938492614cc6565b909391928461408d88614bd9565b9161409786614bd9565b947f161bcca7119915b50764b4abe86529797775a5f171951000000000000000000094604c9186881061423e575b030191600160ff1b98838a018112155f1461420b575050035b5f955f821280614202575b6141e4575b5f8112806141d2575b6141b45786820103966001600160ff1b03881490816141aa575b50806141a1575b80614198575b61417a57509061412e9291614e72565b915f8113614141575b5061189e93614c0c565b9091604c821361416f5761415891600a0a9061399e565b908115614165575f614137565b505050505f905f90565b50505050505f905f90565b876044916040519163d556b11160e01b835260048301526024820152fd5b505f851261411e565b50828414614118565b905088145f614111565b604489836040519163d556b11160e01b835260048301526024820152fd5b50806001600160ff1b030182136140f7565b95508087018613156141fc5786818703015b956140ee565b5f6141f6565b505f81136140e9565b89985090920390506001600160ff1b038190038701821361422f57018601946140de565b5050505050505050505f905f90565b7f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee80000000000000000009650604b92506140c5565b81156139a8570590565b8082601b82810b8314614469577d90e40fbeea1d3a4abc8955e946fe31cdcf66f634e10000000000000000008405614415575b8380820b0361440457507b199999999999999999999999999999999999999999999999999999987b0ccccccccccccccccccccccccccccccccccccccccccccccccccccccc840111156143b5575b838060030b03614339575b80841361431d5750506001600160e01b036001925b60e01b91161791565b8303600a0a80156139a8576001600160e01b0391071592614314565b92915f84131561438957509061434f8383614f14565b61436b57637ffffffe1901600a0a810290637fffffff926142ff565b506044916040519163d556b11160e01b835260048301526024820152fd5b637fffffff19928303906043821361416f576143a891600a0a9061426a565b91821561416557926142ff565b5f198401808060030b146143c957506142f4565b90506001600160e01b039293507b7fffffffffffffffffffffffffffffffffffffffffffffffffffffff915060e01b9260ff1d181617905f90565b600190940193600a909305926142a7565b937f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee8000000000000000000840515614456576305f5e100600894058094819201955b9150506142a7565b620186a06005940580948192019561444e565b50826142f457505050505f90600190565b919291600160ff1b84016144925761189e9350614f2d565b9061189e935f039161463e565b919291600160ff1b919080158061462c5750906144bb91614cc6565b9490929091905f868585858282138015614623575b614606575b505050508682841860ff1c94860391039081604c0381116145eb5701600a0a8082059190846145d1575b505081019182821860ff1c11156145c957826001600160ff1b03146145ab57905f600192135f1461457c57600a9004915b01925b8115811761454057509190565b80614559575b508015614551579190565b505f91508190565b919261456f9203600160ff1b01600a0a9061426a565b600160ff1b91905f614546565b600a60037fe6666666666666666666666666666666666666666666666666666666666666679201040191614530565b604490836040519163d556b11160e01b835260048301526024820152fd5b509092614533565b81076145de575b806144ff565b60ff1d600117015f6145d8565b5050509193506145f9579190565b60018160ff1d1790039190565b5f9a50909750909550600160ff1b945092509050868080806144d5565b50835f126144d0565b156146375750509190565b9350919050565b939291938415811581811761478f5750509061465991614cc6565b919490829561466a82958294614cc6565b8096929491969387868482138015614786575b61476d575b5050505050508682841860ff1c94860391039081604c0381116145eb5701600a0a808205919084614753575b505081019182821860ff1c111561474b57826001600160ff1b03146145ab57905f600192135f1461471c57600a9004915b01925b811581176146ef57509190565b806146ff57508015614551579190565b600160ff1b936147169291038401600a0a9061426a565b5f614546565b600a60037fe66666666666666666666666666666666666666666666666666666666666666792010401916146df565b5090926146e2565b8107614760575b806146ae565b60ff1d600117015f61475a565b929b5098509196509450925090505f8080808080614682565b5085841261467d565b93959390929190156147a5575050614551579190565b945092915050565b6008815110613a21576008015167ffffffffffffffff1667ff0a89c674ee78741490565b916040830192604061480b610bd2606087519401938451906001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b613e66565b9451930161481a8151866127e3565b614822575050565b909350611a19919250519251836134bd565b92915f9060018184145f871287151717176148ae575f928082136148a0575b03604c81135f82121761489457600a0a9084614872838202938461426a565b1461488757505015614883575f9190565b5f90565b9093509015611a19579190565b505015614883575f9190565b5f9560019450925090614853565b5050505f90565b93929190918083145f83125f87121883158715171717614904575f928082136148f75703604c81135f82121761489457600a0a9084614872838202938461426a565b9194600193509190614853565b50919050565b919082604091031261018257815160048110156101825760209092015160ff811681036101825790565b91925f83121561495c576044838360405191634a7d166b60e01b835260048301526024820152fd5b91928361496e57505090505f90600190565b60ff8116820191808312614a36575f8312156149a6575050604c198112614551575f03600a0a9161499f838261399e565b9283021490565b909293915f81135f14614a2c57604d8113614a0157600a0a9283156139a857835f190483116149d85750500290600190565b60405163c849483b60e01b815260048101849052602481019290925260ff166044820152606490fd5b5060405163c849483b60e01b81526004810192909252602482015260ff919091166044820152606490fd5b5050905090600190565b60405163c849483b60e01b815260048101869052602481019190915260ff82166044820152606490fd5b9091813b614a9b57614a72919261506b565b50614a7c81613ab7565b159182614a8857505090565b6001600160a01b03918216911614919050565b6020918160645f935160405192630b135d3f60e11b9788855260048501526040602485015286820190604485015e8281018201859052601f01601f191601915afa905f5114601f3d11161690565b9060ff165f03916001600160ff1b0382115f14614b0f57600a6001818404940192061590565b909190600190565b909392915f614b27918184613e66565b9490945f8483019182019412159081614b74575b8115614b6a575b50614b4c57505090565b604492506040519163d556b11160e01b835260048301526024820152fd5b905083125f614b42565b8281129150614b3b565b614b9393600160fe1b90810193920190613e66565b9081815f821215614bca575050604b1982126128d157614bb8915f03600a0a9061426a565b9081614bc2575f90565b600160ff1b90565b93600160ff1b90910192509050565b5f811215611a1957600160ff1b90808203614bf2575090565b90505f0390565b905f198183099102908180821091030391565b92939291905f8184181215614ca1576001600160ff1b039283831115614c8b57600160ff1b93838503614c4157505050509190565b90919293508514614c5b575050600a600191045f03920190565b604051630ed8062160e21b8152600481019190915260248101919091526044810182905260648101849052608490fd5b5090915050600160ff1b811461288a575f039190565b90916001600160ff1b0380841115612852578514614c5b575050600a60019104920190565b9190918015614e6857827f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee800000000000000000080830515614d76575b507f19999999999999999999999999999999999999999999999999999999999999997f0ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc830110614d67575b8313614d515791905f90565b919060018060ff1b926001600160ff1b03030190565b9290600a02905f190192614d45565b6f4b3b4ca85a86c47a098a22400000000080840515614e56575b507728c87cb5c89a2571ebfdcb54864ada834a00000000000000830515614e3f575b7b097edd871cfda3a5697758bf0e3cbb5ac5741c640000000000000000830515614e2b575b7e3899162693736ac531a5a58f1fbb4b746504382ca7e4000000000000000000830515614e1b57820515614e0c575b5f614cfa565b9290600a02905f190192614e06565b9391606402916001190193614dd7565b93916402540be40002916009190193614dd7565b9391678ac7230489e8000002916012190193614db2565b6025198301955092909202915f614d90565b505f915081908190565b90915f198383099280830292838086109503948086039584871015614ef05714614ee8579082910960018219018216809204600280826003021880830282030280830282030280830282030280830282030280830282030280920290030293600183805f03040190848311900302920304170290565b505091500490565b60648386866040519263362ced0960e11b8452600484015260248301526044820152fd5b611a1991905f811215614f28575f036150a5565b6150a5565b909291600160ff1b91828101614fbf5750808414614fb557808413918215614fad578185035b604c811115614f9c5750505f915b15614f8d57507f8000000000000000000000000000000000000000000000000000000000000001019190565b92506001600160ff1b03039190565b600a0a9081156139a8570491614f61565b848203614f53565b505090505f905f90565b93614fcc92945f0361449f565b80939180928114614fe0575b50505f039190565b915092506001600160ff1b0383146145ab57600a600191059201915f80614fd8565b73200e12d10bb0c5e4a17e7018f0f1161919bb9389803b158015615040575b6150285750565b602490604051906373e6d7b360e01b82526004820152fd5b507f1de7d717526cba131d684e312dedbf0852adef9cced9e36798ae4937f7145d41813f1415615021565b815191906041830361509b576150949250602082015190606060408401519301515f1a90615134565b9192909190565b50505f9160029190565b90637ffffff581131561512e57637ffffffe1981019060438213615127575f8212156150fb57637fffffff91505f0301600a0a7b8000000000000000000000000000000000000000000000000000000202111590565b50600a0a80156139a8577b80000000000000000000000000000000000000000000000000000001041090565b5050151590565b50505f90565b91907f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a084116151ab579160209360809260ff5f9560405194855216868401526040830152606082015282805260015afa1561022c575f516001600160a01b038116156151a157905f905f90565b505f906001905f90565b5050505f91600391905600000000000000000000000000000000000000000000200e12d10bb0c5e4a17e7018f0f1161919bb93890000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000044b608060405234801561000f575f80fd5b506004361061004a575f3560e01c80630782d7e11461004e57806354636d2b14610078578063b7bad1b11461009d578063f5c36eaf146100b0575b5f80fd5b61006161005c366004610363565b6100c3565b60405161006f929190610403565b60405180910390f35b61008b610086366004610363565b6100d8565b60405160ff909116815260200161006f565b6100616100ab366004610363565b6100e9565b61008b6100be366004610363565b6100f5565b5f806100cf5f84610100565b91509150915091565b5f6100e35f836101f0565b92915050565b5f806100cf5f84610281565b5f6100e35f83610356565b73ffffffffffffffffffffffffffffffffffffffff81165f9081526020838152604080832081518083019092525460ff8082161515835261010090910416818301527f313ce56700000000000000000000000000000000000000000000000000000000808452839283908190816004818a5afa915060203d1015610182575f91505b811561019857505f5160ff811115610198575f91505b816101af57505050602001516003925090506101e9565b83516101c3575f955093506101e992505050565b836020015160ff1681146101d85760026101db565b60015b846020015195509550505050505b9250929050565b5f805f6101fd8585610281565b909250905060018260038111156102165761021661039d565b1415801561023557505f8260038111156102325761023261039d565b14155b156102795783826040517fee07877f000000000000000000000000000000000000000000000000000000008152600401610270929190610421565b60405180910390fd5b949350505050565b5f805f8061028f8686610100565b90925090505f8260038111156102a7576102a761039d565b0361034b576040805180820182526001815260ff838116602080840191825273ffffffffffffffffffffffffffffffffffffffff8a165f908152908b9052939093209151825493517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00009094169015157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff161761010093909116929092029190911790555b909590945092505050565b5f805f6101fd8585610100565b5f60208284031215610373575f80fd5b813573ffffffffffffffffffffffffffffffffffffffff81168114610396575f80fd5b9392505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b600481106103ff577f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b9052565b6040810161041182856103ca565b60ff831660208301529392505050565b73ffffffffffffffffffffffffffffffffffffffff831681526040810161039660208301846103ca56000000000000000000000000000000000000000000"; diff --git a/src/generated/candidate/GenericPoolRaindexV6FlashBorrower.sol b/src/generated/candidate/GenericPoolRaindexV6FlashBorrower.sol index 6af43abc13..1694d0cbb3 100644 --- a/src/generated/candidate/GenericPoolRaindexV6FlashBorrower.sol +++ b/src/generated/candidate/GenericPoolRaindexV6FlashBorrower.sol @@ -5,23 +5,23 @@ pragma solidity ^0.8.25; // THIS FILE IS AUTOGENERATED BY THE BUILD SCRIPT. DO NOT EDIT BY HAND. /// @dev Hash of the known bytecode. -bytes32 constant BYTECODE_HASH = bytes32(0xf12469821ccf60f2696423f0706d78fb63370acc5a95f2b3c4e0c6e132dde140); +bytes32 constant BYTECODE_HASH = bytes32(0xd76835fd7fb2aee600b9715ef5961efa4ce2ff76c3dc8d0c044d41326d2f121a); /// @dev The deterministic deploy address of the contract when deployed via /// the Zoltu factory. -address constant DEPLOYED_ADDRESS = address(0x8df515A2c3166A50E4a4ce6911069e21ce394B32); +address constant DEPLOYED_ADDRESS = address(0x7DB57d4eEFd98aF975FB061486D3F97b0E82cA89); /// @dev The creation bytecode of the contract. bytes constant CREATION_CODE = - hex"6080604052348015600e575f80fd5b5060017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055612e5b806100405f395ff3fe608060405260043610610034575f3560e01c806301ffc9a71461003d57806323e30c8b146100715780638c18e4ba1461009e57005b3661003b57005b005b348015610048575f80fd5b5061005c610057366004611a69565b6100b1565b60405190151581526020015b60405180910390f35b34801561007c575f80fd5b5061009061008b366004611af2565b6100e7565b604051908152602001610068565b61003b6100ac366004611b69565b610204565b5f6001600160e01b031982166323e30c8b60e01b14806100e157506301ffc9a760e01b6001600160e01b03198316145b92915050565b5f3373522a6b8d2cd1e44d53475516fd3c55bc29a0e8651461012257604051625e1e6f60e51b81523360048201526024015b60405180910390fd5b6001600160a01b0387163014610156576040516322c7df1960e21b81526001600160a01b0388166004820152602401610119565b5f806101648486018661216d565b91509150610172828261057c565b6040516334e3942b60e11b815233906369c7285690610195908590600401612386565b60408051808303815f875af11580156101b0573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906101d49190612504565b507f439148f0bbc682ca079e46d6e2c2f0c1e3b820f1a291b069d8882abf8cf18dd99a9950505050505050505050565b61020c6105f0565b61021b61021882612526565b50565b610228608085018561258f565b90505f0361024957604051639c95219f60e01b815260040160405180910390fd5b6001600160a01b03851673522a6b8d2cd1e44d53475516fd3c55bc29a0e865146102915760405163516e822d60e01b81526001600160a01b0386166004820152602401610119565b6102a160808501606086016125d5565b6102be57604051636d3a9fe560e01b815260040160405180910390fd5b5f8484846040516020016102d49392919061282e565b60408051601f1981840301815291905290505f6102f4608087018761258f565b5f81811061030457610304612a40565b90506020028101906103169190612a54565b6103209080612a72565b61032e906060810190612a86565b61033b608089018961258f565b5f81811061034b5761034b612a40565b905060200281019061035d9190612a54565b6040013581811061037057610370612a40565b6103869260206040909202019081019150612acc565b90505f610396608088018861258f565b5f8181106103a6576103a6612a40565b90506020028101906103b89190612a54565b6103c29080612a72565b6103d0906040810190612a86565b6103dd60808a018a61258f565b5f8181106103ed576103ed612a40565b90506020028101906103ff9190612a54565b6020013581811061041257610412612a40565b6104289260206040909202019081019150612acc565b90505f6104348261061e565b90505f6104408461061e565b90505f61044e8a35836106a2565b90506104656001600160a01b0385168c5f196106c9565b61047a6001600160a01b0386168c5f196106c9565b604051632e7ff4ef60e11b81526001600160a01b038c1690635cffe9de906104ac903090899086908c90600401612ae7565b6020604051808303815f875af11580156104c8573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104ec9190612b18565b610509576040516349088f5960e11b815260040160405180910390fd5b61051d6001600160a01b0386168c5f6106c9565b6105316001600160a01b0385168c5f6106c9565b61054661053d88612526565b85858886610743565b50505050505061057560017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b5050505050565b5f82608001515f8151811061059357610593612a40565b60200260200101515f01516060015183608001515f815181106105b8576105b8612a40565b602002602001015160400151815181106105d4576105d4612a40565b60200260200101515f015190506105eb8183610994565b505050565b6105f8610a3e565b60027f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b5f610627610a82565b6040516354636d2b60e01b81526001600160a01b038316600482015273200e12d10bb0c5e4a17e7018f0f1161919bb9389906354636d2b906024016020604051808303815f875af115801561067e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906100e19190612b33565b5f6001600160e01b038316601b0b60e084901d6106c0828286610b0d565b95945050505050565b6106d58383835f610b51565b6105eb576106e683835f6001610b51565b61070e57604051635274afe760e01b81526001600160a01b0384166004820152602401610119565b61071b8383836001610b51565b6105eb57604051635274afe760e01b81526001600160a01b0384166004820152602401610119565b604080516003808252608082019092525f9160208201606080368337019050506040516370a0823160e01b81523060048201529091505f906001600160a01b038716906370a0823190602401602060405180830381865afa1580156107aa573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107ce9190612b53565b905080156107ea576107ea6001600160a01b0387163383610bb3565b5f6107f58287610bc0565b50905080835f8151811061080b5761080b612a40565b602090810291909101015250506040516370a0823160e01b81523060048201525f906001600160a01b038516906370a0823190602401602060405180830381865afa15801561085c573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108809190612b53565b9050801561089c5761089c6001600160a01b0385163383610bb3565b5f6108a78285610bc0565b50905080836001815181106108be576108be612a40565b60209081029190910101525047905080156108dd576108dd3382610c01565b5f6108e9826012610bc0565b509050808360028151811061090057610900612a40565b602090810291909101015250506040805160018082528183019092525f91816020015b6040805160a0810182525f918101828152606080830193909352608082018390528152602081019190915281526020019060019003908161092357905050905086815f8151811061097657610976612a40565b602002602001018190525061098b8282610c78565b50505050505050565b5f805f838060200190518101906109ab9190612b6a565b919450925090506001600160a01b0383166109d9576040516398521dc560e01b815260040160405180910390fd5b6001600160a01b038216610a005760405163456ac4c360e11b815260040160405180910390fd5b610a156001600160a01b038616845f196106c9565b610a296001600160a01b0383168247610c8d565b506105756001600160a01b038616845f6106c9565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0054600203610a8057604051633ee5aeb560e01b815260040160405180910390fd5b565b73200e12d10bb0c5e4a17e7018f0f1161919bb93893b1580610ad9575073200e12d10bb0c5e4a17e7018f0f1161919bb93893f7f1de7d717526cba131d684e312dedbf0852adef9cced9e36798ae4937f7145d4114155b15610a80576040516373e6d7b360e01b815273200e12d10bb0c5e4a17e7018f0f1161919bb93896004820152602401610119565b5f805f610b1b868686610d3b565b9150915080610b465760405162bc8ecf60e31b81526004810187905260248101869052604401610119565b5090505b9392505050565b60405163095ea7b360e01b5f8181526001600160a01b038616600452602485905291602083604481808b5af1925060015f51148316610ba7578383151615610b9b573d5f823e3d81fd5b5f873b113d1516831692505b60405250949350505050565b61071b8383836001610ead565b5f805f805f610bcf8787610ef7565b9250925092505f80610be18585610f53565b9150915081838015610bf05750815b9650965050505050505b9250929050565b80471015610c2b5760405163cf47918160e01b815247600482015260248101829052604401610119565b610c44828260405180602001604052805f81525061119c565b15610c4d575050565b3d15610c5f57610c5b6111b1565b5050565b60405163d6bda27560e01b815260040160405180910390fd5b610c5b610c866007846111bc565b825f61121e565b606081471015610cb95760405163cf47918160e01b815247600482015260248101839052604401610119565b5f610cc585848661119c565b9050808015610ce657505f3d1180610ce657505f856001600160a01b03163b115b15610cfb57610cf36114d2565b915050610b4a565b8015610d2557604051639996b31560e01b81526001600160a01b0386166004820152602401610119565b3d15610c5f57610d336111b1565b509392505050565b5f805f851215610d6857604051634a7d166b60e01b81526004810186905260248101859052604401610119565b845f03610d7a57505f90506001610ea5565b8460ff8416850185811215610db55760405163c849483b60e01b8152600481018890526024810187905260ff86166044820152606401610119565b5f805f831215610e0157604c19831215610dd8575f809550955050505050610ea5565b825f03600a0a9150818481610def57610def612c05565b0495505084029091149150610ea59050565b5f831315610e9a57604d831315610e3e5760405163c849483b60e01b8152600481018a90526024810189905260ff88166044820152606401610119565b82600a0a9150815f1981610e5457610e54612c05565b04841115610e885760405163c849483b60e01b8152600481018a90526024810189905260ff88166044820152606401610119565b5091909102925060019150610ea59050565b509193506001925050505b935093915050565b60405163a9059cbb60e01b5f8181526001600160a01b038616600452602485905291602083604481808b5af1925060015f51148316610ba7578383151615610b9b573d5f823e3d81fd5b5f808060ff841681037f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff861115610f4257600a860460018201600a88065f1493509350935050610f4c565b8593509150600190505b9250925092565b5f808383601b82900b821480611089577d90e40fbeea1d3a4abc8955e946fe31cdcf66f634e1000000000000000000870515610fd4577f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee8000000000000000000870515610fc5576305f5e10087059650600886019550610fd4565b620186a0870596506005860195505b8687601b0b14610fef57600a87059650856001019550610fd4565b7b0ccccccccccccccccccccccccccccccccccccccccccccccccccccccc7b1999999999999999999999999999999999999999999999999999999888820111611083575f600188039050808160030b036110815760e01b6001600160e01b037b7fffffffffffffffffffffffffffffffffffffffffffffffffffffff60ff8b901d18161795505f9450610bfa9350505050565b505b506110a0565b865f036110a057505f935060019250610bfa915050565b858660030b14611157575f8213156110ff576110bc83836114eb565b156110e45760405163d556b11160e01b81526004810184905260248101839052604401610119565b637ffffffe19909501600a0a82029550637fffffff94611157565b637fffffff19869003604381131561112157505f9450849350610bfa92505050565b80600a0a888161113357611133612c05565b059750875f0361114d57505f9450849350610bfa92505050565b50637fffffff1995505b8186136111675760019350611180565b818603600a0a838161117b5761117b612c05565b071593505b5050506001600160e01b03841660e084901b1791509250929050565b5f805f83516020850186885af1949350505050565b6040513d5f823e3d81fd5b60408051600780825261010082019092526060915f9190816020015b60608152602001906001900390816111d857905050905082816111fc600187612c19565b8151811061120c5761120c612a40565b60209081029190910101529392505050565b60408051600780825261010082019092525f91816020015b60608152602001906001900390816112365790505090505f5b84518110156112975784818151811061126a5761126a612a40565b602002602001015182828151811061128457611284612a40565b602090810291909101015260010161124f565b50335f8181523060209081526040808320815160a0810183528083018581526060808301879052608083018190529082528185015282518581529384018581528484019093529093909291905b88518110156114c6578881815181106112ff576112ff612a40565b602002602001015193505f845f0151604001515111156114be575f611328888660200151611506565b90508861139b5761137d815f8151811061134457611344612a40565b60200260200101515f8151811061135d5761135d612a40565b602002602001015160408051600181526020810192909252818101905290565b815f8151811061138f5761138f612a40565b60200260200101819052505b8451516040805160e08101825287516020908101516001600160a01b0390811683529082018a90528851830151828401525f606083018190526080830186905260a0830189905260c08301889052925163d04dfe2360e01b81529293169163d04dfe239161140b91600401612c83565b5f60405180830381865afa158015611425573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261144c9190810190612d7b565b9150505f815111156114bb5785516020015160405163012c676d60e21b81526001600160a01b03909116906304b19db49061148d908b908590600401612e27565b5f604051808303815f87803b1580156114a4575f80fd5b505af11580156114b6573d5f803e3d5ffd5b505050505b50505b6001016112e4565b50505050505050505050565b6040513d81523d5f602083013e3d602001810160405290565b5f610b4a5f84126114fc5783611500565b835f035b836117e8565b60605f825167ffffffffffffffff81111561152357611523611c10565b60405190808252806020026020018201604052801561154c578160200160208202803683370190505b5090505f8084511161155e575f611564565b83516001015b85516001010190505f8167ffffffffffffffff81111561158657611586611c10565b6040519080825280602002602001820160405280156115b957816020015b60608152602001906001900390816115a45790505b5090505f6115dd604080516002815233602082015230818301526060810190915290565b8282815181106115ef576115ef612a40565b60200260200101819052505f5b875181101561164c57818060010192505087818151811061161f5761161f612a40565b602002602001015183838151811061163957611639612a40565b60209081029190910101526001016115fc565b508551156117de5780806001019150508382828151811061166f5761166f612a40565b60200260200101819052505f5b86518110156117dc5761172b87828151811061169a5761169a612a40565b60200260200101515f01516117086116d68a85815181106116bd576116bd612a40565b6020026020010151602001518051602090810291012090565b7f19457468657265756d205369676e6564204d6573736167653a0a3332000000005f908152601c91909152603c902090565b89848151811061171a5761171a612a40565b602002602001015160400151611886565b61174b57604051630a57f30960e31b815260048101829052602401610119565b86818151811061175d5761175d612a40565b60200260200101515f01516001600160a01b03165f1b85828151811061178557611785612a40565b60200260200101818152505081806001019250508681815181106117ab576117ab612a40565b6020026020010151602001518383815181106117c9576117c9612a40565b602090810291909101015260010161167c565b505b5095945050505050565b5f637ffffff582136117fb57505f6100e1565b637ffffffe19820160438113156118165750508115156100e1565b5f81126118565780600a0a7b800000000000000000000000000000000000000000000000000000018161184b5761184b612c05565b0484119150506100e1565b805f03600a0a7b800000000000000000000000000000000000000000000000000000020284101591505092915050565b5f836001600160a01b03163b5f036118e4575f806118a485856118f6565b5090925090505f8160038111156118bd576118bd612e47565b1480156118db5750856001600160a01b0316826001600160a01b0316145b92505050610b4a565b6118ef84848461193c565b9050610b4a565b5f805f835160410361192d576020840151604085015160608601515f1a61191f888285856119a1565b955095509550505050610f4c565b505081515f9150600290610f4c565b805160408051630b135d3f60e11b8082526004820186905260248201929092525f92906020820185604483015e5f82606483010152601f820160051c60051b915060205f60648401838a5afa9050825f5114601f3d1116811693505050509392505050565b5f80807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08411156119da57505f91506003905082611a5f565b604080515f808252602082018084528a905260ff891692820192909252606081018790526080810186905260019060a0016020604051602081039080840390855afa158015611a2b573d5f803e3d5ffd5b5050604051601f1901519150506001600160a01b038116611a5657505f925060019150829050611a5f565b92505f91508190505b9450945094915050565b5f60208284031215611a79575f80fd5b81356001600160e01b031981168114610b4a575f80fd5b6001600160a01b0381168114610218575f80fd5b8035611aaf81611a90565b919050565b5f8083601f840112611ac4575f80fd5b50813567ffffffffffffffff811115611adb575f80fd5b602083019150836020828501011115610bfa575f80fd5b5f805f805f8060a08789031215611b07575f80fd5b8635611b1281611a90565b95506020870135611b2281611a90565b94506040870135935060608701359250608087013567ffffffffffffffff811115611b4b575f80fd5b611b5789828a01611ab4565b979a9699509497509295939492505050565b5f805f805f60808688031215611b7d575f80fd5b8535611b8881611a90565b9450602086013567ffffffffffffffff80821115611ba4575f80fd5b9087019060c0828a031215611bb7575f80fd5b90945060408701359080821115611bcc575f80fd5b611bd889838a01611ab4565b90955093506060880135915080821115611bf0575f80fd5b50860160408189031215611c02575f80fd5b809150509295509295909350565b634e487b7160e01b5f52604160045260245ffd5b6040516060810167ffffffffffffffff81118282101715611c4757611c47611c10565b60405290565b6040805190810167ffffffffffffffff81118282101715611c4757611c47611c10565b6040516080810167ffffffffffffffff81118282101715611c4757611c47611c10565b60405160a0810167ffffffffffffffff81118282101715611c4757611c47611c10565b60405160c0810167ffffffffffffffff81118282101715611c4757611c47611c10565b604051601f8201601f1916810167ffffffffffffffff81118282101715611d0257611d02611c10565b604052919050565b8015158114610218575f80fd5b8035611aaf81611d0a565b5f67ffffffffffffffff821115611d3b57611d3b611c10565b5060051b60200190565b5f67ffffffffffffffff821115611d5e57611d5e611c10565b50601f01601f191660200190565b5f82601f830112611d7b575f80fd5b8135611d8e611d8982611d45565b611cd9565b818152846020838601011115611da2575f80fd5b816020850160208301375f918101602001919091529392505050565b5f60608284031215611dce575f80fd5b611dd6611c24565b90508135611de381611a90565b81526020820135611df381611a90565b6020820152604082013567ffffffffffffffff811115611e11575f80fd5b611e1d84828501611d6c565b60408301525092915050565b5f82601f830112611e38575f80fd5b81356020611e48611d8983611d22565b82815260069290921b84018101918181019086841115611e66575f80fd5b8286015b84811015611eac5760408189031215611e81575f80fd5b611e89611c4d565b8135611e9481611a90565b81528185013585820152835291830191604001611e6a565b509695505050505050565b5f82601f830112611ec6575f80fd5b81356020611ed6611d8983611d22565b82815260059290921b84018101918181019086841115611ef4575f80fd5b8286015b84811015611eac57803567ffffffffffffffff80821115611f17575f80fd5b908801906060828b03601f19011215611f2e575f80fd5b611f36611c24565b86830135611f4381611a90565b815260408381013583811115611f57575f80fd5b8401603f81018d13611f67575f80fd5b88810135611f77611d8982611d22565b81815260059190911b82018301908a8101908f831115611f95575f80fd5b928401925b82841015611fb35783358252928b0192908b0190611f9a565b858c0152505050606084013583811115611fcb575f80fd5b611fd98d8a83880101611d6c565b918301919091525085525050918301918301611ef8565b5f82601f830112611fff575f80fd5b8135602061200f611d8983611d22565b82815260059290921b8401810191818101908684111561202d575f80fd5b8286015b84811015611eac57803567ffffffffffffffff80821115612050575f80fd5b90880190601f196080838c0382011215612068575f80fd5b612070611c70565b8784013583811115612080575f80fd5b840160a0818e0384011215612093575f80fd5b61209b611c93565b92506120a8898201611aa4565b83526040810135848111156120bb575f80fd5b6120c98e8b83850101611dbe565b8a85015250606080820135858111156120e0575f80fd5b6120ee8f8c83860101611e29565b604086015250608082013585811115612105575f80fd5b6121138f8c83860101611e29565b828601525060a0820135608085015283835260408601358a840152808601356040840152608086013593508484111561214a575f80fd5b6121588e8b86890101611eb7565b90830152508652505050918301918301612031565b5f806040838503121561217e575f80fd5b823567ffffffffffffffff80821115612195575f80fd5b9084019060c082870312156121a8575f80fd5b6121b0611cb6565b8235815260208301356020820152604083013560408201526121d460608401611d17565b60608201526080830135828111156121ea575f80fd5b6121f688828601611ff0565b60808301525060a08301358281111561220d575f80fd5b61221988828601611d6c565b60a08301525093506020850135915080821115612234575f80fd5b5061224185828601611d6c565b9150509250929050565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b5f815180845260208085019450602084015f5b838110156122bc57815180516001600160a01b03168852830151838801526040909601959082019060010161228c565b509495945050505050565b5f815180845260208085019450602084015f5b838110156122bc578151875295820195908201906001016122da565b5f82825180855260208086019550808260051b8401018186015f5b8481101561237957601f19868403018952815160606001600160a01b038251168552858201518187870152612348828701826122c7565b91505060408083015192508582038187015250612365818361224b565b9a86019a9450505090830190600101612311565b5090979650505050505050565b5f602080835260e08301845182850152818501516040818187015280870151915060608281880152808801519250608083151560808901526080890151935060a060c060a08a01528585518088526101009750878b019150878160051b8c010189880197505f5b828110156124d5578c820360ff190184528851805187845280516001600160a01b03908116898601528d82015188860189905280518216610120870152808f01519091166101408601528a015161016085018a905261245061018086018261224b565b90508a820151607f19808784030160c088015261246d8383612279565b92508b8401519150808784030160e08801525061248a8282612279565b915050888201518d8601528d8301518e8601528a8301518b8601528983015192508481038a8601526124bc81846122f6565b9b8e019b968e01969450505060019190910190506123ed565b5060a08d01518c8203601f190160c08e015299506124f3818b61224b565b9d9c50505050505050505050505050565b5f8060408385031215612515575f80fd5b505080516020909101519092909150565b5f60408236031215612536575f80fd5b61253e611c4d565b823567ffffffffffffffff80821115612555575f80fd5b61256136838701611dbe565b83526020850135915080821115612576575f80fd5b5061258336828601611eb7565b60208301525092915050565b5f808335601e198436030181126125a4575f80fd5b83018035915067ffffffffffffffff8211156125be575f80fd5b6020019150600581901b3603821315610bfa575f80fd5b5f602082840312156125e5575f80fd5b8135610b4a81611d0a565b5f808335601e19843603018112612605575f80fd5b830160208101925035905067ffffffffffffffff811115612624575f80fd5b8060051b3603821315610bfa575f80fd5b5f8235605e19833603018112612649575f80fd5b90910192915050565b5f808335601e19843603018112612667575f80fd5b830160208101925035905067ffffffffffffffff811115612686575f80fd5b803603821315610bfa575f80fd5b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b5f808335601e198436030181126126d1575f80fd5b830160208101925035905067ffffffffffffffff8111156126f0575f80fd5b8060061b3603821315610bfa575f80fd5b8183525f60208085019450825f5b858110156122bc57813561272281611a90565b6001600160a01b0316875281830135838801526040968701969091019060010161270f565b8183526020808401935f91600585811b8301820185855b8881101561282057858303601f19018a526127798289612635565b6060813561278681611a90565b6001600160a01b0316855261279d828801836125f0565b82898801528083880152608092507f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8111156127d7575f80fd5b871b8082888501378601905060406127f184820185612652565b94508388840301828901526128098484018683612694565b9e8a019e975050509387019350505060010161275e565b509098975050505050505050565b5f604080835261010080840187358386015260206060818a013581880152848a01356080880152808a013561286281611d0a565b151560a088015261287660808b018b6125f0565b60c0898101529384905261012093848901600582901b8a018601835f5b848110156129f0578c830361011f19018452813536879003607e190181126128b9575f80fd5b8601803536829003609e190181126128cf575f80fd5b60808552810180356128e081611a90565b6001600160a01b0380821660808801526128fc8c840184612635565b915060a080880152813561290f81611a90565b8116878e0152818c013561292281611a90565b16610140870152612935818f0182612652565b91508a61016088015261294d61018088018383612694565b91505061295c8e8301836126bc565b607f19808985030160c08a0152612974848385612701565b93506129828d8601866126bc565b93509150808985030160e08a01525061299c838383612701565b9250505060808201358d8701528a8301358b8701528d8301358e8701526129c58a8401846125f0565b935091508581038a8701526129db818484612747565b968b0196955050509188019150600101612893565b50506129ff60a08f018f612652565b8c8303603f190160e08e015299509750612a1a818a8a612694565b9850505050505085840381870152505050612a36818587612694565b9695505050505050565b634e487b7160e01b5f52603260045260245ffd5b5f8235607e19833603018112612a68575f80fd5b9190910192915050565b5f8235609e19833603018112612a68575f80fd5b5f808335601e19843603018112612a9b575f80fd5b83018035915067ffffffffffffffff821115612ab5575f80fd5b6020019150600681901b3603821315610bfa575f80fd5b5f60208284031215612adc575f80fd5b8135610b4a81611a90565b5f6001600160a01b03808716835280861660208401525083604083015260806060830152612a36608083018461224b565b5f60208284031215612b28575f80fd5b8151610b4a81611d0a565b5f60208284031215612b43575f80fd5b815160ff81168114610b4a575f80fd5b5f60208284031215612b63575f80fd5b5051919050565b5f805f60608486031215612b7c575f80fd5b8351612b8781611a90565b6020850151909350612b9881611a90565b604085015190925067ffffffffffffffff811115612bb4575f80fd5b8401601f81018613612bc4575f80fd5b8051612bd2611d8982611d45565b818152876020838501011115612be6575f80fd5b8160208401602083015e5f602083830101528093505050509250925092565b634e487b7160e01b5f52601260045260245ffd5b818103818111156100e157634e487b7160e01b5f52601160045260245ffd5b5f8282518085526020808601955060208260051b840101602086015f5b8481101561237957601f19868403018952612c718383516122c7565b98840198925090830190600101612c55565b602081526001600160a01b038251166020820152602082015160408201525f604083015160e06060840152612cbc61010084018261224b565b9050606084015160808401526080840151601f19808584030160a0860152612ce48383612c38565b925060a08601519150808584030160c0860152612d0183836122c7565b925060c08601519150808584030160e0860152506106c082826122c7565b5f82601f830112612d2e575f80fd5b81516020612d3e611d8983611d22565b8083825260208201915060208460051b870101935086841115612d5f575f80fd5b602086015b84811015611eac5780518352918301918301612d64565b5f8060408385031215612d8c575f80fd5b825167ffffffffffffffff80821115612da3575f80fd5b818501915085601f830112612db6575f80fd5b81516020612dc6611d8983611d22565b82815260059290921b84018101918181019089841115612de4575f80fd5b948201945b83861015612e0257855182529482019490820190612de9565b91880151919650909350505080821115612e1a575f80fd5b5061224185828601612d1f565b828152604060208201525f612e3f60408301846122c7565b949350505050565b634e487b7160e01b5f52602160045260245ffd"; + hex"6080604052348015600e575f80fd5b5060017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055612da7806100405f395ff3fe608060405260043610610034575f3560e01c806301ffc9a71461003d57806323e30c8b146100715780638c18e4ba1461009e57005b3661003b57005b005b348015610048575f80fd5b5061005c6100573660046119d4565b6100b1565b60405190151581526020015b60405180910390f35b34801561007c575f80fd5b5061009061008b366004611a5d565b6100e7565b604051908152602001610068565b61003b6100ac366004611ad4565b610204565b5f6001600160e01b031982166323e30c8b60e01b14806100e157506301ffc9a760e01b6001600160e01b03198316145b92915050565b5f337350ad4ff129155d8f584deda447b11b4f5138840d1461012257604051625e1e6f60e51b81523360048201526024015b60405180910390fd5b6001600160a01b0387163014610156576040516322c7df1960e21b81526001600160a01b0388166004820152602401610119565b5f80610164848601866120d8565b91509150610172828261057c565b6040516334e3942b60e11b815233906369c72856906101959085906004016122f1565b60408051808303815f875af11580156101b0573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906101d4919061246f565b507f439148f0bbc682ca079e46d6e2c2f0c1e3b820f1a291b069d8882abf8cf18dd99a9950505050505050505050565b61020c6105f0565b61021b61021882612491565b50565b61022860808501856124fa565b90505f0361024957604051639c95219f60e01b815260040160405180910390fd5b6001600160a01b0385167350ad4ff129155d8f584deda447b11b4f5138840d146102915760405163516e822d60e01b81526001600160a01b0386166004820152602401610119565b6102a16080850160608601612540565b6102be57604051636d3a9fe560e01b815260040160405180910390fd5b5f8484846040516020016102d493929190612799565b60408051601f1981840301815291905290505f6102f460808701876124fa565b5f818110610304576103046129ab565b905060200281019061031691906129bf565b61032090806129dd565b61032e9060608101906129f1565b61033b60808901896124fa565b5f81811061034b5761034b6129ab565b905060200281019061035d91906129bf565b60400135818110610370576103706129ab565b6103869260206040909202019081019150612a37565b90505f61039660808801886124fa565b5f8181106103a6576103a66129ab565b90506020028101906103b891906129bf565b6103c290806129dd565b6103d09060408101906129f1565b6103dd60808a018a6124fa565b5f8181106103ed576103ed6129ab565b90506020028101906103ff91906129bf565b60200135818110610412576104126129ab565b6104289260206040909202019081019150612a37565b90505f6104348261061e565b90505f6104408461061e565b90505f61044e8a35836106a2565b90506104656001600160a01b0385168c5f196106c9565b61047a6001600160a01b0386168c5f196106c9565b604051632e7ff4ef60e11b81526001600160a01b038c1690635cffe9de906104ac903090899086908c90600401612a52565b6020604051808303815f875af11580156104c8573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104ec9190612a83565b610509576040516349088f5960e11b815260040160405180910390fd5b61051d6001600160a01b0386168c5f6106c9565b6105316001600160a01b0385168c5f6106c9565b61054661053d88612491565b85858886610743565b50505050505061057560017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b5050505050565b5f82608001515f81518110610593576105936129ab565b60200260200101515f01516060015183608001515f815181106105b8576105b86129ab565b602002602001015160400151815181106105d4576105d46129ab565b60200260200101515f015190506105eb81836109e2565b505050565b6105f8610a8c565b60027f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b5f610627610ad0565b6040516354636d2b60e01b81526001600160a01b038316600482015273200e12d10bb0c5e4a17e7018f0f1161919bb9389906354636d2b906024016020604051808303815f875af115801561067e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906100e19190612a9e565b5f6001600160e01b038316601b0b60e084901d6106c0828286610b5b565b95945050505050565b6106d58383835f610b9f565b6105eb576106e683835f6001610b9f565b61070e57604051635274afe760e01b81526001600160a01b0384166004820152602401610119565b61071b8383836001610b9f565b6105eb57604051635274afe760e01b81526001600160a01b0384166004820152602401610119565b6040805160018082528183019092525f91816020015b6060815260200190600190039081610759575050604080516003808252608082019092529192505f919060208201606080368337019050506040516370a0823160e01b81523060048201529091505f906001600160a01b038816906370a0823190602401602060405180830381865afa1580156107d8573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107fc9190612abe565b90508015610818576108186001600160a01b0388163383610c01565b5f6108238288610c0e565b50905080835f81518110610839576108396129ab565b602090810291909101015250506040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa15801561088a573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108ae9190612abe565b905080156108ca576108ca6001600160a01b0386163383610c01565b5f6108d58286610c0e565b50905080836001815181106108ec576108ec6129ab565b602090810291909101015250479050801561090b5761090b3382610c4f565b5f610917826012610c0e565b509050808360028151811061092e5761092e6129ab565b602002602001018181525050505080825f8151811061094f5761094f6129ab565b60209081029190910101526040805160018082528183019092525f91816020015b6040805160a0810182525f918101828152606080830193909352608082018390528152602081019190915281526020019060019003908161097057905050905087815f815181106109c3576109c36129ab565b60200260200101819052506109d88382610cc6565b5050505050505050565b5f805f838060200190518101906109f99190612ad5565b919450925090506001600160a01b038316610a27576040516398521dc560e01b815260040160405180910390fd5b6001600160a01b038216610a4e5760405163456ac4c360e11b815260040160405180910390fd5b610a636001600160a01b038616845f196106c9565b610a776001600160a01b0383168247610f0e565b506105756001600160a01b038616845f6106c9565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0054600203610ace57604051633ee5aeb560e01b815260040160405180910390fd5b565b73200e12d10bb0c5e4a17e7018f0f1161919bb93893b1580610b27575073200e12d10bb0c5e4a17e7018f0f1161919bb93893f7f1de7d717526cba131d684e312dedbf0852adef9cced9e36798ae4937f7145d4114155b15610ace576040516373e6d7b360e01b815273200e12d10bb0c5e4a17e7018f0f1161919bb93896004820152602401610119565b5f805f610b69868686610fbc565b9150915080610b945760405162bc8ecf60e31b81526004810187905260248101869052604401610119565b5090505b9392505050565b60405163095ea7b360e01b5f8181526001600160a01b038616600452602485905291602083604481808b5af1925060015f51148316610bf5578383151615610be9573d5f823e3d81fd5b5f873b113d1516831692505b60405250949350505050565b61071b838383600161112e565b5f805f805f610c1d8787611178565b9250925092505f80610c2f85856111d4565b9150915081838015610c3e5750815b9650965050505050505b9250929050565b80471015610c795760405163cf47918160e01b815247600482015260248101829052604401610119565b610c92828260405180602001604052805f81525061141d565b15610c9b575050565b3d15610cad57610ca9611432565b5050565b60405163d6bda27560e01b815260040160405180910390fd5b60408051600680825260e082019092525f91816020015b6060815260200190600190039081610cdd5790505090505f5b8351811015610d3e57838181518110610d1157610d116129ab565b6020026020010151828281518110610d2b57610d2b6129ab565b6020908102919091010152600101610cf6565b50335f8181523060209081526040808320815160a0810183528083018581526060808301879052608083018190529082528185015282518581529384018581528484019093529093909291905b8751811015610f0357878181518110610da657610da66129ab565b602002602001015193505f845f015160400151511115610efb575f845f01515f01516001600160a01b031663d04dfe236040518060e00160405280885f0151602001516001600160a01b03168152602001898152602001885f01516040015181526020015f8152602001610e1e8c8a6020015161143d565b8152602001878152602001868152506040518263ffffffff1660e01b8152600401610e499190612bbb565b5f60405180830381865afa158015610e63573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610e8a9190810190612cb3565b9150505f81511115610ef95784516020015160405163012c676d60e21b81526001600160a01b03909116906304b19db490610ecb908a908590600401612d5f565b5f604051808303815f87803b158015610ee2575f80fd5b505af1158015610ef4573d5f803e3d5ffd5b505050505b505b600101610d8b565b505050505050505050565b606081471015610f3a5760405163cf47918160e01b815247600482015260248101839052604401610119565b5f610f4685848661141d565b9050808015610f6757505f3d1180610f6757505f856001600160a01b03163b115b15610f7c57610f7461171f565b915050610b98565b8015610fa657604051639996b31560e01b81526001600160a01b0386166004820152602401610119565b3d15610cad57610fb4611432565b509392505050565b5f805f851215610fe957604051634a7d166b60e01b81526004810186905260248101859052604401610119565b845f03610ffb57505f90506001611126565b8460ff84168501858112156110365760405163c849483b60e01b8152600481018890526024810187905260ff86166044820152606401610119565b5f805f83121561108257604c19831215611059575f809550955050505050611126565b825f03600a0a915081848161107057611070612d7f565b04955050840290911491506111269050565b5f83131561111b57604d8313156110bf5760405163c849483b60e01b8152600481018a90526024810189905260ff88166044820152606401610119565b82600a0a9150815f19816110d5576110d5612d7f565b048411156111095760405163c849483b60e01b8152600481018a90526024810189905260ff88166044820152606401610119565b50919091029250600191506111269050565b509193506001925050505b935093915050565b60405163a9059cbb60e01b5f8181526001600160a01b038616600452602485905291602083604481808b5af1925060015f51148316610bf5578383151615610be9573d5f823e3d81fd5b5f808060ff841681037f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8611156111c357600a860460018201600a88065f14935093509350506111cd565b8593509150600190505b9250925092565b5f808383601b82900b82148061130a577d90e40fbeea1d3a4abc8955e946fe31cdcf66f634e1000000000000000000870515611255577f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee8000000000000000000870515611246576305f5e10087059650600886019550611255565b620186a0870596506005860195505b8687601b0b1461127057600a87059650856001019550611255565b7b0ccccccccccccccccccccccccccccccccccccccccccccccccccccccc7b1999999999999999999999999999999999999999999999999999999888820111611304575f600188039050808160030b036113025760e01b6001600160e01b037b7fffffffffffffffffffffffffffffffffffffffffffffffffffffff60ff8b901d18161795505f9450610c489350505050565b505b50611321565b865f0361132157505f935060019250610c48915050565b858660030b146113d8575f8213156113805761133d8383611738565b156113655760405163d556b11160e01b81526004810184905260248101839052604401610119565b637ffffffe19909501600a0a82029550637fffffff946113d8565b637fffffff1986900360438113156113a257505f9450849350610c4892505050565b80600a0a88816113b4576113b4612d7f565b059750875f036113ce57505f9450849350610c4892505050565b50637fffffff1995505b8186136113e85760019350611401565b818603600a0a83816113fc576113fc612d7f565b071593505b5050506001600160e01b03841660e084901b1791509250929050565b5f805f83516020850186885af1949350505050565b6040513d5f823e3d81fd5b60605f825167ffffffffffffffff81111561145a5761145a611b7b565b604051908082528060200260200182016040528015611483578160200160208202803683370190505b5090505f80845111611495575f61149b565b83516001015b85516001010190505f8167ffffffffffffffff8111156114bd576114bd611b7b565b6040519080825280602002602001820160405280156114f057816020015b60608152602001906001900390816114db5790505b5090505f611514604080516002815233602082015230818301526060810190915290565b828281518110611526576115266129ab565b60200260200101819052505f5b8751811015611583578180600101925050878181518110611556576115566129ab565b6020026020010151838381518110611570576115706129ab565b6020908102919091010152600101611533565b50855115611715578080600101915050838282815181106115a6576115a66129ab565b60200260200101819052505f5b8651811015611713576116628782815181106115d1576115d16129ab565b60200260200101515f015161163f61160d8a85815181106115f4576115f46129ab565b6020026020010151602001518051602090810291012090565b7f19457468657265756d205369676e6564204d6573736167653a0a3332000000005f908152601c91909152603c902090565b898481518110611651576116516129ab565b602002602001015160400151611753565b61168257604051630a57f30960e31b815260048101829052602401610119565b868181518110611694576116946129ab565b60200260200101515f01516001600160a01b03165f1b8582815181106116bc576116bc6129ab565b60200260200101818152505081806001019250508681815181106116e2576116e26129ab565b602002602001015160200151838381518110611700576117006129ab565b60209081029190910101526001016115b3565b505b5095945050505050565b6040513d81523d5f602083013e3d602001810160405290565b5f610b985f8412611749578361174d565b835f035b836117c3565b5f836001600160a01b03163b5f036117b1575f806117718585611861565b5090925090505f81600381111561178a5761178a612d93565b1480156117a85750856001600160a01b0316826001600160a01b0316145b92505050610b98565b6117bc8484846118a7565b9050610b98565b5f637ffffff582136117d657505f6100e1565b637ffffffe19820160438113156117f15750508115156100e1565b5f81126118315780600a0a7b800000000000000000000000000000000000000000000000000000018161182657611826612d7f565b0484119150506100e1565b805f03600a0a7b800000000000000000000000000000000000000000000000000000020284101591505092915050565b5f805f8351604103611898576020840151604085015160608601515f1a61188a8882858561190c565b9550955095505050506111cd565b505081515f91506002906111cd565b805160408051630b135d3f60e11b8082526004820186905260248201929092525f92906020820185604483015e5f82606483010152601f820160051c60051b915060205f60648401838a5afa9050825f5114601f3d1116811693505050509392505050565b5f80807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a084111561194557505f915060039050826119ca565b604080515f808252602082018084528a905260ff891692820192909252606081018790526080810186905260019060a0016020604051602081039080840390855afa158015611996573d5f803e3d5ffd5b5050604051601f1901519150506001600160a01b0381166119c157505f9250600191508290506119ca565b92505f91508190505b9450945094915050565b5f602082840312156119e4575f80fd5b81356001600160e01b031981168114610b98575f80fd5b6001600160a01b0381168114610218575f80fd5b8035611a1a816119fb565b919050565b5f8083601f840112611a2f575f80fd5b50813567ffffffffffffffff811115611a46575f80fd5b602083019150836020828501011115610c48575f80fd5b5f805f805f8060a08789031215611a72575f80fd5b8635611a7d816119fb565b95506020870135611a8d816119fb565b94506040870135935060608701359250608087013567ffffffffffffffff811115611ab6575f80fd5b611ac289828a01611a1f565b979a9699509497509295939492505050565b5f805f805f60808688031215611ae8575f80fd5b8535611af3816119fb565b9450602086013567ffffffffffffffff80821115611b0f575f80fd5b9087019060c0828a031215611b22575f80fd5b90945060408701359080821115611b37575f80fd5b611b4389838a01611a1f565b90955093506060880135915080821115611b5b575f80fd5b50860160408189031215611b6d575f80fd5b809150509295509295909350565b634e487b7160e01b5f52604160045260245ffd5b6040516060810167ffffffffffffffff81118282101715611bb257611bb2611b7b565b60405290565b6040805190810167ffffffffffffffff81118282101715611bb257611bb2611b7b565b6040516080810167ffffffffffffffff81118282101715611bb257611bb2611b7b565b60405160a0810167ffffffffffffffff81118282101715611bb257611bb2611b7b565b60405160c0810167ffffffffffffffff81118282101715611bb257611bb2611b7b565b604051601f8201601f1916810167ffffffffffffffff81118282101715611c6d57611c6d611b7b565b604052919050565b8015158114610218575f80fd5b8035611a1a81611c75565b5f67ffffffffffffffff821115611ca657611ca6611b7b565b5060051b60200190565b5f67ffffffffffffffff821115611cc957611cc9611b7b565b50601f01601f191660200190565b5f82601f830112611ce6575f80fd5b8135611cf9611cf482611cb0565b611c44565b818152846020838601011115611d0d575f80fd5b816020850160208301375f918101602001919091529392505050565b5f60608284031215611d39575f80fd5b611d41611b8f565b90508135611d4e816119fb565b81526020820135611d5e816119fb565b6020820152604082013567ffffffffffffffff811115611d7c575f80fd5b611d8884828501611cd7565b60408301525092915050565b5f82601f830112611da3575f80fd5b81356020611db3611cf483611c8d565b82815260069290921b84018101918181019086841115611dd1575f80fd5b8286015b84811015611e175760408189031215611dec575f80fd5b611df4611bb8565b8135611dff816119fb565b81528185013585820152835291830191604001611dd5565b509695505050505050565b5f82601f830112611e31575f80fd5b81356020611e41611cf483611c8d565b82815260059290921b84018101918181019086841115611e5f575f80fd5b8286015b84811015611e1757803567ffffffffffffffff80821115611e82575f80fd5b908801906060828b03601f19011215611e99575f80fd5b611ea1611b8f565b86830135611eae816119fb565b815260408381013583811115611ec2575f80fd5b8401603f81018d13611ed2575f80fd5b88810135611ee2611cf482611c8d565b81815260059190911b82018301908a8101908f831115611f00575f80fd5b928401925b82841015611f1e5783358252928b0192908b0190611f05565b858c0152505050606084013583811115611f36575f80fd5b611f448d8a83880101611cd7565b918301919091525085525050918301918301611e63565b5f82601f830112611f6a575f80fd5b81356020611f7a611cf483611c8d565b82815260059290921b84018101918181019086841115611f98575f80fd5b8286015b84811015611e1757803567ffffffffffffffff80821115611fbb575f80fd5b90880190601f196080838c0382011215611fd3575f80fd5b611fdb611bdb565b8784013583811115611feb575f80fd5b840160a0818e0384011215611ffe575f80fd5b612006611bfe565b9250612013898201611a0f565b8352604081013584811115612026575f80fd5b6120348e8b83850101611d29565b8a850152506060808201358581111561204b575f80fd5b6120598f8c83860101611d94565b604086015250608082013585811115612070575f80fd5b61207e8f8c83860101611d94565b828601525060a0820135608085015283835260408601358a84015280860135604084015260808601359350848411156120b5575f80fd5b6120c38e8b86890101611e22565b90830152508652505050918301918301611f9c565b5f80604083850312156120e9575f80fd5b823567ffffffffffffffff80821115612100575f80fd5b9084019060c08287031215612113575f80fd5b61211b611c21565b82358152602083013560208201526040830135604082015261213f60608401611c82565b6060820152608083013582811115612155575f80fd5b61216188828601611f5b565b60808301525060a083013582811115612178575f80fd5b61218488828601611cd7565b60a0830152509350602085013591508082111561219f575f80fd5b506121ac85828601611cd7565b9150509250929050565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b5f815180845260208085019450602084015f5b8381101561222757815180516001600160a01b0316885283015183880152604090960195908201906001016121f7565b509495945050505050565b5f815180845260208085019450602084015f5b8381101561222757815187529582019590820190600101612245565b5f82825180855260208086019550808260051b8401018186015f5b848110156122e457601f19868403018952815160606001600160a01b0382511685528582015181878701526122b382870182612232565b915050604080830151925085820381870152506122d081836121b6565b9a86019a945050509083019060010161227c565b5090979650505050505050565b5f602080835260e08301845182850152818501516040818187015280870151915060608281880152808801519250608083151560808901526080890151935060a060c060a08a01528585518088526101009750878b019150878160051b8c010189880197505f5b82811015612440578c820360ff190184528851805187845280516001600160a01b03908116898601528d82015188860189905280518216610120870152808f01519091166101408601528a015161016085018a90526123bb6101808601826121b6565b90508a820151607f19808784030160c08801526123d883836121e4565b92508b8401519150808784030160e0880152506123f582826121e4565b915050888201518d8601528d8301518e8601528a8301518b8601528983015192508481038a8601526124278184612261565b9b8e019b968e0196945050506001919091019050612358565b5060a08d01518c8203601f190160c08e0152995061245e818b6121b6565b9d9c50505050505050505050505050565b5f8060408385031215612480575f80fd5b505080516020909101519092909150565b5f604082360312156124a1575f80fd5b6124a9611bb8565b823567ffffffffffffffff808211156124c0575f80fd5b6124cc36838701611d29565b835260208501359150808211156124e1575f80fd5b506124ee36828601611e22565b60208301525092915050565b5f808335601e1984360301811261250f575f80fd5b83018035915067ffffffffffffffff821115612529575f80fd5b6020019150600581901b3603821315610c48575f80fd5b5f60208284031215612550575f80fd5b8135610b9881611c75565b5f808335601e19843603018112612570575f80fd5b830160208101925035905067ffffffffffffffff81111561258f575f80fd5b8060051b3603821315610c48575f80fd5b5f8235605e198336030181126125b4575f80fd5b90910192915050565b5f808335601e198436030181126125d2575f80fd5b830160208101925035905067ffffffffffffffff8111156125f1575f80fd5b803603821315610c48575f80fd5b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b5f808335601e1984360301811261263c575f80fd5b830160208101925035905067ffffffffffffffff81111561265b575f80fd5b8060061b3603821315610c48575f80fd5b8183525f60208085019450825f5b8581101561222757813561268d816119fb565b6001600160a01b0316875281830135838801526040968701969091019060010161267a565b8183526020808401935f91600585811b8301820185855b8881101561278b57858303601f19018a526126e482896125a0565b606081356126f1816119fb565b6001600160a01b031685526127088288018361255b565b82898801528083880152608092507f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811115612742575f80fd5b871b80828885013786019050604061275c848201856125bd565b945083888403018289015261277484840186836125ff565b9e8a019e97505050938701935050506001016126c9565b509098975050505050505050565b5f604080835261010080840187358386015260206060818a013581880152848a01356080880152808a01356127cd81611c75565b151560a08801526127e160808b018b61255b565b60c0898101529384905261012093848901600582901b8a018601835f5b8481101561295b578c830361011f19018452813536879003607e19018112612824575f80fd5b8601803536829003609e1901811261283a575f80fd5b608085528101803561284b816119fb565b6001600160a01b0380821660808801526128678c8401846125a0565b915060a080880152813561287a816119fb565b8116878e0152818c013561288d816119fb565b166101408701526128a0818f01826125bd565b91508a6101608801526128b8610180880183836125ff565b9150506128c78e830183612627565b607f19808985030160c08a01526128df84838561266c565b93506128ed8d860186612627565b93509150808985030160e08a01525061290783838361266c565b9250505060808201358d8701528a8301358b8701528d8301358e8701526129308a84018461255b565b935091508581038a8701526129468184846126b2565b968b01969550505091880191506001016127fe565b505061296a60a08f018f6125bd565b8c8303603f190160e08e015299509750612985818a8a6125ff565b98505050505050858403818701525050506129a18185876125ff565b9695505050505050565b634e487b7160e01b5f52603260045260245ffd5b5f8235607e198336030181126129d3575f80fd5b9190910192915050565b5f8235609e198336030181126129d3575f80fd5b5f808335601e19843603018112612a06575f80fd5b83018035915067ffffffffffffffff821115612a20575f80fd5b6020019150600681901b3603821315610c48575f80fd5b5f60208284031215612a47575f80fd5b8135610b98816119fb565b5f6001600160a01b038087168352808616602084015250836040830152608060608301526129a160808301846121b6565b5f60208284031215612a93575f80fd5b8151610b9881611c75565b5f60208284031215612aae575f80fd5b815160ff81168114610b98575f80fd5b5f60208284031215612ace575f80fd5b5051919050565b5f805f60608486031215612ae7575f80fd5b8351612af2816119fb565b6020850151909350612b03816119fb565b604085015190925067ffffffffffffffff811115612b1f575f80fd5b8401601f81018613612b2f575f80fd5b8051612b3d611cf482611cb0565b818152876020838501011115612b51575f80fd5b8160208401602083015e5f602083830101528093505050509250925092565b5f8282518085526020808601955060208260051b840101602086015f5b848110156122e457601f19868403018952612ba9838351612232565b98840198925090830190600101612b8d565b602081526001600160a01b038251166020820152602082015160408201525f604083015160e06060840152612bf46101008401826121b6565b9050606084015160808401526080840151601f19808584030160a0860152612c1c8383612b70565b925060a08601519150808584030160c0860152612c398383612232565b925060c08601519150808584030160e0860152506106c08282612232565b5f82601f830112612c66575f80fd5b81516020612c76611cf483611c8d565b8083825260208201915060208460051b870101935086841115612c97575f80fd5b602086015b84811015611e175780518352918301918301612c9c565b5f8060408385031215612cc4575f80fd5b825167ffffffffffffffff80821115612cdb575f80fd5b818501915085601f830112612cee575f80fd5b81516020612cfe611cf483611c8d565b82815260059290921b84018101918181019089841115612d1c575f80fd5b948201945b83861015612d3a57855182529482019490820190612d21565b91880151919650909350505080821115612d52575f80fd5b506121ac85828601612c57565b828152604060208201525f612d776040830184612232565b949350505050565b634e487b7160e01b5f52601260045260245ffd5b634e487b7160e01b5f52602160045260245ffd"; /// @dev The runtime bytecode of the contract. bytes constant RUNTIME_CODE = - hex"608060405260043610610034575f3560e01c806301ffc9a71461003d57806323e30c8b146100715780638c18e4ba1461009e57005b3661003b57005b005b348015610048575f80fd5b5061005c610057366004611a69565b6100b1565b60405190151581526020015b60405180910390f35b34801561007c575f80fd5b5061009061008b366004611af2565b6100e7565b604051908152602001610068565b61003b6100ac366004611b69565b610204565b5f6001600160e01b031982166323e30c8b60e01b14806100e157506301ffc9a760e01b6001600160e01b03198316145b92915050565b5f3373522a6b8d2cd1e44d53475516fd3c55bc29a0e8651461012257604051625e1e6f60e51b81523360048201526024015b60405180910390fd5b6001600160a01b0387163014610156576040516322c7df1960e21b81526001600160a01b0388166004820152602401610119565b5f806101648486018661216d565b91509150610172828261057c565b6040516334e3942b60e11b815233906369c7285690610195908590600401612386565b60408051808303815f875af11580156101b0573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906101d49190612504565b507f439148f0bbc682ca079e46d6e2c2f0c1e3b820f1a291b069d8882abf8cf18dd99a9950505050505050505050565b61020c6105f0565b61021b61021882612526565b50565b610228608085018561258f565b90505f0361024957604051639c95219f60e01b815260040160405180910390fd5b6001600160a01b03851673522a6b8d2cd1e44d53475516fd3c55bc29a0e865146102915760405163516e822d60e01b81526001600160a01b0386166004820152602401610119565b6102a160808501606086016125d5565b6102be57604051636d3a9fe560e01b815260040160405180910390fd5b5f8484846040516020016102d49392919061282e565b60408051601f1981840301815291905290505f6102f4608087018761258f565b5f81811061030457610304612a40565b90506020028101906103169190612a54565b6103209080612a72565b61032e906060810190612a86565b61033b608089018961258f565b5f81811061034b5761034b612a40565b905060200281019061035d9190612a54565b6040013581811061037057610370612a40565b6103869260206040909202019081019150612acc565b90505f610396608088018861258f565b5f8181106103a6576103a6612a40565b90506020028101906103b89190612a54565b6103c29080612a72565b6103d0906040810190612a86565b6103dd60808a018a61258f565b5f8181106103ed576103ed612a40565b90506020028101906103ff9190612a54565b6020013581811061041257610412612a40565b6104289260206040909202019081019150612acc565b90505f6104348261061e565b90505f6104408461061e565b90505f61044e8a35836106a2565b90506104656001600160a01b0385168c5f196106c9565b61047a6001600160a01b0386168c5f196106c9565b604051632e7ff4ef60e11b81526001600160a01b038c1690635cffe9de906104ac903090899086908c90600401612ae7565b6020604051808303815f875af11580156104c8573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104ec9190612b18565b610509576040516349088f5960e11b815260040160405180910390fd5b61051d6001600160a01b0386168c5f6106c9565b6105316001600160a01b0385168c5f6106c9565b61054661053d88612526565b85858886610743565b50505050505061057560017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b5050505050565b5f82608001515f8151811061059357610593612a40565b60200260200101515f01516060015183608001515f815181106105b8576105b8612a40565b602002602001015160400151815181106105d4576105d4612a40565b60200260200101515f015190506105eb8183610994565b505050565b6105f8610a3e565b60027f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b5f610627610a82565b6040516354636d2b60e01b81526001600160a01b038316600482015273200e12d10bb0c5e4a17e7018f0f1161919bb9389906354636d2b906024016020604051808303815f875af115801561067e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906100e19190612b33565b5f6001600160e01b038316601b0b60e084901d6106c0828286610b0d565b95945050505050565b6106d58383835f610b51565b6105eb576106e683835f6001610b51565b61070e57604051635274afe760e01b81526001600160a01b0384166004820152602401610119565b61071b8383836001610b51565b6105eb57604051635274afe760e01b81526001600160a01b0384166004820152602401610119565b604080516003808252608082019092525f9160208201606080368337019050506040516370a0823160e01b81523060048201529091505f906001600160a01b038716906370a0823190602401602060405180830381865afa1580156107aa573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107ce9190612b53565b905080156107ea576107ea6001600160a01b0387163383610bb3565b5f6107f58287610bc0565b50905080835f8151811061080b5761080b612a40565b602090810291909101015250506040516370a0823160e01b81523060048201525f906001600160a01b038516906370a0823190602401602060405180830381865afa15801561085c573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108809190612b53565b9050801561089c5761089c6001600160a01b0385163383610bb3565b5f6108a78285610bc0565b50905080836001815181106108be576108be612a40565b60209081029190910101525047905080156108dd576108dd3382610c01565b5f6108e9826012610bc0565b509050808360028151811061090057610900612a40565b602090810291909101015250506040805160018082528183019092525f91816020015b6040805160a0810182525f918101828152606080830193909352608082018390528152602081019190915281526020019060019003908161092357905050905086815f8151811061097657610976612a40565b602002602001018190525061098b8282610c78565b50505050505050565b5f805f838060200190518101906109ab9190612b6a565b919450925090506001600160a01b0383166109d9576040516398521dc560e01b815260040160405180910390fd5b6001600160a01b038216610a005760405163456ac4c360e11b815260040160405180910390fd5b610a156001600160a01b038616845f196106c9565b610a296001600160a01b0383168247610c8d565b506105756001600160a01b038616845f6106c9565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0054600203610a8057604051633ee5aeb560e01b815260040160405180910390fd5b565b73200e12d10bb0c5e4a17e7018f0f1161919bb93893b1580610ad9575073200e12d10bb0c5e4a17e7018f0f1161919bb93893f7f1de7d717526cba131d684e312dedbf0852adef9cced9e36798ae4937f7145d4114155b15610a80576040516373e6d7b360e01b815273200e12d10bb0c5e4a17e7018f0f1161919bb93896004820152602401610119565b5f805f610b1b868686610d3b565b9150915080610b465760405162bc8ecf60e31b81526004810187905260248101869052604401610119565b5090505b9392505050565b60405163095ea7b360e01b5f8181526001600160a01b038616600452602485905291602083604481808b5af1925060015f51148316610ba7578383151615610b9b573d5f823e3d81fd5b5f873b113d1516831692505b60405250949350505050565b61071b8383836001610ead565b5f805f805f610bcf8787610ef7565b9250925092505f80610be18585610f53565b9150915081838015610bf05750815b9650965050505050505b9250929050565b80471015610c2b5760405163cf47918160e01b815247600482015260248101829052604401610119565b610c44828260405180602001604052805f81525061119c565b15610c4d575050565b3d15610c5f57610c5b6111b1565b5050565b60405163d6bda27560e01b815260040160405180910390fd5b610c5b610c866007846111bc565b825f61121e565b606081471015610cb95760405163cf47918160e01b815247600482015260248101839052604401610119565b5f610cc585848661119c565b9050808015610ce657505f3d1180610ce657505f856001600160a01b03163b115b15610cfb57610cf36114d2565b915050610b4a565b8015610d2557604051639996b31560e01b81526001600160a01b0386166004820152602401610119565b3d15610c5f57610d336111b1565b509392505050565b5f805f851215610d6857604051634a7d166b60e01b81526004810186905260248101859052604401610119565b845f03610d7a57505f90506001610ea5565b8460ff8416850185811215610db55760405163c849483b60e01b8152600481018890526024810187905260ff86166044820152606401610119565b5f805f831215610e0157604c19831215610dd8575f809550955050505050610ea5565b825f03600a0a9150818481610def57610def612c05565b0495505084029091149150610ea59050565b5f831315610e9a57604d831315610e3e5760405163c849483b60e01b8152600481018a90526024810189905260ff88166044820152606401610119565b82600a0a9150815f1981610e5457610e54612c05565b04841115610e885760405163c849483b60e01b8152600481018a90526024810189905260ff88166044820152606401610119565b5091909102925060019150610ea59050565b509193506001925050505b935093915050565b60405163a9059cbb60e01b5f8181526001600160a01b038616600452602485905291602083604481808b5af1925060015f51148316610ba7578383151615610b9b573d5f823e3d81fd5b5f808060ff841681037f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff861115610f4257600a860460018201600a88065f1493509350935050610f4c565b8593509150600190505b9250925092565b5f808383601b82900b821480611089577d90e40fbeea1d3a4abc8955e946fe31cdcf66f634e1000000000000000000870515610fd4577f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee8000000000000000000870515610fc5576305f5e10087059650600886019550610fd4565b620186a0870596506005860195505b8687601b0b14610fef57600a87059650856001019550610fd4565b7b0ccccccccccccccccccccccccccccccccccccccccccccccccccccccc7b1999999999999999999999999999999999999999999999999999999888820111611083575f600188039050808160030b036110815760e01b6001600160e01b037b7fffffffffffffffffffffffffffffffffffffffffffffffffffffff60ff8b901d18161795505f9450610bfa9350505050565b505b506110a0565b865f036110a057505f935060019250610bfa915050565b858660030b14611157575f8213156110ff576110bc83836114eb565b156110e45760405163d556b11160e01b81526004810184905260248101839052604401610119565b637ffffffe19909501600a0a82029550637fffffff94611157565b637fffffff19869003604381131561112157505f9450849350610bfa92505050565b80600a0a888161113357611133612c05565b059750875f0361114d57505f9450849350610bfa92505050565b50637fffffff1995505b8186136111675760019350611180565b818603600a0a838161117b5761117b612c05565b071593505b5050506001600160e01b03841660e084901b1791509250929050565b5f805f83516020850186885af1949350505050565b6040513d5f823e3d81fd5b60408051600780825261010082019092526060915f9190816020015b60608152602001906001900390816111d857905050905082816111fc600187612c19565b8151811061120c5761120c612a40565b60209081029190910101529392505050565b60408051600780825261010082019092525f91816020015b60608152602001906001900390816112365790505090505f5b84518110156112975784818151811061126a5761126a612a40565b602002602001015182828151811061128457611284612a40565b602090810291909101015260010161124f565b50335f8181523060209081526040808320815160a0810183528083018581526060808301879052608083018190529082528185015282518581529384018581528484019093529093909291905b88518110156114c6578881815181106112ff576112ff612a40565b602002602001015193505f845f0151604001515111156114be575f611328888660200151611506565b90508861139b5761137d815f8151811061134457611344612a40565b60200260200101515f8151811061135d5761135d612a40565b602002602001015160408051600181526020810192909252818101905290565b815f8151811061138f5761138f612a40565b60200260200101819052505b8451516040805160e08101825287516020908101516001600160a01b0390811683529082018a90528851830151828401525f606083018190526080830186905260a0830189905260c08301889052925163d04dfe2360e01b81529293169163d04dfe239161140b91600401612c83565b5f60405180830381865afa158015611425573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261144c9190810190612d7b565b9150505f815111156114bb5785516020015160405163012c676d60e21b81526001600160a01b03909116906304b19db49061148d908b908590600401612e27565b5f604051808303815f87803b1580156114a4575f80fd5b505af11580156114b6573d5f803e3d5ffd5b505050505b50505b6001016112e4565b50505050505050505050565b6040513d81523d5f602083013e3d602001810160405290565b5f610b4a5f84126114fc5783611500565b835f035b836117e8565b60605f825167ffffffffffffffff81111561152357611523611c10565b60405190808252806020026020018201604052801561154c578160200160208202803683370190505b5090505f8084511161155e575f611564565b83516001015b85516001010190505f8167ffffffffffffffff81111561158657611586611c10565b6040519080825280602002602001820160405280156115b957816020015b60608152602001906001900390816115a45790505b5090505f6115dd604080516002815233602082015230818301526060810190915290565b8282815181106115ef576115ef612a40565b60200260200101819052505f5b875181101561164c57818060010192505087818151811061161f5761161f612a40565b602002602001015183838151811061163957611639612a40565b60209081029190910101526001016115fc565b508551156117de5780806001019150508382828151811061166f5761166f612a40565b60200260200101819052505f5b86518110156117dc5761172b87828151811061169a5761169a612a40565b60200260200101515f01516117086116d68a85815181106116bd576116bd612a40565b6020026020010151602001518051602090810291012090565b7f19457468657265756d205369676e6564204d6573736167653a0a3332000000005f908152601c91909152603c902090565b89848151811061171a5761171a612a40565b602002602001015160400151611886565b61174b57604051630a57f30960e31b815260048101829052602401610119565b86818151811061175d5761175d612a40565b60200260200101515f01516001600160a01b03165f1b85828151811061178557611785612a40565b60200260200101818152505081806001019250508681815181106117ab576117ab612a40565b6020026020010151602001518383815181106117c9576117c9612a40565b602090810291909101015260010161167c565b505b5095945050505050565b5f637ffffff582136117fb57505f6100e1565b637ffffffe19820160438113156118165750508115156100e1565b5f81126118565780600a0a7b800000000000000000000000000000000000000000000000000000018161184b5761184b612c05565b0484119150506100e1565b805f03600a0a7b800000000000000000000000000000000000000000000000000000020284101591505092915050565b5f836001600160a01b03163b5f036118e4575f806118a485856118f6565b5090925090505f8160038111156118bd576118bd612e47565b1480156118db5750856001600160a01b0316826001600160a01b0316145b92505050610b4a565b6118ef84848461193c565b9050610b4a565b5f805f835160410361192d576020840151604085015160608601515f1a61191f888285856119a1565b955095509550505050610f4c565b505081515f9150600290610f4c565b805160408051630b135d3f60e11b8082526004820186905260248201929092525f92906020820185604483015e5f82606483010152601f820160051c60051b915060205f60648401838a5afa9050825f5114601f3d1116811693505050509392505050565b5f80807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08411156119da57505f91506003905082611a5f565b604080515f808252602082018084528a905260ff891692820192909252606081018790526080810186905260019060a0016020604051602081039080840390855afa158015611a2b573d5f803e3d5ffd5b5050604051601f1901519150506001600160a01b038116611a5657505f925060019150829050611a5f565b92505f91508190505b9450945094915050565b5f60208284031215611a79575f80fd5b81356001600160e01b031981168114610b4a575f80fd5b6001600160a01b0381168114610218575f80fd5b8035611aaf81611a90565b919050565b5f8083601f840112611ac4575f80fd5b50813567ffffffffffffffff811115611adb575f80fd5b602083019150836020828501011115610bfa575f80fd5b5f805f805f8060a08789031215611b07575f80fd5b8635611b1281611a90565b95506020870135611b2281611a90565b94506040870135935060608701359250608087013567ffffffffffffffff811115611b4b575f80fd5b611b5789828a01611ab4565b979a9699509497509295939492505050565b5f805f805f60808688031215611b7d575f80fd5b8535611b8881611a90565b9450602086013567ffffffffffffffff80821115611ba4575f80fd5b9087019060c0828a031215611bb7575f80fd5b90945060408701359080821115611bcc575f80fd5b611bd889838a01611ab4565b90955093506060880135915080821115611bf0575f80fd5b50860160408189031215611c02575f80fd5b809150509295509295909350565b634e487b7160e01b5f52604160045260245ffd5b6040516060810167ffffffffffffffff81118282101715611c4757611c47611c10565b60405290565b6040805190810167ffffffffffffffff81118282101715611c4757611c47611c10565b6040516080810167ffffffffffffffff81118282101715611c4757611c47611c10565b60405160a0810167ffffffffffffffff81118282101715611c4757611c47611c10565b60405160c0810167ffffffffffffffff81118282101715611c4757611c47611c10565b604051601f8201601f1916810167ffffffffffffffff81118282101715611d0257611d02611c10565b604052919050565b8015158114610218575f80fd5b8035611aaf81611d0a565b5f67ffffffffffffffff821115611d3b57611d3b611c10565b5060051b60200190565b5f67ffffffffffffffff821115611d5e57611d5e611c10565b50601f01601f191660200190565b5f82601f830112611d7b575f80fd5b8135611d8e611d8982611d45565b611cd9565b818152846020838601011115611da2575f80fd5b816020850160208301375f918101602001919091529392505050565b5f60608284031215611dce575f80fd5b611dd6611c24565b90508135611de381611a90565b81526020820135611df381611a90565b6020820152604082013567ffffffffffffffff811115611e11575f80fd5b611e1d84828501611d6c565b60408301525092915050565b5f82601f830112611e38575f80fd5b81356020611e48611d8983611d22565b82815260069290921b84018101918181019086841115611e66575f80fd5b8286015b84811015611eac5760408189031215611e81575f80fd5b611e89611c4d565b8135611e9481611a90565b81528185013585820152835291830191604001611e6a565b509695505050505050565b5f82601f830112611ec6575f80fd5b81356020611ed6611d8983611d22565b82815260059290921b84018101918181019086841115611ef4575f80fd5b8286015b84811015611eac57803567ffffffffffffffff80821115611f17575f80fd5b908801906060828b03601f19011215611f2e575f80fd5b611f36611c24565b86830135611f4381611a90565b815260408381013583811115611f57575f80fd5b8401603f81018d13611f67575f80fd5b88810135611f77611d8982611d22565b81815260059190911b82018301908a8101908f831115611f95575f80fd5b928401925b82841015611fb35783358252928b0192908b0190611f9a565b858c0152505050606084013583811115611fcb575f80fd5b611fd98d8a83880101611d6c565b918301919091525085525050918301918301611ef8565b5f82601f830112611fff575f80fd5b8135602061200f611d8983611d22565b82815260059290921b8401810191818101908684111561202d575f80fd5b8286015b84811015611eac57803567ffffffffffffffff80821115612050575f80fd5b90880190601f196080838c0382011215612068575f80fd5b612070611c70565b8784013583811115612080575f80fd5b840160a0818e0384011215612093575f80fd5b61209b611c93565b92506120a8898201611aa4565b83526040810135848111156120bb575f80fd5b6120c98e8b83850101611dbe565b8a85015250606080820135858111156120e0575f80fd5b6120ee8f8c83860101611e29565b604086015250608082013585811115612105575f80fd5b6121138f8c83860101611e29565b828601525060a0820135608085015283835260408601358a840152808601356040840152608086013593508484111561214a575f80fd5b6121588e8b86890101611eb7565b90830152508652505050918301918301612031565b5f806040838503121561217e575f80fd5b823567ffffffffffffffff80821115612195575f80fd5b9084019060c082870312156121a8575f80fd5b6121b0611cb6565b8235815260208301356020820152604083013560408201526121d460608401611d17565b60608201526080830135828111156121ea575f80fd5b6121f688828601611ff0565b60808301525060a08301358281111561220d575f80fd5b61221988828601611d6c565b60a08301525093506020850135915080821115612234575f80fd5b5061224185828601611d6c565b9150509250929050565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b5f815180845260208085019450602084015f5b838110156122bc57815180516001600160a01b03168852830151838801526040909601959082019060010161228c565b509495945050505050565b5f815180845260208085019450602084015f5b838110156122bc578151875295820195908201906001016122da565b5f82825180855260208086019550808260051b8401018186015f5b8481101561237957601f19868403018952815160606001600160a01b038251168552858201518187870152612348828701826122c7565b91505060408083015192508582038187015250612365818361224b565b9a86019a9450505090830190600101612311565b5090979650505050505050565b5f602080835260e08301845182850152818501516040818187015280870151915060608281880152808801519250608083151560808901526080890151935060a060c060a08a01528585518088526101009750878b019150878160051b8c010189880197505f5b828110156124d5578c820360ff190184528851805187845280516001600160a01b03908116898601528d82015188860189905280518216610120870152808f01519091166101408601528a015161016085018a905261245061018086018261224b565b90508a820151607f19808784030160c088015261246d8383612279565b92508b8401519150808784030160e08801525061248a8282612279565b915050888201518d8601528d8301518e8601528a8301518b8601528983015192508481038a8601526124bc81846122f6565b9b8e019b968e01969450505060019190910190506123ed565b5060a08d01518c8203601f190160c08e015299506124f3818b61224b565b9d9c50505050505050505050505050565b5f8060408385031215612515575f80fd5b505080516020909101519092909150565b5f60408236031215612536575f80fd5b61253e611c4d565b823567ffffffffffffffff80821115612555575f80fd5b61256136838701611dbe565b83526020850135915080821115612576575f80fd5b5061258336828601611eb7565b60208301525092915050565b5f808335601e198436030181126125a4575f80fd5b83018035915067ffffffffffffffff8211156125be575f80fd5b6020019150600581901b3603821315610bfa575f80fd5b5f602082840312156125e5575f80fd5b8135610b4a81611d0a565b5f808335601e19843603018112612605575f80fd5b830160208101925035905067ffffffffffffffff811115612624575f80fd5b8060051b3603821315610bfa575f80fd5b5f8235605e19833603018112612649575f80fd5b90910192915050565b5f808335601e19843603018112612667575f80fd5b830160208101925035905067ffffffffffffffff811115612686575f80fd5b803603821315610bfa575f80fd5b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b5f808335601e198436030181126126d1575f80fd5b830160208101925035905067ffffffffffffffff8111156126f0575f80fd5b8060061b3603821315610bfa575f80fd5b8183525f60208085019450825f5b858110156122bc57813561272281611a90565b6001600160a01b0316875281830135838801526040968701969091019060010161270f565b8183526020808401935f91600585811b8301820185855b8881101561282057858303601f19018a526127798289612635565b6060813561278681611a90565b6001600160a01b0316855261279d828801836125f0565b82898801528083880152608092507f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8111156127d7575f80fd5b871b8082888501378601905060406127f184820185612652565b94508388840301828901526128098484018683612694565b9e8a019e975050509387019350505060010161275e565b509098975050505050505050565b5f604080835261010080840187358386015260206060818a013581880152848a01356080880152808a013561286281611d0a565b151560a088015261287660808b018b6125f0565b60c0898101529384905261012093848901600582901b8a018601835f5b848110156129f0578c830361011f19018452813536879003607e190181126128b9575f80fd5b8601803536829003609e190181126128cf575f80fd5b60808552810180356128e081611a90565b6001600160a01b0380821660808801526128fc8c840184612635565b915060a080880152813561290f81611a90565b8116878e0152818c013561292281611a90565b16610140870152612935818f0182612652565b91508a61016088015261294d61018088018383612694565b91505061295c8e8301836126bc565b607f19808985030160c08a0152612974848385612701565b93506129828d8601866126bc565b93509150808985030160e08a01525061299c838383612701565b9250505060808201358d8701528a8301358b8701528d8301358e8701526129c58a8401846125f0565b935091508581038a8701526129db818484612747565b968b0196955050509188019150600101612893565b50506129ff60a08f018f612652565b8c8303603f190160e08e015299509750612a1a818a8a612694565b9850505050505085840381870152505050612a36818587612694565b9695505050505050565b634e487b7160e01b5f52603260045260245ffd5b5f8235607e19833603018112612a68575f80fd5b9190910192915050565b5f8235609e19833603018112612a68575f80fd5b5f808335601e19843603018112612a9b575f80fd5b83018035915067ffffffffffffffff821115612ab5575f80fd5b6020019150600681901b3603821315610bfa575f80fd5b5f60208284031215612adc575f80fd5b8135610b4a81611a90565b5f6001600160a01b03808716835280861660208401525083604083015260806060830152612a36608083018461224b565b5f60208284031215612b28575f80fd5b8151610b4a81611d0a565b5f60208284031215612b43575f80fd5b815160ff81168114610b4a575f80fd5b5f60208284031215612b63575f80fd5b5051919050565b5f805f60608486031215612b7c575f80fd5b8351612b8781611a90565b6020850151909350612b9881611a90565b604085015190925067ffffffffffffffff811115612bb4575f80fd5b8401601f81018613612bc4575f80fd5b8051612bd2611d8982611d45565b818152876020838501011115612be6575f80fd5b8160208401602083015e5f602083830101528093505050509250925092565b634e487b7160e01b5f52601260045260245ffd5b818103818111156100e157634e487b7160e01b5f52601160045260245ffd5b5f8282518085526020808601955060208260051b840101602086015f5b8481101561237957601f19868403018952612c718383516122c7565b98840198925090830190600101612c55565b602081526001600160a01b038251166020820152602082015160408201525f604083015160e06060840152612cbc61010084018261224b565b9050606084015160808401526080840151601f19808584030160a0860152612ce48383612c38565b925060a08601519150808584030160c0860152612d0183836122c7565b925060c08601519150808584030160e0860152506106c082826122c7565b5f82601f830112612d2e575f80fd5b81516020612d3e611d8983611d22565b8083825260208201915060208460051b870101935086841115612d5f575f80fd5b602086015b84811015611eac5780518352918301918301612d64565b5f8060408385031215612d8c575f80fd5b825167ffffffffffffffff80821115612da3575f80fd5b818501915085601f830112612db6575f80fd5b81516020612dc6611d8983611d22565b82815260059290921b84018101918181019089841115612de4575f80fd5b948201945b83861015612e0257855182529482019490820190612de9565b91880151919650909350505080821115612e1a575f80fd5b5061224185828601612d1f565b828152604060208201525f612e3f60408301846122c7565b949350505050565b634e487b7160e01b5f52602160045260245ffd"; + hex"608060405260043610610034575f3560e01c806301ffc9a71461003d57806323e30c8b146100715780638c18e4ba1461009e57005b3661003b57005b005b348015610048575f80fd5b5061005c6100573660046119d4565b6100b1565b60405190151581526020015b60405180910390f35b34801561007c575f80fd5b5061009061008b366004611a5d565b6100e7565b604051908152602001610068565b61003b6100ac366004611ad4565b610204565b5f6001600160e01b031982166323e30c8b60e01b14806100e157506301ffc9a760e01b6001600160e01b03198316145b92915050565b5f337350ad4ff129155d8f584deda447b11b4f5138840d1461012257604051625e1e6f60e51b81523360048201526024015b60405180910390fd5b6001600160a01b0387163014610156576040516322c7df1960e21b81526001600160a01b0388166004820152602401610119565b5f80610164848601866120d8565b91509150610172828261057c565b6040516334e3942b60e11b815233906369c72856906101959085906004016122f1565b60408051808303815f875af11580156101b0573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906101d4919061246f565b507f439148f0bbc682ca079e46d6e2c2f0c1e3b820f1a291b069d8882abf8cf18dd99a9950505050505050505050565b61020c6105f0565b61021b61021882612491565b50565b61022860808501856124fa565b90505f0361024957604051639c95219f60e01b815260040160405180910390fd5b6001600160a01b0385167350ad4ff129155d8f584deda447b11b4f5138840d146102915760405163516e822d60e01b81526001600160a01b0386166004820152602401610119565b6102a16080850160608601612540565b6102be57604051636d3a9fe560e01b815260040160405180910390fd5b5f8484846040516020016102d493929190612799565b60408051601f1981840301815291905290505f6102f460808701876124fa565b5f818110610304576103046129ab565b905060200281019061031691906129bf565b61032090806129dd565b61032e9060608101906129f1565b61033b60808901896124fa565b5f81811061034b5761034b6129ab565b905060200281019061035d91906129bf565b60400135818110610370576103706129ab565b6103869260206040909202019081019150612a37565b90505f61039660808801886124fa565b5f8181106103a6576103a66129ab565b90506020028101906103b891906129bf565b6103c290806129dd565b6103d09060408101906129f1565b6103dd60808a018a6124fa565b5f8181106103ed576103ed6129ab565b90506020028101906103ff91906129bf565b60200135818110610412576104126129ab565b6104289260206040909202019081019150612a37565b90505f6104348261061e565b90505f6104408461061e565b90505f61044e8a35836106a2565b90506104656001600160a01b0385168c5f196106c9565b61047a6001600160a01b0386168c5f196106c9565b604051632e7ff4ef60e11b81526001600160a01b038c1690635cffe9de906104ac903090899086908c90600401612a52565b6020604051808303815f875af11580156104c8573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104ec9190612a83565b610509576040516349088f5960e11b815260040160405180910390fd5b61051d6001600160a01b0386168c5f6106c9565b6105316001600160a01b0385168c5f6106c9565b61054661053d88612491565b85858886610743565b50505050505061057560017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b5050505050565b5f82608001515f81518110610593576105936129ab565b60200260200101515f01516060015183608001515f815181106105b8576105b86129ab565b602002602001015160400151815181106105d4576105d46129ab565b60200260200101515f015190506105eb81836109e2565b505050565b6105f8610a8c565b60027f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b5f610627610ad0565b6040516354636d2b60e01b81526001600160a01b038316600482015273200e12d10bb0c5e4a17e7018f0f1161919bb9389906354636d2b906024016020604051808303815f875af115801561067e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906100e19190612a9e565b5f6001600160e01b038316601b0b60e084901d6106c0828286610b5b565b95945050505050565b6106d58383835f610b9f565b6105eb576106e683835f6001610b9f565b61070e57604051635274afe760e01b81526001600160a01b0384166004820152602401610119565b61071b8383836001610b9f565b6105eb57604051635274afe760e01b81526001600160a01b0384166004820152602401610119565b6040805160018082528183019092525f91816020015b6060815260200190600190039081610759575050604080516003808252608082019092529192505f919060208201606080368337019050506040516370a0823160e01b81523060048201529091505f906001600160a01b038816906370a0823190602401602060405180830381865afa1580156107d8573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107fc9190612abe565b90508015610818576108186001600160a01b0388163383610c01565b5f6108238288610c0e565b50905080835f81518110610839576108396129ab565b602090810291909101015250506040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa15801561088a573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108ae9190612abe565b905080156108ca576108ca6001600160a01b0386163383610c01565b5f6108d58286610c0e565b50905080836001815181106108ec576108ec6129ab565b602090810291909101015250479050801561090b5761090b3382610c4f565b5f610917826012610c0e565b509050808360028151811061092e5761092e6129ab565b602002602001018181525050505080825f8151811061094f5761094f6129ab565b60209081029190910101526040805160018082528183019092525f91816020015b6040805160a0810182525f918101828152606080830193909352608082018390528152602081019190915281526020019060019003908161097057905050905087815f815181106109c3576109c36129ab565b60200260200101819052506109d88382610cc6565b5050505050505050565b5f805f838060200190518101906109f99190612ad5565b919450925090506001600160a01b038316610a27576040516398521dc560e01b815260040160405180910390fd5b6001600160a01b038216610a4e5760405163456ac4c360e11b815260040160405180910390fd5b610a636001600160a01b038616845f196106c9565b610a776001600160a01b0383168247610f0e565b506105756001600160a01b038616845f6106c9565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0054600203610ace57604051633ee5aeb560e01b815260040160405180910390fd5b565b73200e12d10bb0c5e4a17e7018f0f1161919bb93893b1580610b27575073200e12d10bb0c5e4a17e7018f0f1161919bb93893f7f1de7d717526cba131d684e312dedbf0852adef9cced9e36798ae4937f7145d4114155b15610ace576040516373e6d7b360e01b815273200e12d10bb0c5e4a17e7018f0f1161919bb93896004820152602401610119565b5f805f610b69868686610fbc565b9150915080610b945760405162bc8ecf60e31b81526004810187905260248101869052604401610119565b5090505b9392505050565b60405163095ea7b360e01b5f8181526001600160a01b038616600452602485905291602083604481808b5af1925060015f51148316610bf5578383151615610be9573d5f823e3d81fd5b5f873b113d1516831692505b60405250949350505050565b61071b838383600161112e565b5f805f805f610c1d8787611178565b9250925092505f80610c2f85856111d4565b9150915081838015610c3e5750815b9650965050505050505b9250929050565b80471015610c795760405163cf47918160e01b815247600482015260248101829052604401610119565b610c92828260405180602001604052805f81525061141d565b15610c9b575050565b3d15610cad57610ca9611432565b5050565b60405163d6bda27560e01b815260040160405180910390fd5b60408051600680825260e082019092525f91816020015b6060815260200190600190039081610cdd5790505090505f5b8351811015610d3e57838181518110610d1157610d116129ab565b6020026020010151828281518110610d2b57610d2b6129ab565b6020908102919091010152600101610cf6565b50335f8181523060209081526040808320815160a0810183528083018581526060808301879052608083018190529082528185015282518581529384018581528484019093529093909291905b8751811015610f0357878181518110610da657610da66129ab565b602002602001015193505f845f015160400151511115610efb575f845f01515f01516001600160a01b031663d04dfe236040518060e00160405280885f0151602001516001600160a01b03168152602001898152602001885f01516040015181526020015f8152602001610e1e8c8a6020015161143d565b8152602001878152602001868152506040518263ffffffff1660e01b8152600401610e499190612bbb565b5f60405180830381865afa158015610e63573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610e8a9190810190612cb3565b9150505f81511115610ef95784516020015160405163012c676d60e21b81526001600160a01b03909116906304b19db490610ecb908a908590600401612d5f565b5f604051808303815f87803b158015610ee2575f80fd5b505af1158015610ef4573d5f803e3d5ffd5b505050505b505b600101610d8b565b505050505050505050565b606081471015610f3a5760405163cf47918160e01b815247600482015260248101839052604401610119565b5f610f4685848661141d565b9050808015610f6757505f3d1180610f6757505f856001600160a01b03163b115b15610f7c57610f7461171f565b915050610b98565b8015610fa657604051639996b31560e01b81526001600160a01b0386166004820152602401610119565b3d15610cad57610fb4611432565b509392505050565b5f805f851215610fe957604051634a7d166b60e01b81526004810186905260248101859052604401610119565b845f03610ffb57505f90506001611126565b8460ff84168501858112156110365760405163c849483b60e01b8152600481018890526024810187905260ff86166044820152606401610119565b5f805f83121561108257604c19831215611059575f809550955050505050611126565b825f03600a0a915081848161107057611070612d7f565b04955050840290911491506111269050565b5f83131561111b57604d8313156110bf5760405163c849483b60e01b8152600481018a90526024810189905260ff88166044820152606401610119565b82600a0a9150815f19816110d5576110d5612d7f565b048411156111095760405163c849483b60e01b8152600481018a90526024810189905260ff88166044820152606401610119565b50919091029250600191506111269050565b509193506001925050505b935093915050565b60405163a9059cbb60e01b5f8181526001600160a01b038616600452602485905291602083604481808b5af1925060015f51148316610bf5578383151615610be9573d5f823e3d81fd5b5f808060ff841681037f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8611156111c357600a860460018201600a88065f14935093509350506111cd565b8593509150600190505b9250925092565b5f808383601b82900b82148061130a577d90e40fbeea1d3a4abc8955e946fe31cdcf66f634e1000000000000000000870515611255577f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee8000000000000000000870515611246576305f5e10087059650600886019550611255565b620186a0870596506005860195505b8687601b0b1461127057600a87059650856001019550611255565b7b0ccccccccccccccccccccccccccccccccccccccccccccccccccccccc7b1999999999999999999999999999999999999999999999999999999888820111611304575f600188039050808160030b036113025760e01b6001600160e01b037b7fffffffffffffffffffffffffffffffffffffffffffffffffffffff60ff8b901d18161795505f9450610c489350505050565b505b50611321565b865f0361132157505f935060019250610c48915050565b858660030b146113d8575f8213156113805761133d8383611738565b156113655760405163d556b11160e01b81526004810184905260248101839052604401610119565b637ffffffe19909501600a0a82029550637fffffff946113d8565b637fffffff1986900360438113156113a257505f9450849350610c4892505050565b80600a0a88816113b4576113b4612d7f565b059750875f036113ce57505f9450849350610c4892505050565b50637fffffff1995505b8186136113e85760019350611401565b818603600a0a83816113fc576113fc612d7f565b071593505b5050506001600160e01b03841660e084901b1791509250929050565b5f805f83516020850186885af1949350505050565b6040513d5f823e3d81fd5b60605f825167ffffffffffffffff81111561145a5761145a611b7b565b604051908082528060200260200182016040528015611483578160200160208202803683370190505b5090505f80845111611495575f61149b565b83516001015b85516001010190505f8167ffffffffffffffff8111156114bd576114bd611b7b565b6040519080825280602002602001820160405280156114f057816020015b60608152602001906001900390816114db5790505b5090505f611514604080516002815233602082015230818301526060810190915290565b828281518110611526576115266129ab565b60200260200101819052505f5b8751811015611583578180600101925050878181518110611556576115566129ab565b6020026020010151838381518110611570576115706129ab565b6020908102919091010152600101611533565b50855115611715578080600101915050838282815181106115a6576115a66129ab565b60200260200101819052505f5b8651811015611713576116628782815181106115d1576115d16129ab565b60200260200101515f015161163f61160d8a85815181106115f4576115f46129ab565b6020026020010151602001518051602090810291012090565b7f19457468657265756d205369676e6564204d6573736167653a0a3332000000005f908152601c91909152603c902090565b898481518110611651576116516129ab565b602002602001015160400151611753565b61168257604051630a57f30960e31b815260048101829052602401610119565b868181518110611694576116946129ab565b60200260200101515f01516001600160a01b03165f1b8582815181106116bc576116bc6129ab565b60200260200101818152505081806001019250508681815181106116e2576116e26129ab565b602002602001015160200151838381518110611700576117006129ab565b60209081029190910101526001016115b3565b505b5095945050505050565b6040513d81523d5f602083013e3d602001810160405290565b5f610b985f8412611749578361174d565b835f035b836117c3565b5f836001600160a01b03163b5f036117b1575f806117718585611861565b5090925090505f81600381111561178a5761178a612d93565b1480156117a85750856001600160a01b0316826001600160a01b0316145b92505050610b98565b6117bc8484846118a7565b9050610b98565b5f637ffffff582136117d657505f6100e1565b637ffffffe19820160438113156117f15750508115156100e1565b5f81126118315780600a0a7b800000000000000000000000000000000000000000000000000000018161182657611826612d7f565b0484119150506100e1565b805f03600a0a7b800000000000000000000000000000000000000000000000000000020284101591505092915050565b5f805f8351604103611898576020840151604085015160608601515f1a61188a8882858561190c565b9550955095505050506111cd565b505081515f91506002906111cd565b805160408051630b135d3f60e11b8082526004820186905260248201929092525f92906020820185604483015e5f82606483010152601f820160051c60051b915060205f60648401838a5afa9050825f5114601f3d1116811693505050509392505050565b5f80807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a084111561194557505f915060039050826119ca565b604080515f808252602082018084528a905260ff891692820192909252606081018790526080810186905260019060a0016020604051602081039080840390855afa158015611996573d5f803e3d5ffd5b5050604051601f1901519150506001600160a01b0381166119c157505f9250600191508290506119ca565b92505f91508190505b9450945094915050565b5f602082840312156119e4575f80fd5b81356001600160e01b031981168114610b98575f80fd5b6001600160a01b0381168114610218575f80fd5b8035611a1a816119fb565b919050565b5f8083601f840112611a2f575f80fd5b50813567ffffffffffffffff811115611a46575f80fd5b602083019150836020828501011115610c48575f80fd5b5f805f805f8060a08789031215611a72575f80fd5b8635611a7d816119fb565b95506020870135611a8d816119fb565b94506040870135935060608701359250608087013567ffffffffffffffff811115611ab6575f80fd5b611ac289828a01611a1f565b979a9699509497509295939492505050565b5f805f805f60808688031215611ae8575f80fd5b8535611af3816119fb565b9450602086013567ffffffffffffffff80821115611b0f575f80fd5b9087019060c0828a031215611b22575f80fd5b90945060408701359080821115611b37575f80fd5b611b4389838a01611a1f565b90955093506060880135915080821115611b5b575f80fd5b50860160408189031215611b6d575f80fd5b809150509295509295909350565b634e487b7160e01b5f52604160045260245ffd5b6040516060810167ffffffffffffffff81118282101715611bb257611bb2611b7b565b60405290565b6040805190810167ffffffffffffffff81118282101715611bb257611bb2611b7b565b6040516080810167ffffffffffffffff81118282101715611bb257611bb2611b7b565b60405160a0810167ffffffffffffffff81118282101715611bb257611bb2611b7b565b60405160c0810167ffffffffffffffff81118282101715611bb257611bb2611b7b565b604051601f8201601f1916810167ffffffffffffffff81118282101715611c6d57611c6d611b7b565b604052919050565b8015158114610218575f80fd5b8035611a1a81611c75565b5f67ffffffffffffffff821115611ca657611ca6611b7b565b5060051b60200190565b5f67ffffffffffffffff821115611cc957611cc9611b7b565b50601f01601f191660200190565b5f82601f830112611ce6575f80fd5b8135611cf9611cf482611cb0565b611c44565b818152846020838601011115611d0d575f80fd5b816020850160208301375f918101602001919091529392505050565b5f60608284031215611d39575f80fd5b611d41611b8f565b90508135611d4e816119fb565b81526020820135611d5e816119fb565b6020820152604082013567ffffffffffffffff811115611d7c575f80fd5b611d8884828501611cd7565b60408301525092915050565b5f82601f830112611da3575f80fd5b81356020611db3611cf483611c8d565b82815260069290921b84018101918181019086841115611dd1575f80fd5b8286015b84811015611e175760408189031215611dec575f80fd5b611df4611bb8565b8135611dff816119fb565b81528185013585820152835291830191604001611dd5565b509695505050505050565b5f82601f830112611e31575f80fd5b81356020611e41611cf483611c8d565b82815260059290921b84018101918181019086841115611e5f575f80fd5b8286015b84811015611e1757803567ffffffffffffffff80821115611e82575f80fd5b908801906060828b03601f19011215611e99575f80fd5b611ea1611b8f565b86830135611eae816119fb565b815260408381013583811115611ec2575f80fd5b8401603f81018d13611ed2575f80fd5b88810135611ee2611cf482611c8d565b81815260059190911b82018301908a8101908f831115611f00575f80fd5b928401925b82841015611f1e5783358252928b0192908b0190611f05565b858c0152505050606084013583811115611f36575f80fd5b611f448d8a83880101611cd7565b918301919091525085525050918301918301611e63565b5f82601f830112611f6a575f80fd5b81356020611f7a611cf483611c8d565b82815260059290921b84018101918181019086841115611f98575f80fd5b8286015b84811015611e1757803567ffffffffffffffff80821115611fbb575f80fd5b90880190601f196080838c0382011215611fd3575f80fd5b611fdb611bdb565b8784013583811115611feb575f80fd5b840160a0818e0384011215611ffe575f80fd5b612006611bfe565b9250612013898201611a0f565b8352604081013584811115612026575f80fd5b6120348e8b83850101611d29565b8a850152506060808201358581111561204b575f80fd5b6120598f8c83860101611d94565b604086015250608082013585811115612070575f80fd5b61207e8f8c83860101611d94565b828601525060a0820135608085015283835260408601358a84015280860135604084015260808601359350848411156120b5575f80fd5b6120c38e8b86890101611e22565b90830152508652505050918301918301611f9c565b5f80604083850312156120e9575f80fd5b823567ffffffffffffffff80821115612100575f80fd5b9084019060c08287031215612113575f80fd5b61211b611c21565b82358152602083013560208201526040830135604082015261213f60608401611c82565b6060820152608083013582811115612155575f80fd5b61216188828601611f5b565b60808301525060a083013582811115612178575f80fd5b61218488828601611cd7565b60a0830152509350602085013591508082111561219f575f80fd5b506121ac85828601611cd7565b9150509250929050565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b5f815180845260208085019450602084015f5b8381101561222757815180516001600160a01b0316885283015183880152604090960195908201906001016121f7565b509495945050505050565b5f815180845260208085019450602084015f5b8381101561222757815187529582019590820190600101612245565b5f82825180855260208086019550808260051b8401018186015f5b848110156122e457601f19868403018952815160606001600160a01b0382511685528582015181878701526122b382870182612232565b915050604080830151925085820381870152506122d081836121b6565b9a86019a945050509083019060010161227c565b5090979650505050505050565b5f602080835260e08301845182850152818501516040818187015280870151915060608281880152808801519250608083151560808901526080890151935060a060c060a08a01528585518088526101009750878b019150878160051b8c010189880197505f5b82811015612440578c820360ff190184528851805187845280516001600160a01b03908116898601528d82015188860189905280518216610120870152808f01519091166101408601528a015161016085018a90526123bb6101808601826121b6565b90508a820151607f19808784030160c08801526123d883836121e4565b92508b8401519150808784030160e0880152506123f582826121e4565b915050888201518d8601528d8301518e8601528a8301518b8601528983015192508481038a8601526124278184612261565b9b8e019b968e0196945050506001919091019050612358565b5060a08d01518c8203601f190160c08e0152995061245e818b6121b6565b9d9c50505050505050505050505050565b5f8060408385031215612480575f80fd5b505080516020909101519092909150565b5f604082360312156124a1575f80fd5b6124a9611bb8565b823567ffffffffffffffff808211156124c0575f80fd5b6124cc36838701611d29565b835260208501359150808211156124e1575f80fd5b506124ee36828601611e22565b60208301525092915050565b5f808335601e1984360301811261250f575f80fd5b83018035915067ffffffffffffffff821115612529575f80fd5b6020019150600581901b3603821315610c48575f80fd5b5f60208284031215612550575f80fd5b8135610b9881611c75565b5f808335601e19843603018112612570575f80fd5b830160208101925035905067ffffffffffffffff81111561258f575f80fd5b8060051b3603821315610c48575f80fd5b5f8235605e198336030181126125b4575f80fd5b90910192915050565b5f808335601e198436030181126125d2575f80fd5b830160208101925035905067ffffffffffffffff8111156125f1575f80fd5b803603821315610c48575f80fd5b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b5f808335601e1984360301811261263c575f80fd5b830160208101925035905067ffffffffffffffff81111561265b575f80fd5b8060061b3603821315610c48575f80fd5b8183525f60208085019450825f5b8581101561222757813561268d816119fb565b6001600160a01b0316875281830135838801526040968701969091019060010161267a565b8183526020808401935f91600585811b8301820185855b8881101561278b57858303601f19018a526126e482896125a0565b606081356126f1816119fb565b6001600160a01b031685526127088288018361255b565b82898801528083880152608092507f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811115612742575f80fd5b871b80828885013786019050604061275c848201856125bd565b945083888403018289015261277484840186836125ff565b9e8a019e97505050938701935050506001016126c9565b509098975050505050505050565b5f604080835261010080840187358386015260206060818a013581880152848a01356080880152808a01356127cd81611c75565b151560a08801526127e160808b018b61255b565b60c0898101529384905261012093848901600582901b8a018601835f5b8481101561295b578c830361011f19018452813536879003607e19018112612824575f80fd5b8601803536829003609e1901811261283a575f80fd5b608085528101803561284b816119fb565b6001600160a01b0380821660808801526128678c8401846125a0565b915060a080880152813561287a816119fb565b8116878e0152818c013561288d816119fb565b166101408701526128a0818f01826125bd565b91508a6101608801526128b8610180880183836125ff565b9150506128c78e830183612627565b607f19808985030160c08a01526128df84838561266c565b93506128ed8d860186612627565b93509150808985030160e08a01525061290783838361266c565b9250505060808201358d8701528a8301358b8701528d8301358e8701526129308a84018461255b565b935091508581038a8701526129468184846126b2565b968b01969550505091880191506001016127fe565b505061296a60a08f018f6125bd565b8c8303603f190160e08e015299509750612985818a8a6125ff565b98505050505050858403818701525050506129a18185876125ff565b9695505050505050565b634e487b7160e01b5f52603260045260245ffd5b5f8235607e198336030181126129d3575f80fd5b9190910192915050565b5f8235609e198336030181126129d3575f80fd5b5f808335601e19843603018112612a06575f80fd5b83018035915067ffffffffffffffff821115612a20575f80fd5b6020019150600681901b3603821315610c48575f80fd5b5f60208284031215612a47575f80fd5b8135610b98816119fb565b5f6001600160a01b038087168352808616602084015250836040830152608060608301526129a160808301846121b6565b5f60208284031215612a93575f80fd5b8151610b9881611c75565b5f60208284031215612aae575f80fd5b815160ff81168114610b98575f80fd5b5f60208284031215612ace575f80fd5b5051919050565b5f805f60608486031215612ae7575f80fd5b8351612af2816119fb565b6020850151909350612b03816119fb565b604085015190925067ffffffffffffffff811115612b1f575f80fd5b8401601f81018613612b2f575f80fd5b8051612b3d611cf482611cb0565b818152876020838501011115612b51575f80fd5b8160208401602083015e5f602083830101528093505050509250925092565b5f8282518085526020808601955060208260051b840101602086015f5b848110156122e457601f19868403018952612ba9838351612232565b98840198925090830190600101612b8d565b602081526001600160a01b038251166020820152602082015160408201525f604083015160e06060840152612bf46101008401826121b6565b9050606084015160808401526080840151601f19808584030160a0860152612c1c8383612b70565b925060a08601519150808584030160c0860152612c398383612232565b925060c08601519150808584030160e0860152506106c08282612232565b5f82601f830112612c66575f80fd5b81516020612c76611cf483611c8d565b8083825260208201915060208460051b870101935086841115612c97575f80fd5b602086015b84811015611e175780518352918301918301612c9c565b5f8060408385031215612cc4575f80fd5b825167ffffffffffffffff80821115612cdb575f80fd5b818501915085601f830112612cee575f80fd5b81516020612cfe611cf483611c8d565b82815260059290921b84018101918181019089841115612d1c575f80fd5b948201945b83861015612d3a57855182529482019490820190612d21565b91880151919650909350505080821115612d52575f80fd5b506121ac85828601612c57565b828152604060208201525f612d776040830184612232565b949350505050565b634e487b7160e01b5f52601260045260245ffd5b634e487b7160e01b5f52602160045260245ffd"; /// @dev What MUST already be on a network before this release can be /// broadcast there: an address, and the runtime code that belongs at it. /// `abi.encode`d as a `DeployDependency[]` because Solidity has no /// file-scope constant of dynamic array type. bytes constant DEPENDENCIES = - hex"0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000005280000000000000000000000000522a6b8d2cd1e44d53475516fd3c55bc29a0e865000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000051c26080806040526004361015610012575f80fd5b5f3560e01c90816301ffc9a714611792575080631f69cb751461155c5780632cb77e9f146115305780632fbc4ba0146113ce57806341d1514f146113975780635cffe9de1461123b578063607461191461109f578063613255ab1461101c57806369c728561461072b578063709fb8a5146104375780639235084d146103e3578063ac9650d814610295578063d7e442ec14610237578063d9d98ce4146101865763fa501182146100c1575f80fd5b34610182576101403660031901126101825767ffffffffffffffff600435818111610182576100f4903690600401611b44565b6024358281116101825761010c903690600401611b44565b60c0366043190112610182576101043583811161018257610131903690600401611cea565b90610124359384116101825761014e61015c943690600401611cea565b926101576126da565b612220565b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055005b5f80fd5b34610182576040366003190112610182576001600160a01b036101a7611816565b166040516370a0823160e01b8152306004820152602081602481855afa90811561022c575f916101fa575b50156101e25760206040515f8152f35b60249060405190633c5bf76960e21b82526004820152fd5b90506020813d602011610224575b81610215602093836119b3565b810103126101825751826101d2565b3d9150610208565b6040513d5f823e3d90fd5b346101825760203660031901126101825760043567ffffffffffffffff81116101825761028f61026e61015c9236906004016117e5565b91906102786126da565b6040519261028584611997565b5f84523691611dbe565b90612991565b34610182576020806003193601126101825760043567ffffffffffffffff8111610182576102c79036906004016117e5565b9190604051926102d684611997565b5f84528284016102e582611a97565b946102f360405196876119b3565b8286526102ff83611a97565b9361031186880195601f190186612204565b5f5b84811061037557604080518881528951818a018190525f92600582901b83018101918a918c9085015b8287106103495785850386f35b909192938280610365600193603f198a820301865288516118a2565b960192019601959291909261033c565b806103c4886103be61039160019560059d9c9d1b8701876120e4565b929089846040519586938585013782018381015f81528b519283915e015f838201520380845201826119b3565b30613a32565b6103ce828a611fca565b526103d98189611fca565b5001969596610313565b3461018257600319602036820112610182576004359067ffffffffffffffff82116101825760809082360301126101825761042260609160040161212c565b90604051921515835260208301526040820152f35b34610182576003196040368201126101825760043567ffffffffffffffff8082116101825760c08260040193833603011261018257602435908111610182576104849036906004016117e5565b61048f9291926126da565b6104c06104bb6104b66104af6104a58880612117565b60408101906120e4565b36916119d5565b6139c8565b613a1d565b801561071957600110156107075760248201926104dd8486611f27565b9050156106f55760448301936104f38587611f27565b9050156106e3576105596105219561054d6105186105118a80612117565b948a611f27565b9890928a611f27565b91909261053e60405196610534886118c6565b3388523690611a39565b9960209a8b8801523691611aaf565b60408501523691611aaf565b6060820152606484013560808201526105718161271c565b90815f525f865260405f209485541595866105b5575b878760017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055604051908152f35b6001905560a46001600160a01b03917f87491344dfbcf91f6cbbc610cbbeedc85313d37a02df0c93527f7ea5f8db717f83855116604051908152868b82015260606040820152806106096060820188612032565b0390a10191610618838a6120e4565b905061063b575b50505061062e9394955061274d565b8190838080808080610587565b6106486104af848b6120e4565b610651816147b9565b156106bc57509761068f7fd46c2c56b35c8210e9e712ec3f02242d5fc90187c0ac8ed80cc33626846ec369936106af9361062e999a9b5116926120e4565b92906040519384938452868c850152606060408501526060840191611d19565b0390a1859493878061061f565b886106df604051928392630c89984b60e31b8452600484015260248301906118a2565b0390fd5b60405163540e5f0b60e01b8152600490fd5b604051636c44ef8f60e01b8152600490fd5b604051633c8270bd60e21b8152600490fd5b604051632cff108b60e21b8152600490fd5b34610182576003196020368201126101825767ffffffffffffffff600435116101825760c09060043536030112610182576107646126da565b5f808061077960048035608481019101611e70565b90501561100a576024600435013592610791846127dd565b15610ff8576060806040516107a58161192e565b6107ad611ec5565b81525f60208201525f604082015201526107c5611ec5565b506108256108206107ff6107f56107ef6107e9608460043501600435600401611e70565b90611ef7565b80611f12565b6040810190611f27565b60206108186107e9608460043501600435600401611e70565b013591611f5d565b611d05565b936001600160a01b0361087461082061085b6108516107ef6107e9608460043501600435600401611e70565b6060810190611f27565b60406108186107e9608460043501600435600401611e70565b8160405197610882896118f6565b16875216602086015260408501526108a4608460043501600435600401611e70565b9490506001604051955f87520160051b85016040525f905f5b6108d1608460043501600435600401611e70565b9050811080610fe5575b15610e32576108f4608460043501600435600401611e70565b821015610e1e578160051b810135607e198236030181121561018257608081830136031261018257604051916109298361192e565b8181013567ffffffffffffffff81116101825761094b90369084840101611b44565b835280820160208181013590850152604080820135908501526060013567ffffffffffffffff8111610182576109849236920101611cea565b606082015280516001600160a01b036109a66040830151602085015190611fca565b5151166001600160a01b0385511614801590610dea575b610dd8576109d5602083015160408401519083612ed1565b6109de8161271c565b91825f525f60205260405f2054155f14610a42575051604080513381526001600160a01b039092166020830152810191909152600191907fb70c12fa453793fa6818ec07c91e74363a47aa6a6829dcd9533937fdf30314f390606090a15b016108bd565b9190610a73602084979597015160408501519060608601519060405192610a6884611997565b5f8452339186613102565b925f93610a8b60608201516044600435013590612800565b15610af257505051604080513381526001600160a01b03909216602083015281019190915260019291907fe3151dc8cb7a54ffc4baabd28c1f241c94d510b5e5b502491ac3cad6c16316d590606090a15b8115610aea575b5092610a3c565b905088610ae3565b610aff60408201516127dd565b158015610dc5575b15610b5c57505051604080513381526001600160a01b03909216602083015281019190915260019291907f500b713857325f9e6dcb52ae832eca9109d107ed1aae9cb4928b4c1e13f051aa90606090a1610adc565b9250925050600196959691610b75606460043501611fde565b15610d325796610be597610bf560408401516040880151610b968183613461565b15610d2a5750925b610bef848592610bd8610bd260608a01516001600160e01b03601b918660e01d92828816810b928260e01d9216900b613e72565b9061402d565b9d8e9260408d015161352c565b60408c0152613556565b99613556565b98610c008484613580565b610c0a84826135de565b60405192338452608060208501526060610c308451608080880152610100870190612032565b93602081015160a0870152604081015160c0870152015192607f198582030160e0860152835180825260208201906020808260051b8501019601925f5b828110610ccc57505050505092806001979695937f194f1feb3b4d7076a2c272e774e792e0c48bb8c7aa1a9a3671c1cd6da9e6b4c193610cc796604084015260608301520390a180858c5101808d5260051b8c0152613731565b610adc565b9091929396602080610d1d600193601f198782030189528b51906001600160a01b0382511681526040610d0c8584015160608785015260608401906120b1565b9201519060408184039101526118a2565b9901950193929101610c6d565b905092610b9e565b610be590610bf56060840151610bef610d70610bd260408801516001600160e01b0394601b90868360e01d9316820b91878260e01d9216900b613e72565b60408a0151610d7f8183613461565b15610dbd5750915b829c8d916060890151908116155f14610dae575060408801515b96879460408d015161352c565b610db89085613488565b610da1565b905091610d87565b50610dd3606082015161343e565b610b07565b60405163936bb5ad60e01b8152600490fd5b506001600160a01b03610e066060830151604085015190611fca565b5151166001600160a01b0360208601511614156109bd565b634e487b7160e01b5f52603260045260245ffd5b50919390610e44606460043501611fde565b15610fdf57835b6004356004013590610e5d8282613461565b610fc15750508490610e7d856001600160a01b0360208701511633612e68565b505060a46004350190610e95826004356004016120e4565b905015159081610fb9575b50610f18575b506001600160a01b03610ebc9293511633612827565b50505b8351811015610ee45780610ede610ed860019387611fca565b5161390a565b01610ebf565b5060409160017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f005582519182526020820152f35b90506001600160a01b03602084015116610f426001600160a01b03855116926004356004016120e4565b929091333b1561018257610f8a5f93604051958694859463691f9ed760e01b8652600486015260248501528960448501528a606485015260a0608485015260a4840191611d19565b038183335af190811561022c57859115610ea6579050610faa915061194a565b5f836001600160a01b03610ea6565b905088610ea0565b604492506040519163573b6f4160e01b835260048301526024820152fd5b84610e4b565b50610ff360408301516127dd565b6108db565b60405163315f9e2360e21b8152600490fd5b604051639c95219f60e01b8152600490fd5b3461018257602080600319360112610182576024816001600160a01b03611041611816565b16604051928380926370a0823160e01b82523060048301525afa90811561022c575f91611072575b50604051908152f35b90508181813d8311611098575b61108981836119b3565b81010312610182575182611069565b503d61107f565b34610182576110ad36611856565b6110b56126da565b6110c08486336127a9565b6110c9836127dd565b1561120e576110d9848633612b9b565b6110e38185613461565b15611208575082935b6110f885828833612e0a565b9690947f8045c25080b0868951141ed0a91720bcad09a8364a2b3109ee1fd49c1f0bc8b860c0611129898533612e68565b94906001600160a01b0360405192338452169a8b6020840152876040840152856060840152608083015260a0820152a1836111845760017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055005b6111fb9761028f9660ff946040519960078b5260208b015260408a01526060890152608088015260a08701521660c08501523360e0850152610100840193846040526111cf8561197a565b600785526111e061012082016121e8565b6111e985611fba565b526111f384611fba565b503691611dbe565b808080808080808061015c565b936110ec565b604051623a3a4d60e21b81523360048201526001600160a01b038616602482015260448101859052606490fd5b34610182576080366003190112610182576004356001600160a01b03908181168091036101825761126a61182c565b6044359167ffffffffffffffff916064358381116101825736602382011215610182578060040135938411610182573660248583010111610182576112f79560209216936112b9868587612d2b565b60405196879283926323e30c8b60e01b84523360048501528760248501528860448501525f606485015260a06084850152602460a485019201611d19565b03815f855af193841561022c575f94611363575b507f439148f0bbc682ca079e46d6e2c2f0c1e3b820f1a291b069d8882abf8cf18dd9840361134a5761133f93503091612da4565b602060405160018152f35b604051630b6c58a960e31b815260048101859052602490fd5b9093506020813d60201161138f575b8161137f602093836119b3565b810103126101825751928461130b565b3d9150611372565b346101825760603660031901126101825760206113c66113b5611816565b6113bd61182c565b60443591612b9b565b604051908152f35b34610182576113dc36611856565b839493926113e86126da565b6113f38486336127a9565b6113fc816127dd565b15611502578061141061145f928733612827565b9590967f7f9dfa19cf1cc2f806f2f860fbc9c056b601fb1afc0e9b843dfe5c63616268e660806040513381526001600160a01b0384169a8b60208301528560408301526060820152a1336128cd565b9590938261148d5760017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055005b6114f69661028f9560ff936040519860068a5260208a01526040890152606088015260808701521660a08501523360c085015260e0840193846040526114d28561197a565b600785526114e361010082016121e8565b6114ec85611faa565b526111f384611faa565b8080808080808061015c565b6040516306dde9c360e41b81523360048201526001600160a01b038616602482015260448101859052606490fd5b34610182576020366003190112610182576004355f525f6020526020600160405f205414604051908152f35b3461018257600319604036820112610182576004359067ffffffffffffffff808311610182578260040160a08436039384011261018257602435828111610182576115ab9036906004016117e5565b906115b46126da565b5f946001600160a01b0394856115c986611d05565b163303611770576115e26115dd3687611b44565b61271c565b91825f525f60205260405f2096600188541461162a575b60208960017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00556040519015158152f35b9091929394959697505f6001985560405191338352846020840152606060408401528161165689611842565b16606084015260248a013590606219018112156101825789019060a060808401528061168460048401611842565b1661010084015261169760248301611842565b1661012083015260448101356022198236030181121561018257019560246004880135970192871161018257863603831361018257602098608461175384936117127f09d18501db0080ca2d6cd7c17fa7255daff4b2d503ea93b76ff68b6752ea8e63976117639c6060610140890152610160880191611d19565b6117446117396117256044880185611d39565b605f198a8603810160a08c01529491611d6e565b926064870190611d39565b918784030160c0880152611d6e565b91013560e08301520390a161274d565b82808080808080806115f9565b60248661177c87611d05565b6040516335252be360e01b815291166004820152fd5b34610182576020366003190112610182576004359063ffffffff60e01b82168092036101825760209163e414309160e01b81149081156117d4575b5015158152f35b6301ffc9a760e01b149050836117cd565b9181601f840112156101825782359167ffffffffffffffff8311610182576020808501948460051b01011161018257565b600435906001600160a01b038216820361018257565b602435906001600160a01b038216820361018257565b35906001600160a01b038216820361018257565b906080600319830112610182576004356001600160a01b0381168103610182579160243591604435916064359067ffffffffffffffff82116101825761189e916004016117e5565b9091565b805180835260209291819084018484015e5f828201840152601f01601f1916010190565b60a0810190811067ffffffffffffffff8211176118e257604052565b634e487b7160e01b5f52604160045260245ffd5b6060810190811067ffffffffffffffff8211176118e257604052565b6040810190811067ffffffffffffffff8211176118e257604052565b6080810190811067ffffffffffffffff8211176118e257604052565b67ffffffffffffffff81116118e257604052565b60e0810190811067ffffffffffffffff8211176118e257604052565b610100810190811067ffffffffffffffff8211176118e257604052565b6020810190811067ffffffffffffffff8211176118e257604052565b90601f8019910116810190811067ffffffffffffffff8211176118e257604052565b92919267ffffffffffffffff82116118e257604051916119ff601f8201601f1916602001846119b3565b829481845281830111610182578281602093845f960137010152565b9080601f8301121561018257816020611a36933591016119d5565b90565b91906060838203126101825760405190611a52826118f6565b8193611a5d81611842565b8352611a6b60208201611842565b602084015260408101359167ffffffffffffffff831161018257604092611a929201611a1b565b910152565b67ffffffffffffffff81116118e25760051b60200190565b929192611abb82611a97565b604092611acb60405192836119b3565b819581835260208093019160061b84019381851161018257915b848310611af457505050505050565b8583830312610182578386918251611b0b81611912565b611b1486611842565b81528286013583820152815201920191611ae5565b9080601f8301121561018257816020611a3693359101611aaf565b91909160a0818403126101825760405190611b5e826118c6565b8193611b6982611842565b835267ffffffffffffffff9160208101358381116101825782611b8d918301611a39565b602085015260408101358381116101825782611baa918301611b29565b6040850152606081013592831161018257611bcb6080939284938301611b29565b60608501520135910152565b909291611be384611a97565b916040611bf360405194856119b3565b839580855260208095019160059160051b8401948086116101825784935b868510611c22575050505050505050565b67ffffffffffffffff90853582811161018257870190606082850312610182578451611c4d816118f6565b611c5683611842565b81528a83013584811161018257830185601f8201121561018257803590611c7c82611a97565b91611c89895193846119b3565b8083528d808401918b1b83010191888311610182578e809101915b838310611cda57509150508201528583013593841161018257611ccb858c95869501611a1b565b86820152815201940193611c11565b82358152918101918f9101611ca4565b9080601f8301121561018257816020611a3693359101611bd7565b356001600160a01b03811681036101825790565b908060209392818452848401375f828201840152601f01601f1916010190565b9035601e198236030181121561018257016020813591019167ffffffffffffffff8211610182578160061b3603831361018257565b9190808252602080920192915f905b828210611d8b575050505090565b909192936001906001600160a01b03611da387611842565b16815285830135838201526040908101950193920190611d7d565b90929192611dcb81611a97565b91604091611ddc60405194856119b3565b839581855260208095019160051b8301938185116101825783925b858410611e075750505050505050565b67ffffffffffffffff908435828111610182578601908382860312610182578351611e3181611912565b82358481116101825786611e46918501611a39565b81528983013593841161018257611e61868b95869501611cea565b83820152815201930192611df7565b903590601e1981360301821215610182570180359067ffffffffffffffff821161018257602001918160051b3603831361018257565b60405190611eb3826118f6565b60606040835f81525f60208201520152565b60405190611ed2826118c6565b5f608083828152611ee1611ea6565b6020820152606060408201526060808201520152565b9015610e1e57803590607e1981360301821215610182570190565b903590609e1981360301821215610182570190565b903590601e1981360301821215610182570180359067ffffffffffffffff821161018257602001918160061b3603831361018257565b9190811015610e1e5760061b0190565b805115610e1e5760200190565b805160011015610e1e5760400190565b805160021015610e1e5760600190565b805160031015610e1e5760800190565b805160041015610e1e5760a00190565b805160051015610e1e5760c00190565b8051821015610e1e5760209160051b010190565b3580151581036101825790565b9081518082526020808093019301915f5b82811061200a575050505090565b835180516001600160a01b031686528201518583015260409094019392810192600101611ffc565b906080806120a861209661208460406001600160a01b0380895116885260208901519060a060208a01528082511660a08a015260208201511660c08901520151606060e08801526101008701906118a2565b60408701518682036040880152611feb565b60608601518582036060870152611feb565b93015191015290565b9081518082526020808093019301915f5b8281106120d0575050505090565b8351855293810193928101926001016120c2565b903590601e1981360301821215610182570180359067ffffffffffffffff82116101825760200191813603831361018257565b903590605e1981360301821215610182570190565b6121436115dd61213c8380611f12565b3690611b44565b5f525f602052600160405f2054036121df5780612163816121cf93611f12565b6121c76121826121876020850135938460408701359384923690611b44565b612ed1565b61219f6121948580611f12565b946060810190611e70565b92906121bf604051966121b188611997565b5f88525f3681373690611b44565b933691611bd7565b923392613102565b6040810151606090910151600192565b505f905f905f90565b5f5b60e081106121f6575050565b6060828201526020016121ea565b5f5b82811061221257505050565b606082820152602001612206565b926001600160a01b038451166001600160a01b03835116146126c8576001600160a01b03612255606086015160643590611fca565b515116906040830151916001600160a01b036122746084358095611fca565b51511614801590612688575b610dd8576040850151906001600160a01b0361229f6044358094611fca565b5151166001600160a01b036122ba60643560608a0151611fca565b51511614612676576122cb8661271c565b805f525f60205260405f20541561262357506122e68461271c565b805f525f60205260405f2054156125cf57506123c992916123a3917f6fa7f4c28634b0a9d6831401c45ae468195fb63aed07308935c35374ff5d9e396040518061234e61234061012033845280602085015283018d612032565b82810360408401528a612032565b85606083015260643560808301528760a083015260a43560c083015260c43560e083015260e4356101008301520390a16001600160a01b038651166040519261239684611997565b5f8452606435908a613102565b936001600160a01b03865116604051926123bc84611997565b5f845260a4359086613102565b916123d760408201516127dd565b1580156125bb575b80156125a8575b8015612595575b61258357604051916123fe8361192e565b5f83525f60208401525f60408401525f606084015261241d84836147dd565b8452604084015261244361243183866147dd565b6020860152806060860152845161352c565b94612457602085015160408601519061352c565b936124618761343e565b8015612574575b6125625761252961255b957fd9fa84dd790c969daa5c33d8050dc06b4a9b59d5b42e2be5f5e8ae20447f618d9461250b6125609a60a0966124aa8a8851613580565b6124b88c6020890151613580565b6124c68a60408901516135de565b6124d48c60608901516135de565b6124dd8a61390a565b6124e68c61390a565b6001600160a01b0361250260c435926060606435910151611fca565b515116336128cd565b50506001600160a01b0361250260e43592606060a435910151611fca565b5050606060405191338352805160208401526020810151604084015260408101518284015201516080820152a1613731565b613731565b565b604051630d86822160e01b8152600490fd5b5061257e8561343e565b612468565b6040516321badf1f60e01b8152600490fd5b506125a3606084015161343e565b6123ed565b506125b6606082015161343e565b6123e6565b506125c960408401516127dd565b156123df565b9351604080513381526001600160a01b039092166020830152810194909452507fb70c12fa453793fa6818ec07c91e74363a47aa6a6829dcd9533937fdf30314f3945091925082915050606081015b0390a1565b9551604080513381526001600160a01b039092166020830152810196909652507fb70c12fa453793fa6818ec07c91e74363a47aa6a6829dcd9533937fdf30314f39493508392505060608201905061261e565b604051631cd2f1c760e21b8152600490fd5b506001600160a01b036126a2606085015160a43590611fca565b5151166001600160a01b036126be604088015160443590611fca565b5151161415612280565b604051630a98f1f360e21b8152600490fd5b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00600281541461270a5760029055565b604051633ee5aeb560e01b8152600490fd5b604051612747816127396020820194602086526040830190612032565b03601f1981018352826119b3565b51902090565b612560929161277861028f923390919060405192600284526020840152604083015260608201604052565b92604051936127868561197a565b60078552612796602086016121e8565b61279f85611f6d565b526111f384611f6d565b9091156127b4575050565b6040516305dbdfd960e41b81526001600160a01b03918216600482015291166024820152604490fd5b6127fc905f60e01d906001600160e01b038160e01d9116601b0b614840565b1290565b906127fc916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b6148c1565b92919261283382613b05565b9361283d8161343e565b6128bb5784816001600160e01b0361285c9360e01d9116601b0b614940565b9290809315612892575b50829081612876575b5050509190565b61288a926001600160a01b03309216612da4565b5f818161286f565b9092505f1981146128a757600101915f612866565b634e487b7160e01b5f52601160045260245ffd5b604051632eaefac360e21b8152600490fd5b939291936128da8361343e565b61297857846128f6576128ee939450612e68565b50505f905f90565b6001600160a01b039392919380911694855f52602060018152604092835f20961695865f528152825f20825f528152612933835f20549485613556565b9561293d8761343e565b612960575f97885260018252838820908852815282872091875252909320829055565b835163c5e12af560e01b815260048101889052602490fd5b60405163793a8f5560e01b815260048101849052602490fd5b6040805192936129a08461197a565b6007845260206129b18186016121e8565b5f5b84518110156129e657806129c960019287611fca565b516129d48289611fca565b526129df8188611fca565b50016129b3565b50925092939093335f52308352845f2092855191612a0383611912565b612a0b611ea6565b835260608281940152865193612a2085611997565b5f8552875190612a2f82611997565b5f82525f3681375f5b8151811015612b8f57612a4b8183611fca565b51908a8251015151612a62575b6001915001612a38565b8a89875f612a73828701518a613c40565b938651946001600160a01b0394828680895116968901511697015190835197612a9b8961195e565b88528d88015282870152828d87015260808601528c60a08601528860c086015251809263d04dfe2360e01b82528180612ad860049889830161304a565b03915afa948515612b855789915f96612b5f575b508551612afd575b50505050612a58565b5101511692833b1561018257612b2b935f92838f5180978195829463012c676d60e21b8452339084016136f0565b03925af1918215612b5557600192612b46575b808781612af4565b612b4f9061194a565b5f612b3e565b8b513d5f823e3d90fd5b612b7c9196503d805f833e612b7481836119b3565b810190612f06565b9050945f612aec565b8e513d5f823e3d90fd5b50505050505050509050565b8215612bd0576001600160a01b038091165f52600160205260405f2091165f5260205260405f20905f5260205260405f205490565b909150612bdc82613be4565b6001600160a01b03809316906040918251946370a0823160e01b86528416938460048701526020928387602481865afa968715612cf2575f97612cfc575b5083612c33612c2c83612c639a614a6c565b5090614280565b508651636eb1769f60e11b81526001600160a01b0390941660048501523060248501529297889081906044820190565b0381865afa968715612cf2575f97612cc1575b50612c2c612c8791611a3698614a6c565b50612c928183613461565b15612cb95750935b5f5260018252825f20905f528152815f20905f8052525f205490613556565b905093612c9a565b96508387813d8311612ceb575b612cd881836119b3565b8101031261018257955195612c2c612c76565b503d612cce565b85513d5f823e3d90fd5b96508387813d8311612d24575b612d1381836119b3565b810103126101825795519583612c1a565b503d612d09565b6040519263a9059cbb60e01b5f526001600160a01b0380931660045260245260205f60448180855af160015f5114811615612d85575b8360405215612d6f57505050565b635274afe760e01b835216600482015260249150fd5b6001811516612d9b57813b15153d151616612d61565b833d5f823e3d90fd5b9092604051936323b872dd60e01b5f526001600160a01b0393848092166004521660245260445260205f60648180855af160015f5114811615612df4575b836040525f60605215612d6f57505050565b6001811516612d9b57813b15153d151616612de2565b93929193612e178361343e565b6129785784612e2b576128ee939450612827565b6001600160a01b039392919380911694855f52602060018152604092835f20961695865f528152825f20825f528152612933835f2054948561352c565b90929192612e7581613b05565b93612e7f8161343e565b612ebf5784816001600160e01b03612e9e9360e01d9116601b0b614940565b50809281612ead575050509190565b6001600160a01b0361288a9316612d2b565b604051632d1671a360e11b8152600490fd5b91612efc906060612ef1936001600160a01b039485916040880151611fca565b515116940151611fca565b5151161461267657565b919060408382031261018257825167ffffffffffffffff908181116101825784019082601f83011215610182578151602092612f4182611a97565b91612f4f60405193846119b3565b808352848084019160051b830101918683116101825785809101915b838310612fde5750505050948281015191821161018257019180601f84011215610182578251612f9a81611a97565b93612fa860405195866119b3565b818552838086019260051b820101928311610182578301905b828210612fcf575050505090565b81518152908301908301612fc1565b8251815291810191869101612f6b565b90808251908181526020809101926020808460051b8301019501935f915b84831061301c5750505050505090565b909192939495848061303a600193601f198682030187528a516120b1565b980193019301919493929061300c565b91906020928381526001600160a01b0382511684820152838201516040820152613084604083015160e060608401526101008301906118a2565b90606083015160808201526130ab608084015192601f1993848483030160a0850152612fee565b9260a081015193838382030160c08401528680865192838152019501905f5b8181106130ee57505050611a3694955060c060e091015192828503019101526120b1565b8251875295880195918801916001016130ca565b949193613347919360c0915f6132ce6040928351946131208661195e565b613128611ec5565b86526020958487820152848682015260609781868a809401528260808201528660a0820152015261327e85519161315e8361197a565b6007835261316d8884016121e8565b8d6131778161271c565b9c896001600160a01b039e8f94859182865116908d5194600486528501528c840152168c82015233608082015260a081018a526131b386611f6d565b526131bd85611f6d565b5088516131c9816118f6565b6002815289368c8301376131dc86611f7a565b526131e685611f7a565b5060ff8a6132498b8501936132338761320c81613204858a51611fca565b515116613be4565b9751168861321b848951611fca565b5151168561322a858a51611fca565b51015191612b9b565b9661323f828751611fca565b5151169451611fca565b51015192169093929190604051946005865260208601526040850152606084015260808301525f60a083015260c08201604052565b61328782611f8a565b5261329181611f8a565b506132b58a8d8d60ff8a6132498d8501936132338761320c81613204858a51611fca565b6132be82611f9a565b526132c881611f9a565b50613c40565b95878a511697848b0191825191868184511693015116928a855230875285808620915101518651916132ff83611997565b86835287519561330e8761195e565b86528886015286850152848885015289608085015260a084015260c08301528351808098819463d04dfe2360e01b83526004830161304a565b03915afa968715613434575f945f98613412575b508451600281106133fb5750818386015195015161338161337b88611faa565b51611f9a565b5161338c8183613461565b156133f35750925b6133b68685919060405192600284526020840152604083015260608201604052565b6133bf88611f8a565b526133c987611f8a565b508251996133d68b61195e565b8a52890152870152850152608084015260a083015260c082015290565b905092613394565b602490835190630fbb8e5560e21b82526004820152fd5b90975061342a9194503d805f833e612b7481836119b3565b939093965f61335b565b50513d5f823e3d90fd5b61345d905f60e01d906001600160e01b038160e01d9116601b0b614840565b1390565b9061345d916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b6148c1565b6134af6001600160e01b0392838316601b0b9260e01d938160e01d9116601b0b8484614037565b90637ffffff582136134ff575b906134c691614280565b92909215806134f7575b6134d957505090565b6044925060405191638eba4d0760e01b835260048301526024820152fd5b5082156134d0565b6135098282614f20565b156134bc57604483856040519163d556b11160e01b835260048301526024820152fd5b611a3691610bd2916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b614486565b611a3691610bd2916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b61464a565b6135da91608081018261359c6135968351611faa565b51611faa565b526135d36135cd6001600160a01b038094515116936135c46135be8551611faa565b51611f6d565b51169251611faa565b51611f8a565b5191612e0a565b5050565b906080810191806135f26135968551611f9a565b526001600160a01b0380925151169161360e6135be8551611f9a565b511661361d6135cd8551611f9a565b5190816136b85761362d8361343e565b612978579183917f4cb6e22a3e7e651d7cf0376cff48f20f5007a54147777865be7f5f6c38c50f4a959361261e955f5260209060018252613683604094855f20835f528452855f20855f528452855f2054613556565b945f5260018252835f20905f528152825f20915f52525f20555b51604051918291338352604060208401526040830190612fee565b916136e9917f4cb6e22a3e7e651d7cf0376cff48f20f5007a54147777865be7f5f6c38c50f4a959361261e956128cd565b505061369d565b90604082019082526020606081936040838201528551809452019301915f5b82811061371d575050505090565b83518552938101939281019260010161370f565b60c0810151908151915f926138a5575b506137e66020918281510151926001600160a01b039081818187511696015116928660a082019485518252308452604097888320898686510151015160808601518b519161378e83611997565b8683528c519361379d85611997565b8785528d51966137ac8861195e565b8752898701528c86015260016060860152608085015260a084015260c08301528851808099819463d04dfe2360e01b83526004830161304a565b03915afa94851561389b57879561387d575b508451613809575b50505050505050565b81905101510151169051813b156138795791849184938361383e965180978195829463012c676d60e21b8452600484016136f0565b03925af19081156138705750613859575b8080808080613800565b613863829161194a565b61386d578061384f565b80fd5b513d84823e3d90fd5b8480fd5b6138929195503d8089833e612b7481836119b3565b9050935f6137f8565b86513d89823e3d90fd5b6001600160a01b03602080845101510151169060a083015190823b15610182576138e8925f928360405180968195829463012c676d60e21b8452600484016136f0565b03925af1801561022c57156137415761390291925061194a565b5f905f613741565b6080810161391b6135cd8251611f9a565b5191821561392857505050565b6139426135be6001600160a01b0380935151169351611f9a565b5116815f5260209160018352604092835f20835f528152835f20855f528152835f2054936001600160e01b03851661397d575b505050505050565b6139a1955f9284845260018152828420868552815282842091845252812055612e68565b5f808080613975565b81156139b4570490565b634e487b7160e01b5f52601260045260245ffd5b6040815110613a10576020810151908051603f1981019081116128a75760051c82116139fc5760016020920160051b010190565b5050604051613a0a81611997565b5f815290565b50604051613a0a81611997565b805115613a2d57602001515f1a90565b505f90565b905f8091602081519101845af48080613ab0575b15613a665750506040513d81523d5f602083013e60203d82010160405290565b15613a8d57604051639996b31560e01b81526001600160a01b039091166004820152602490fd5b3d15613a9e576040513d5f823e3d90fd5b60405163d6bda27560e01b8152600490fd5b503d151580613a465750813b1515613a46565b60041115613acd57565b634e487b7160e01b5f52602160045260245ffd5b602090939291936001600160a01b036040820195168152613b0183613ac3565b0152565b613b0d61500e565b6040805163b7bad1b160e01b81526001600160a01b0383166004820152909182826024815f73200e12d10bb0c5e4a17e7018f0f1161919bb93895af1928315613bdb575f925f94613ba6575b50613b6383613ac3565b600183141580613b94575b613b785750505090565b5163ee07877f60e01b81529182916106df919060048401613ae1565b50613b9e83613ac3565b821515613b6e565b90809450613bca9293503d8511613bd4575b613bc281836119b3565b810190614916565b919091925f613b59565b503d613bb8565b513d5f823e3d90fd5b613bec61500e565b60408051630782d7e160e01b81526001600160a01b03831660048201529091828260248173200e12d10bb0c5e4a17e7018f0f1161919bb93895afa928315613bdb575f925f94613ba65750613b6383613ac3565b90805191613c4d83611a97565b91613c68604094613c60865195866119b3565b808552611a97565b601f199460209186013686840137835183519095908015613e67576001613cbe9101965b6001978891010197613cb5613ca08a611a97565b99613cad86519b8c6119b3565b808b52611a97565b01848901612204565b85805f9684516002815233878201523086820152606081018652613ce18b611f6d565b52613ceb8a611f6d565b505f925b613e23575b5050508351613d07575b50505050505090565b85809598979692980181613d1b8289611fca565b52613d268188611fca565b505f925b613d39575b5085969750613cfe565b8451831015613e1e576001600160a01b03613db081613d588689611fca565b51511686613d66878a611fca565b51015187815160051b9101207f19457468657265756d205369676e6564204d6573736167653a0a3332000000005f52601c52603c5f208c613da7888b611fca565b51015191614a9a565b15613e0657868098999a928192613dc7878a611fca565b515116613dd48787611fca565b52019385613de28289611fca565b510151613def868c611fca565b52613dfa858b611fca565b50019290989796613d2a565b8951630a57f30960e31b815260048101859052602490fd5b613d2f565b9091968151881015613e5e578280910197613e3e8184611fca565b51613e498a8d611fca565b52613e54898c611fca565b5001919081613cef565b96829150613cf4565b50613cbe5f96613c8c565b9091939284158215175f14613e8c5750505090505f905f90565b82810192600160fd1b8082019083011760fe1c613fc3575b5050613eaf81614be5565b93613eb981614be5565b94613ec48682614c05565b90918215613fb4575f9083986f0785ee10d5da46d900f436a000000000808611613fa6575b50670de0b6b3a7640000808b11613f97575b50633b9aca00808b11613f88575b50612710808b11613f7a575b5098805b613f695750819061189e989982600a0a9109960195817fcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccd0a93838211900382610100031b9203901c170291614c18565b60019290920191600a900480613f19565b60049a04998a930192613f15565b600991939a049901915f613f09565b601291939a049901915f613efb565b85049950602592505f613ee9565b5092905061189e949550614c18565b5f82121561401757808413614009575b7f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb2841315613ea45790925061189e939491614b23565b90925061189e939491614b8a565b80841215613fd35790925061189e939491614b23565b6134c68282614280565b9290918061405d576044848460405191637a97930f60e01b835260048301526024820152fd5b90919280155f1461407257505050505f905f90565b61408b9361407f91614cd2565b92919490938492614cd2565b909391928461409988614be5565b916140a386614be5565b947f161bcca7119915b50764b4abe86529797775a5f171951000000000000000000094604c9186881061424a575b030191600160ff1b98838a018112155f14614217575050035b5f955f82128061420e575b6141f0575b5f8112806141de575b6141c05786820103966001600160ff1b03881490816141b6575b50806141ad575b806141a4575b61418657509061413a9291614e7e565b915f811361414d575b5061189e93614c18565b9091604c821361417b5761416491600a0a906139aa565b908115614171575f614143565b505050505f905f90565b50505050505f905f90565b876044916040519163d556b11160e01b835260048301526024820152fd5b505f851261412a565b50828414614124565b905088145f61411d565b604489836040519163d556b11160e01b835260048301526024820152fd5b50806001600160ff1b03018213614103565b95508087018613156142085786818703015b956140fa565b5f614202565b505f81136140f5565b89985090920390506001600160ff1b038190038701821361423b57018601946140ea565b5050505050505050505f905f90565b7f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee80000000000000000009650604b92506140d1565b81156139b4570590565b8082601b82810b8314614475577d90e40fbeea1d3a4abc8955e946fe31cdcf66f634e10000000000000000008405614421575b8380820b0361441057507b199999999999999999999999999999999999999999999999999999987b0ccccccccccccccccccccccccccccccccccccccccccccccccccccccc840111156143c1575b838060030b03614345575b8084136143295750506001600160e01b036001925b60e01b91161791565b8303600a0a80156139b4576001600160e01b0391071592614320565b92915f84131561439557509061435b8383614f20565b61437757637ffffffe1901600a0a810290637fffffff9261430b565b506044916040519163d556b11160e01b835260048301526024820152fd5b637fffffff19928303906043821361417b576143b491600a0a90614276565b918215614171579261430b565b5f198401808060030b146143d55750614300565b90506001600160e01b039293507b7fffffffffffffffffffffffffffffffffffffffffffffffffffffff915060e01b9260ff1d181617905f90565b600190940193600a909305926142b3565b937f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee8000000000000000000840515614462576305f5e100600894058094819201955b9150506142b3565b620186a06005940580948192019561445a565b508261430057505050505f90600190565b919291600160ff1b840161449e5761189e9350614f39565b9061189e935f039161464a565b919291600160ff1b91908015806146385750906144c791614cd2565b9490929091905f86858585828213801561462f575b614612575b505050508682841860ff1c94860391039081604c0381116145f75701600a0a8082059190846145dd575b505081019182821860ff1c11156145d557826001600160ff1b03146145b757905f600192135f1461458857600a9004915b01925b8115811761454c57509190565b80614565575b50801561455d579190565b505f91508190565b919261457b9203600160ff1b01600a0a90614276565b600160ff1b91905f614552565b600a60037fe666666666666666666666666666666666666666666666666666666666666667920104019161453c565b604490836040519163d556b11160e01b835260048301526024820152fd5b50909261453f565b81076145ea575b8061450b565b60ff1d600117015f6145e4565b505050919350614605579190565b60018160ff1d1790039190565b5f9a50909750909550600160ff1b945092509050868080806144e1565b50835f126144dc565b156146435750509190565b9350919050565b939291938415811581811761479b5750509061466591614cd2565b919490829561467682958294614cd2565b8096929491969387868482138015614792575b614779575b5050505050508682841860ff1c94860391039081604c0381116145f75701600a0a80820591908461475f575b505081019182821860ff1c111561475757826001600160ff1b03146145b757905f600192135f1461472857600a9004915b01925b811581176146fb57509190565b8061470b5750801561455d579190565b600160ff1b936147229291038401600a0a90614276565b5f614552565b600a60037fe66666666666666666666666666666666666666666666666666666666666666792010401916146eb565b5090926146ee565b810761476c575b806146ba565b60ff1d600117015f614766565b929b5098509196509450925090505f808080808061468e565b50858412614689565b93959390929190156147b157505061455d579190565b945092915050565b6008815110613a2d576008015167ffffffffffffffff1667ff0a89c674ee78741490565b9160408301926040614817610bd2606087519401938451906001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b613e72565b94519301614826815186612800565b61482e575050565b909350611a3691925051925183613488565b92915f9060018184145f871287151717176148ba575f928082136148ac575b03604c81135f8212176148a057600a0a908461487e8382029384614276565b146148935750501561488f575f9190565b5f90565b9093509015611a36579190565b50501561488f575f9190565b5f956001945092509061485f565b5050505f90565b93929190918083145f83125f87121883158715171717614910575f928082136149035703604c81135f8212176148a057600a0a908461487e8382029384614276565b919460019350919061485f565b50919050565b919082604091031261018257815160048110156101825760209092015160ff811681036101825790565b91925f831215614968576044838360405191634a7d166b60e01b835260048301526024820152fd5b91928361497a57505090505f90600190565b60ff8116820191808312614a42575f8312156149b2575050604c19811261455d575f03600a0a916149ab83826139aa565b9283021490565b909293915f81135f14614a3857604d8113614a0d57600a0a9283156139b457835f190483116149e45750500290600190565b60405163c849483b60e01b815260048101849052602481019290925260ff166044820152606490fd5b5060405163c849483b60e01b81526004810192909252602482015260ff919091166044820152606490fd5b5050905090600190565b60405163c849483b60e01b815260048101869052602481019190915260ff82166044820152606490fd5b9060ff165f03916001600160ff1b0382115f14614a9257600a6001818404940192061590565b909190600190565b9091813b614ad557614aac9192615077565b50614ab681613ac3565b159182614ac257505090565b6001600160a01b03918216911614919050565b6020918160645f935160405192630b135d3f60e11b9788855260048501526040602485015286820190604485015e8281018201859052601f01601f191601915afa905f5114601f3d11161690565b909392915f614b33918184613e72565b9490945f8483019182019412159081614b80575b8115614b76575b50614b5857505090565b604492506040519163d556b11160e01b835260048301526024820152fd5b905083125f614b4e565b8281129150614b47565b614b9f93600160fe1b90810193920190613e72565b9081815f821215614bd6575050604b1982126128ee57614bc4915f03600a0a90614276565b9081614bce575f90565b600160ff1b90565b93600160ff1b90910192509050565b5f811215611a3657600160ff1b90808203614bfe575090565b90505f0390565b905f198183099102908180821091030391565b92939291905f8184181215614cad576001600160ff1b039283831115614c9757600160ff1b93838503614c4d57505050509190565b90919293508514614c67575050600a600191045f03920190565b604051630ed8062160e21b8152600481019190915260248101919091526044810182905260648101849052608490fd5b5090915050600160ff1b81146128a7575f039190565b90916001600160ff1b038084111561286f578514614c67575050600a60019104920190565b9190918015614e7457827f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee800000000000000000080830515614d82575b507f19999999999999999999999999999999999999999999999999999999999999997f0ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc830110614d73575b8313614d5d5791905f90565b919060018060ff1b926001600160ff1b03030190565b9290600a02905f190192614d51565b6f4b3b4ca85a86c47a098a22400000000080840515614e62575b507728c87cb5c89a2571ebfdcb54864ada834a00000000000000830515614e4b575b7b097edd871cfda3a5697758bf0e3cbb5ac5741c640000000000000000830515614e37575b7e3899162693736ac531a5a58f1fbb4b746504382ca7e4000000000000000000830515614e2757820515614e18575b5f614d06565b9290600a02905f190192614e12565b9391606402916001190193614de3565b93916402540be40002916009190193614de3565b9391678ac7230489e8000002916012190193614dbe565b6025198301955092909202915f614d9c565b505f915081908190565b90915f198383099280830292838086109503948086039584871015614efc5714614ef4579082910960018219018216809204600280826003021880830282030280830282030280830282030280830282030280830282030280920290030293600183805f03040190848311900302920304170290565b505091500490565b60648386866040519263362ced0960e11b8452600484015260248301526044820152fd5b611a3691905f811215614f34575f036150b1565b6150b1565b909291600160ff1b91828101614fcb5750808414614fc157808413918215614fb9578185035b604c811115614fa85750505f915b15614f9957507f8000000000000000000000000000000000000000000000000000000000000001019190565b92506001600160ff1b03039190565b600a0a9081156139b4570491614f6d565b848203614f5f565b505090505f905f90565b93614fd892945f036144ab565b80939180928114614fec575b50505f039190565b915092506001600160ff1b0383146145b757600a600191059201915f80614fe4565b73200e12d10bb0c5e4a17e7018f0f1161919bb9389803b15801561504c575b6150345750565b602490604051906373e6d7b360e01b82526004820152fd5b507f1de7d717526cba131d684e312dedbf0852adef9cced9e36798ae4937f7145d41813f141561502d565b81519190604183036150a7576150a09250602082015190606060408401519301515f1a90615140565b9192909190565b50505f9160029190565b90637ffffff581131561513a57637ffffffe1981019060438213615133575f82121561510757637fffffff91505f0301600a0a7b8000000000000000000000000000000000000000000000000000000202111590565b50600a0a80156139b4577b80000000000000000000000000000000000000000000000000000001041090565b5050151590565b50505f90565b91907f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a084116151b7579160209360809260ff5f9560405194855216868401526040830152606082015282805260015afa1561022c575f516001600160a01b038116156151ad57905f905f90565b505f906001905f90565b5050505f916003919056000000000000000000000000000000000000000000000000000000000000000000000000000000000000200e12d10bb0c5e4a17e7018f0f1161919bb93890000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000044b608060405234801561000f575f80fd5b506004361061004a575f3560e01c80630782d7e11461004e57806354636d2b14610078578063b7bad1b11461009d578063f5c36eaf146100b0575b5f80fd5b61006161005c366004610363565b6100c3565b60405161006f929190610403565b60405180910390f35b61008b610086366004610363565b6100d8565b60405160ff909116815260200161006f565b6100616100ab366004610363565b6100e9565b61008b6100be366004610363565b6100f5565b5f806100cf5f84610100565b91509150915091565b5f6100e35f836101f0565b92915050565b5f806100cf5f84610281565b5f6100e35f83610356565b73ffffffffffffffffffffffffffffffffffffffff81165f9081526020838152604080832081518083019092525460ff8082161515835261010090910416818301527f313ce56700000000000000000000000000000000000000000000000000000000808452839283908190816004818a5afa915060203d1015610182575f91505b811561019857505f5160ff811115610198575f91505b816101af57505050602001516003925090506101e9565b83516101c3575f955093506101e992505050565b836020015160ff1681146101d85760026101db565b60015b846020015195509550505050505b9250929050565b5f805f6101fd8585610281565b909250905060018260038111156102165761021661039d565b1415801561023557505f8260038111156102325761023261039d565b14155b156102795783826040517fee07877f000000000000000000000000000000000000000000000000000000008152600401610270929190610421565b60405180910390fd5b949350505050565b5f805f8061028f8686610100565b90925090505f8260038111156102a7576102a761039d565b0361034b576040805180820182526001815260ff838116602080840191825273ffffffffffffffffffffffffffffffffffffffff8a165f908152908b9052939093209151825493517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00009094169015157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff161761010093909116929092029190911790555b909590945092505050565b5f805f6101fd8585610100565b5f60208284031215610373575f80fd5b813573ffffffffffffffffffffffffffffffffffffffff81168114610396575f80fd5b9392505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b600481106103ff577f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b9052565b6040810161041182856103ca565b60ff831660208301529392505050565b73ffffffffffffffffffffffffffffffffffffffff831681526040810161039660208301846103ca56000000000000000000000000000000000000000000"; + hex"000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000526000000000000000000000000050ad4ff129155d8f584deda447b11b4f5138840d000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000051b66080806040526004361015610012575f80fd5b5f3560e01c90816301ffc9a714611792575080631f69cb751461155c5780632cb77e9f146115305780632fbc4ba0146113ce57806341d1514f146113975780635cffe9de1461123b578063607461191461109f578063613255ab1461101c57806369c728561461072b578063709fb8a5146104375780639235084d146103e3578063ac9650d814610295578063d7e442ec14610237578063d9d98ce4146101865763fa501182146100c1575f80fd5b34610182576101403660031901126101825767ffffffffffffffff600435818111610182576100f4903690600401611b27565b6024358281116101825761010c903690600401611b27565b60c0366043190112610182576101043583811161018257610131903690600401611ccd565b90610124359384116101825761014e61015c943690600401611ccd565b926101576126bd565b612203565b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055005b5f80fd5b34610182576040366003190112610182576001600160a01b036101a7611816565b166040516370a0823160e01b8152306004820152602081602481855afa90811561022c575f916101fa575b50156101e25760206040515f8152f35b60249060405190633c5bf76960e21b82526004820152fd5b90506020813d602011610224575b8161021560209383611996565b810103126101825751826101d2565b3d9150610208565b6040513d5f823e3d90fd5b346101825760203660031901126101825760043567ffffffffffffffff81116101825761028f61026e61015c9236906004016117e5565b91906102786126bd565b604051926102858461197a565b5f84523691611da1565b90612bb1565b34610182576020806003193601126101825760043567ffffffffffffffff8111610182576102c79036906004016117e5565b9190604051926102d68461197a565b5f84528284016102e582611a7a565b946102f36040519687611996565b8286526102ff83611a7a565b9361031186880195601f1901866121e7565b5f5b84811061037557604080518881528951818a018190525f92600582901b83018101918a918c9085015b8287106103495785850386f35b909192938280610365600193603f198a820301865288516118a2565b960192019601959291909261033c565b806103c4886103be61039160019560059d9c9d1b8701876120c7565b929089846040519586938585013782018381015f81528b519283915e015f83820152038084520182611996565b30613a26565b6103ce828a611fad565b526103d98189611fad565b5001969596610313565b3461018257600319602036820112610182576004359067ffffffffffffffff82116101825760809082360301126101825761042260609160040161210f565b90604051921515835260208301526040820152f35b34610182576003196040368201126101825760043567ffffffffffffffff8082116101825760c08260040193833603011261018257602435908111610182576104849036906004016117e5565b61048f9291926126bd565b6104c06104bb6104b66104af6104a588806120fa565b60408101906120c7565b36916119b8565b6139bc565b613a11565b801561071957600110156107075760248201926104dd8486611f0a565b9050156106f55760448301936104f38587611f0a565b9050156106e3576105596105219561054d6105186105118a806120fa565b948a611f0a565b9890928a611f0a565b91909261053e60405196610534886118c6565b3388523690611a1c565b9960209a8b8801523691611a92565b60408501523691611a92565b606082015260648401356080820152610571816126ff565b90815f525f865260405f209485541595866105b5575b878760017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055604051908152f35b6001905560a46001600160a01b03917f87491344dfbcf91f6cbbc610cbbeedc85313d37a02df0c93527f7ea5f8db717f83855116604051908152868b82015260606040820152806106096060820188612015565b0390a10191610618838a6120c7565b905061063b575b50505061062e93949550612730565b8190838080808080610587565b6106486104af848b6120c7565b610651816147ad565b156106bc57509761068f7fd46c2c56b35c8210e9e712ec3f02242d5fc90187c0ac8ed80cc33626846ec369936106af9361062e999a9b5116926120c7565b92906040519384938452868c850152606060408501526060840191611cfc565b0390a1859493878061061f565b886106df604051928392630c89984b60e31b8452600484015260248301906118a2565b0390fd5b60405163540e5f0b60e01b8152600490fd5b604051636c44ef8f60e01b8152600490fd5b604051633c8270bd60e21b8152600490fd5b604051632cff108b60e21b8152600490fd5b34610182576003196020368201126101825767ffffffffffffffff600435116101825760c09060043536030112610182576107646126bd565b5f808061077960048035608481019101611e53565b90501561100a576024600435013592610791846127c0565b15610ff8576060806040516107a58161192e565b6107ad611ea8565b81525f60208201525f604082015201526107c5611ea8565b506108256108206107ff6107f56107ef6107e9608460043501600435600401611e53565b90611eda565b80611ef5565b6040810190611f0a565b60206108186107e9608460043501600435600401611e53565b013591611f40565b611ce8565b936001600160a01b0361087461082061085b6108516107ef6107e9608460043501600435600401611e53565b6060810190611f0a565b60406108186107e9608460043501600435600401611e53565b8160405197610882896118f6565b16875216602086015260408501526108a4608460043501600435600401611e53565b9490506001604051955f87520160051b85016040525f905f5b6108d1608460043501600435600401611e53565b9050811080610fe5575b15610e32576108f4608460043501600435600401611e53565b821015610e1e578160051b810135607e198236030181121561018257608081830136031261018257604051916109298361192e565b8181013567ffffffffffffffff81116101825761094b90369084840101611b27565b835280820160208181013590850152604080820135908501526060013567ffffffffffffffff8111610182576109849236920101611ccd565b606082015280516001600160a01b036109a66040830151602085015190611fad565b5151166001600160a01b0385511614801590610dea575b610dd8576109d5602083015160408401519083613102565b6109de816126ff565b91825f525f60205260405f2054155f14610a42575051604080513381526001600160a01b039092166020830152810191909152600191907fb70c12fa453793fa6818ec07c91e74363a47aa6a6829dcd9533937fdf30314f390606090a15b016108bd565b9190610a73602084979597015160408501519060608601519060405192610a688461197a565b5f8452339186613137565b925f93610a8b606082015160446004350135906127e3565b15610af257505051604080513381526001600160a01b03909216602083015281019190915260019291907fe3151dc8cb7a54ffc4baabd28c1f241c94d510b5e5b502491ac3cad6c16316d590606090a15b8115610aea575b5092610a3c565b905088610ae3565b610aff60408201516127c0565b158015610dc5575b15610b5c57505051604080513381526001600160a01b03909216602083015281019190915260019291907f500b713857325f9e6dcb52ae832eca9109d107ed1aae9cb4928b4c1e13f051aa90606090a1610adc565b9250925050600196959691610b75606460043501611fc1565b15610d325796610be597610bf560408401516040880151610b968183613496565b15610d2a5750925b610bef848592610bd8610bd260608a01516001600160e01b03601b918660e01d92828816810b928260e01d9216900b613e66565b90614021565b9d8e9260408d0151613561565b60408c015261358b565b9961358b565b98610c0084846135b5565b610c0a8482613613565b60405192338452608060208501526060610c308451608080880152610100870190612015565b93602081015160a0870152604081015160c0870152015192607f198582030160e0860152835180825260208201906020808260051b8501019601925f5b828110610ccc57505050505092806001979695937f194f1feb3b4d7076a2c272e774e792e0c48bb8c7aa1a9a3671c1cd6da9e6b4c193610cc796604084015260608301520390a180858c5101808d5260051b8c0152613725565b610adc565b9091929396602080610d1d600193601f198782030189528b51906001600160a01b0382511681526040610d0c858401516060878501526060840190612094565b9201519060408184039101526118a2565b9901950193929101610c6d565b905092610b9e565b610be590610bf56060840151610bef610d70610bd260408801516001600160e01b0394601b90868360e01d9316820b91878260e01d9216900b613e66565b60408a0151610d7f8183613496565b15610dbd5750915b829c8d916060890151908116155f14610dae575060408801515b96879460408d0151613561565b610db890856134bd565b610da1565b905091610d87565b50610dd36060820151613473565b610b07565b60405163936bb5ad60e01b8152600490fd5b506001600160a01b03610e066060830151604085015190611fad565b5151166001600160a01b0360208601511614156109bd565b634e487b7160e01b5f52603260045260245ffd5b50919390610e44606460043501611fc1565b15610fdf57835b6004356004013590610e5d8282613496565b610fc15750508490610e7d856001600160a01b0360208701511633613099565b505060a46004350190610e95826004356004016120c7565b905015159081610fb9575b50610f18575b506001600160a01b03610ebc929351163361280a565b50505b8351811015610ee45780610ede610ed860019387611fad565b516138fe565b01610ebf565b5060409160017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f005582519182526020820152f35b90506001600160a01b03602084015116610f426001600160a01b03855116926004356004016120c7565b929091333b1561018257610f8a5f93604051958694859463691f9ed760e01b8652600486015260248501528960448501528a606485015260a0608485015260a4840191611cfc565b038183335af190811561022c57859115610ea6579050610faa915061194a565b5f836001600160a01b03610ea6565b905088610ea0565b604492506040519163573b6f4160e01b835260048301526024820152fd5b84610e4b565b50610ff360408301516127c0565b6108db565b60405163315f9e2360e21b8152600490fd5b604051639c95219f60e01b8152600490fd5b3461018257602080600319360112610182576024816001600160a01b03611041611816565b16604051928380926370a0823160e01b82523060048301525afa90811561022c575f91611072575b50604051908152f35b90508181813d8311611098575b6110898183611996565b81010312610182575182611069565b503d61107f565b34610182576110ad36611856565b6110b56126bd565b6110c084863361278c565b6110c9836127c0565b1561120e576110d9848633612dcc565b6110e38185613496565b15611208575082935b6110f88582883361303b565b9690947f8045c25080b0868951141ed0a91720bcad09a8364a2b3109ee1fd49c1f0bc8b860c0611129898533613099565b94906001600160a01b0360405192338452169a8b6020840152876040840152856060840152608083015260a0820152a1836111845760017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055005b6111fb9761028f9660ff946040519960078b5260208b015260408a01526060890152608088015260a08701521660c08501523360e0850152610100840193846040526111cf8561195e565b600685526111e061012082016121cb565b6111e985611f9d565b526111f384611f9d565b503691611da1565b808080808080808061015c565b936110ec565b604051623a3a4d60e21b81523360048201526001600160a01b038616602482015260448101859052606490fd5b34610182576080366003190112610182576004356001600160a01b03908181168091036101825761126a61182c565b6044359167ffffffffffffffff916064358381116101825736602382011215610182578060040135938411610182573660248583010111610182576112f79560209216936112b9868587612f5c565b60405196879283926323e30c8b60e01b84523360048501528760248501528860448501525f606485015260a06084850152602460a485019201611cfc565b03815f855af193841561022c575f94611363575b507f439148f0bbc682ca079e46d6e2c2f0c1e3b820f1a291b069d8882abf8cf18dd9840361134a5761133f93503091612fd5565b602060405160018152f35b604051630b6c58a960e31b815260048101859052602490fd5b9093506020813d60201161138f575b8161137f60209383611996565b810103126101825751928461130b565b3d9150611372565b346101825760603660031901126101825760206113c66113b5611816565b6113bd61182c565b60443591612dcc565b604051908152f35b34610182576113dc36611856565b839493926113e86126bd565b6113f384863361278c565b6113fc816127c0565b15611502578061141061145f92873361280a565b9590967f7f9dfa19cf1cc2f806f2f860fbc9c056b601fb1afc0e9b843dfe5c63616268e660806040513381526001600160a01b0384169a8b60208301528560408301526060820152a1336128b0565b9590938261148d5760017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055005b6114f69661028f9560ff936040519860068a5260208a01526040890152606088015260808701521660a08501523360c085015260e0840193846040526114d28561195e565b600685526114e361010082016121cb565b6114ec85611f8d565b526111f384611f8d565b8080808080808061015c565b6040516306dde9c360e41b81523360048201526001600160a01b038616602482015260448101859052606490fd5b34610182576020366003190112610182576004355f525f6020526020600160405f205414604051908152f35b3461018257600319604036820112610182576004359067ffffffffffffffff808311610182578260040160a08436039384011261018257602435828111610182576115ab9036906004016117e5565b906115b46126bd565b5f946001600160a01b0394856115c986611ce8565b163303611770576115e26115dd3687611b27565b6126ff565b91825f525f60205260405f2096600188541461162a575b60208960017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00556040519015158152f35b9091929394959697505f6001985560405191338352846020840152606060408401528161165689611842565b16606084015260248a013590606219018112156101825789019060a060808401528061168460048401611842565b1661010084015261169760248301611842565b1661012083015260448101356022198236030181121561018257019560246004880135970192871161018257863603831361018257602098608461175384936117127f09d18501db0080ca2d6cd7c17fa7255daff4b2d503ea93b76ff68b6752ea8e63976117639c6060610140890152610160880191611cfc565b6117446117396117256044880185611d1c565b605f198a8603810160a08c01529491611d51565b926064870190611d1c565b918784030160c0880152611d51565b91013560e08301520390a1612730565b82808080808080806115f9565b60248661177c87611ce8565b6040516335252be360e01b815291166004820152fd5b34610182576020366003190112610182576004359063ffffffff60e01b82168092036101825760209163e414309160e01b81149081156117d4575b5015158152f35b6301ffc9a760e01b149050836117cd565b9181601f840112156101825782359167ffffffffffffffff8311610182576020808501948460051b01011161018257565b600435906001600160a01b038216820361018257565b602435906001600160a01b038216820361018257565b35906001600160a01b038216820361018257565b906080600319830112610182576004356001600160a01b0381168103610182579160243591604435916064359067ffffffffffffffff82116101825761189e916004016117e5565b9091565b805180835260209291819084018484015e5f828201840152601f01601f1916010190565b60a0810190811067ffffffffffffffff8211176118e257604052565b634e487b7160e01b5f52604160045260245ffd5b6060810190811067ffffffffffffffff8211176118e257604052565b6040810190811067ffffffffffffffff8211176118e257604052565b6080810190811067ffffffffffffffff8211176118e257604052565b67ffffffffffffffff81116118e257604052565b60e0810190811067ffffffffffffffff8211176118e257604052565b6020810190811067ffffffffffffffff8211176118e257604052565b90601f8019910116810190811067ffffffffffffffff8211176118e257604052565b92919267ffffffffffffffff82116118e257604051916119e2601f8201601f191660200184611996565b829481845281830111610182578281602093845f960137010152565b9080601f8301121561018257816020611a19933591016119b8565b90565b91906060838203126101825760405190611a35826118f6565b8193611a4081611842565b8352611a4e60208201611842565b602084015260408101359167ffffffffffffffff831161018257604092611a7592016119fe565b910152565b67ffffffffffffffff81116118e25760051b60200190565b929192611a9e82611a7a565b604092611aae6040519283611996565b819581835260208093019160061b84019381851161018257915b848310611ad757505050505050565b8583830312610182578386918251611aee81611912565b611af786611842565b81528286013583820152815201920191611ac8565b9080601f8301121561018257816020611a1993359101611a92565b91909160a0818403126101825760405190611b41826118c6565b8193611b4c82611842565b835267ffffffffffffffff9160208101358381116101825782611b70918301611a1c565b602085015260408101358381116101825782611b8d918301611b0c565b6040850152606081013592831161018257611bae6080939284938301611b0c565b60608501520135910152565b909291611bc684611a7a565b916040611bd66040519485611996565b839580855260208095019160059160051b8401948086116101825784935b868510611c05575050505050505050565b67ffffffffffffffff90853582811161018257870190606082850312610182578451611c30816118f6565b611c3983611842565b81528a83013584811161018257830185601f8201121561018257803590611c5f82611a7a565b91611c6c89519384611996565b8083528d808401918b1b83010191888311610182578e809101915b838310611cbd57509150508201528583013593841161018257611cae858c958695016119fe565b86820152815201940193611bf4565b82358152918101918f9101611c87565b9080601f8301121561018257816020611a1993359101611bba565b356001600160a01b03811681036101825790565b908060209392818452848401375f828201840152601f01601f1916010190565b9035601e198236030181121561018257016020813591019167ffffffffffffffff8211610182578160061b3603831361018257565b9190808252602080920192915f905b828210611d6e575050505090565b909192936001906001600160a01b03611d8687611842565b16815285830135838201526040908101950193920190611d60565b90929192611dae81611a7a565b91604091611dbf6040519485611996565b839581855260208095019160051b8301938185116101825783925b858410611dea5750505050505050565b67ffffffffffffffff908435828111610182578601908382860312610182578351611e1481611912565b82358481116101825786611e29918501611a1c565b81528983013593841161018257611e44868b95869501611ccd565b83820152815201930192611dda565b903590601e1981360301821215610182570180359067ffffffffffffffff821161018257602001918160051b3603831361018257565b60405190611e96826118f6565b60606040835f81525f60208201520152565b60405190611eb5826118c6565b5f608083828152611ec4611e89565b6020820152606060408201526060808201520152565b9015610e1e57803590607e1981360301821215610182570190565b903590609e1981360301821215610182570190565b903590601e1981360301821215610182570180359067ffffffffffffffff821161018257602001918160061b3603831361018257565b9190811015610e1e5760061b0190565b805115610e1e5760200190565b805160011015610e1e5760400190565b805160021015610e1e5760600190565b805160031015610e1e5760800190565b805160041015610e1e5760a00190565b805160051015610e1e5760c00190565b8051821015610e1e5760209160051b010190565b3580151581036101825790565b9081518082526020808093019301915f5b828110611fed575050505090565b835180516001600160a01b031686528201518583015260409094019392810192600101611fdf565b9060808061208b61207961206760406001600160a01b0380895116885260208901519060a060208a01528082511660a08a015260208201511660c08901520151606060e08801526101008701906118a2565b60408701518682036040880152611fce565b60608601518582036060870152611fce565b93015191015290565b9081518082526020808093019301915f5b8281106120b3575050505090565b8351855293810193928101926001016120a5565b903590601e1981360301821215610182570180359067ffffffffffffffff82116101825760200191813603831361018257565b903590605e1981360301821215610182570190565b6121266115dd61211f8380611ef5565b3690611b27565b5f525f602052600160405f2054036121c25780612146816121b293611ef5565b6121aa61216561216a6020850135938460408701359384923690611b27565b613102565b6121826121778580611ef5565b946060810190611e53565b92906121a2604051966121948861197a565b5f88525f3681373690611b27565b933691611bba565b923392613137565b6040810151606090910151600192565b505f905f905f90565b5f5b60c081106121d9575050565b6060828201526020016121cd565b5f5b8281106121f557505050565b6060828201526020016121e9565b926001600160a01b038451166001600160a01b03835116146126ab576001600160a01b03612238606086015160643590611fad565b515116906040830151916001600160a01b036122576084358095611fad565b5151161480159061266b575b610dd8576040850151906001600160a01b036122826044358094611fad565b5151166001600160a01b0361229d60643560608a0151611fad565b51511614612659576122ae866126ff565b805f525f60205260405f20541561260657506122c9846126ff565b805f525f60205260405f2054156125b257506123ac9291612386917f6fa7f4c28634b0a9d6831401c45ae468195fb63aed07308935c35374ff5d9e396040518061233161232361012033845280602085015283018d612015565b82810360408401528a612015565b85606083015260643560808301528760a083015260a43560c083015260c43560e083015260e4356101008301520390a16001600160a01b03865116604051926123798461197a565b5f8452606435908a613137565b936001600160a01b038651166040519261239f8461197a565b5f845260a4359086613137565b916123ba60408201516127c0565b15801561259e575b801561258b575b8015612578575b61256657604051916123e18361192e565b5f83525f60208401525f60408401525f606084015261240084836147d1565b8452604084015261242661241483866147d1565b60208601528060608601528451613561565b9461243a6020850151604086015190613561565b9361244487613473565b8015612557575b6125455761250c61253e957fd9fa84dd790c969daa5c33d8050dc06b4a9b59d5b42e2be5f5e8ae20447f618d946124ee6125439a60a09661248d8a88516135b5565b61249b8c60208901516135b5565b6124a98a6040890151613613565b6124b78c6060890151613613565b6124c08a6138fe565b6124c98c6138fe565b6001600160a01b036124e560c435926060606435910151611fad565b515116336128b0565b50506001600160a01b036124e560e43592606060a435910151611fad565b5050606060405191338352805160208401526020810151604084015260408101518284015201516080820152a1613725565b613725565b565b604051630d86822160e01b8152600490fd5b5061256185613473565b61244b565b6040516321badf1f60e01b8152600490fd5b506125866060840151613473565b6123d0565b506125996060820151613473565b6123c9565b506125ac60408401516127c0565b156123c2565b9351604080513381526001600160a01b039092166020830152810194909452507fb70c12fa453793fa6818ec07c91e74363a47aa6a6829dcd9533937fdf30314f3945091925082915050606081015b0390a1565b9551604080513381526001600160a01b039092166020830152810196909652507fb70c12fa453793fa6818ec07c91e74363a47aa6a6829dcd9533937fdf30314f394935083925050606082019050612601565b604051631cd2f1c760e21b8152600490fd5b506001600160a01b03612685606085015160a43590611fad565b5151166001600160a01b036126a1604088015160443590611fad565b5151161415612263565b604051630a98f1f360e21b8152600490fd5b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0060028154146126ed5760029055565b604051633ee5aeb560e01b8152600490fd5b60405161272a8161271c6020820194602086526040830190612015565b03601f198101835282611996565b51902090565b612543929161275b61028f923390919060405192600284526020840152604083015260608201604052565b92604051936127698561195e565b60068552612779602086016121cb565b61278285611f50565b526111f384611f50565b909115612797575050565b6040516305dbdfd960e41b81526001600160a01b03918216600482015291166024820152604490fd5b6127df905f60e01d906001600160e01b038160e01d9116601b0b614834565b1290565b906127df916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b6148b5565b92919261281682613af9565b9361282081613473565b61289e5784816001600160e01b0361283f9360e01d9116601b0b614934565b9290809315612875575b50829081612859575b5050509190565b61286d926001600160a01b03309216612fd5565b5f8181612852565b9092505f19811461288a57600101915f612849565b634e487b7160e01b5f52601160045260245ffd5b604051632eaefac360e21b8152600490fd5b939291936128bd83613473565b61295b57846128d9576128d1939450613099565b50505f905f90565b6001600160a01b039392919380911694855f52602060018152604092835f20961695865f528152825f20825f528152612916835f2054948561358b565b9561292087613473565b612943575f97885260018252838820908852815282872091875252909320829055565b835163c5e12af560e01b815260048101889052602490fd5b60405163793a8f5560e01b815260048101849052602490fd5b919060408382031261018257825167ffffffffffffffff908181116101825784019082601f830112156101825781516020926129af82611a7a565b916129bd6040519384611996565b808352848084019160051b830101918683116101825785809101915b838310612a4c5750505050948281015191821161018257019180601f84011215610182578251612a0881611a7a565b93612a166040519586611996565b818552838086019260051b820101928311610182578301905b828210612a3d575050505090565b81518152908301908301612a2f565b82518152918101918691016129d9565b90808251908181526020809101926020808460051b8301019501935f915b848310612a8a5750505050505090565b9091929394958480612aa8600193601f198682030187528a51612094565b9801930193019194939290612a7a565b91906020928381526001600160a01b0382511684820152838201516040820152612af2604083015160e060608401526101008301906118a2565b9060608301516080820152612b19608084015192601f1993848483030160a0850152612a5c565b9260a081015193838382030160c08401528680865192838152019501905f5b818110612b5c57505050611a1994955060c060e09101519282850301910152612094565b825187529588019591880191600101612b38565b90604082019082526020606081936040838201528551809452019301915f5b828110612b9d575050505090565b835185529381019392810192600101612b8f565b919091604092835192612bc38461195e565b60068452602094612bd58686016121cb565b5f5b8451811015612c0a5780612bed60019287611fad565b51612bf88289611fad565b52612c038188611fad565b5001612bd7565b50925092939093335f52308252825f2091835195612c2787611912565b612c2f611e89565b875260608281980152845190612c448261197a565b5f8252855190612c538261197a565b5f82525f3681375f5b8151811015612dc057898688612c728486611fad565b51888151948d80870151908151612c94575b5050505050505050600101612c5c565b905f92916001600160a01b0396612cb98887818d51169c015116998789015190613bd8565b95825199612cc68b61195e565b8a5289015287015285015260808401528760a08401528660c08401525f8c51809563d04dfe2360e01b82528180612d01600498898301612ab8565b03915afa938415612db6579089915f95612d90575b508451612d2c575b50899250808e8c938e612c84565b5101511691823b1561018257612d5a925f92838d5180968195829463012c676d60e21b845233908401612b70565b03925af18015612d86579060019291612d77575b81928782612d1e565b612d809061194a565b5f612d6e565b89513d5f823e3d90fd5b612dad9195503d805f833e612da58183611996565b810190612974565b9050935f612d16565b8c513d5f823e3d90fd5b50505050505050509050565b8215612e01576001600160a01b038091165f52600160205260405f2091165f5260205260405f20905f5260205260405f205490565b909150612e0d82613e0a565b6001600160a01b03809316906040918251946370a0823160e01b86528416938460048701526020928387602481865afa968715612f23575f97612f2d575b5083612e64612e5d83612e949a614ae9565b5090614274565b508651636eb1769f60e11b81526001600160a01b0390941660048501523060248501529297889081906044820190565b0381865afa968715612f23575f97612ef2575b50612e5d612eb891611a1998614ae9565b50612ec38183613496565b15612eea5750935b5f5260018252825f20905f528152815f20905f8052525f20549061358b565b905093612ecb565b96508387813d8311612f1c575b612f098183611996565b8101031261018257955195612e5d612ea7565b503d612eff565b85513d5f823e3d90fd5b96508387813d8311612f55575b612f448183611996565b810103126101825795519583612e4b565b503d612f3a565b6040519263a9059cbb60e01b5f526001600160a01b0380931660045260245260205f60448180855af160015f5114811615612fb6575b8360405215612fa057505050565b635274afe760e01b835216600482015260249150fd5b6001811516612fcc57813b15153d151616612f92565b833d5f823e3d90fd5b9092604051936323b872dd60e01b5f526001600160a01b0393848092166004521660245260445260205f60648180855af160015f5114811615613025575b836040525f60605215612fa057505050565b6001811516612fcc57813b15153d151616613013565b9392919361304883613473565b61295b578461305c576128d193945061280a565b6001600160a01b039392919380911694855f52602060018152604092835f20961695865f528152825f20825f528152612916835f20549485613561565b909291926130a681613af9565b936130b081613473565b6130f05784816001600160e01b036130cf9360e01d9116601b0b614934565b508092816130de575050509190565b6001600160a01b0361286d9316612f5c565b604051632d1671a360e11b8152600490fd5b9161312d906060613122936001600160a01b039485916040880151611fad565b515116940151611fad565b5151161461265957565b94919361337c919360c0915f6133036040928351946131558661195e565b61315d611ea8565b86526020958487820152848682015260609781868a809401528260808201528660a082015201526132b38551916131938361195e565b600683526131a28884016121cb565b8d6131ac816126ff565b9c896001600160a01b039e8f94859182865116908d5194600486528501528c840152168c82015233608082015260a081018a526131e886611f50565b526131f285611f50565b5088516131fe816118f6565b6002815289368c83013761321186611f5d565b5261321b85611f5d565b5060ff8a61327e8b8501936132688761324181613239858a51611fad565b515116613e0a565b97511688613250848951611fad565b5151168561325f858a51611fad565b51015191612dcc565b96613274828751611fad565b5151169451611fad565b51015192169093929190604051946005865260208601526040850152606084015260808301525f60a083015260c08201604052565b6132bc82611f6d565b526132c681611f6d565b506132ea8a8d8d60ff8a61327e8d8501936132688761324181613239858a51611fad565b6132f382611f7d565b526132fd81611f7d565b50613bd8565b95878a511697848b0191825191868184511693015116928a855230875285808620915101518651916133348361197a565b8683528751956133438761195e565b86528886015286850152848885015289608085015260a084015260c08301528351808098819463d04dfe2360e01b835260048301612ab8565b03915afa968715613469575f945f98613447575b50845160028110613430575081838601519501516133b66133b088611f8d565b51611f7d565b516133c18183613496565b156134285750925b6133eb8685919060405192600284526020840152604083015260608201604052565b6133f488611f6d565b526133fe87611f6d565b5082519961340b8b61195e565b8a52890152870152850152608084015260a083015260c082015290565b9050926133c9565b602490835190630fbb8e5560e21b82526004820152fd5b90975061345f9194503d805f833e612da58183611996565b939093965f613390565b50513d5f823e3d90fd5b613492905f60e01d906001600160e01b038160e01d9116601b0b614834565b1390565b90613492916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b6148b5565b6134e46001600160e01b0392838316601b0b9260e01d938160e01d9116601b0b848461402b565b90637ffffff58213613534575b906134fb91614274565b929092158061352c575b61350e57505090565b6044925060405191638eba4d0760e01b835260048301526024820152fd5b508215613505565b61353e8282614f14565b156134f157604483856040519163d556b11160e01b835260048301526024820152fd5b611a1991610bd2916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b61447a565b611a1991610bd2916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b61463e565b61360f9160808101826135d16135cb8351611f8d565b51611f8d565b526136086136026001600160a01b038094515116936135f96135f38551611f8d565b51611f50565b51169251611f8d565b51611f6d565b519161303b565b5050565b906080810191806136276135cb8551611f7d565b526001600160a01b038092515116916136436135f38551611f7d565b51166136526136028551611f7d565b5190816136ed5761366283613473565b61295b579183917f4cb6e22a3e7e651d7cf0376cff48f20f5007a54147777865be7f5f6c38c50f4a9593612601955f52602090600182526136b8604094855f20835f528452855f20855f528452855f205461358b565b945f5260018252835f20905f528152825f20915f52525f20555b51604051918291338352604060208401526040830190612a5c565b9161371e917f4cb6e22a3e7e651d7cf0376cff48f20f5007a54147777865be7f5f6c38c50f4a9593612601956128b0565b50506136d2565b60c0810151908151915f92613899575b506137da6020918281510151926001600160a01b039081818187511696015116928660a082019485518252308452604097888320898686510151015160808601518b51916137828361197a565b8683528c51936137918561197a565b8785528d51966137a08861195e565b8752898701528c86015260016060860152608085015260a084015260c08301528851808099819463d04dfe2360e01b835260048301612ab8565b03915afa94851561388f578795613871575b5084516137fd575b50505050505050565b81905101510151169051813b1561386d57918491849383613832965180978195829463012c676d60e21b845260048401612b70565b03925af1908115613864575061384d575b80808080806137f4565b613857829161194a565b6138615780613843565b80fd5b513d84823e3d90fd5b8480fd5b6138869195503d8089833e612da58183611996565b9050935f6137ec565b86513d89823e3d90fd5b6001600160a01b03602080845101510151169060a083015190823b15610182576138dc925f928360405180968195829463012c676d60e21b845260048401612b70565b03925af1801561022c5715613735576138f691925061194a565b5f905f613735565b6080810161390f6136028251611f7d565b5191821561391c57505050565b6139366135f36001600160a01b0380935151169351611f7d565b5116815f5260209160018352604092835f20835f528152835f20855f528152835f2054936001600160e01b038516613971575b505050505050565b613995955f9284845260018152828420868552815282842091845252812055613099565b5f808080613969565b81156139a8570490565b634e487b7160e01b5f52601260045260245ffd5b6040815110613a04576020810151908051603f19810190811161288a5760051c82116139f05760016020920160051b010190565b50506040516139fe8161197a565b5f815290565b506040516139fe8161197a565b805115613a2157602001515f1a90565b505f90565b905f8091602081519101845af48080613aa4575b15613a5a5750506040513d81523d5f602083013e60203d82010160405290565b15613a8157604051639996b31560e01b81526001600160a01b039091166004820152602490fd5b3d15613a92576040513d5f823e3d90fd5b60405163d6bda27560e01b8152600490fd5b503d151580613a3a5750813b1515613a3a565b60041115613ac157565b634e487b7160e01b5f52602160045260245ffd5b602090939291936001600160a01b036040820195168152613af583613ab7565b0152565b613b01615002565b6040805163b7bad1b160e01b81526001600160a01b0383166004820152909182826024815f73200e12d10bb0c5e4a17e7018f0f1161919bb93895af1928315613bcf575f925f94613b9a575b50613b5783613ab7565b600183141580613b88575b613b6c5750505090565b5163ee07877f60e01b81529182916106df919060048401613ad5565b50613b9283613ab7565b821515613b62565b90809450613bbe9293503d8511613bc8575b613bb68183611996565b81019061490a565b919091925f613b4d565b503d613bac565b513d5f823e3d90fd5b90805191613be583611a7a565b91613c00604094613bf886519586611996565b808552611a7a565b601f199460209186013686840137835183519095908015613dff576001613c569101965b6001978891010197613c4d613c388a611a7a565b99613c4586519b8c611996565b808b52611a7a565b018489016121e7565b85805f9684516002815233878201523086820152606081018652613c798b611f50565b52613c838a611f50565b505f925b613dbb575b5050508351613c9f575b50505050505090565b85809598979692980181613cb38289611fad565b52613cbe8188611fad565b505f925b613cd1575b5085969750613c96565b8451831015613db6576001600160a01b03613d4881613cf08689611fad565b51511686613cfe878a611fad565b51015187815160051b9101207f19457468657265756d205369676e6564204d6573736167653a0a3332000000005f52601c52603c5f208c613d3f888b611fad565b51015191614a60565b15613d9e57868098999a928192613d5f878a611fad565b515116613d6c8787611fad565b52019385613d7a8289611fad565b510151613d87868c611fad565b52613d92858b611fad565b50019290989796613cc2565b8951630a57f30960e31b815260048101859052602490fd5b613cc7565b9091968151881015613df6578280910197613dd68184611fad565b51613de18a8d611fad565b52613dec898c611fad565b5001919081613c87565b96829150613c8c565b50613c565f96613c24565b613e12615002565b60408051630782d7e160e01b81526001600160a01b03831660048201529091828260248173200e12d10bb0c5e4a17e7018f0f1161919bb93895afa928315613bcf575f925f94613b9a5750613b5783613ab7565b9091939284158215175f14613e805750505090505f905f90565b82810192600160fd1b8082019083011760fe1c613fb7575b5050613ea381614bd9565b93613ead81614bd9565b94613eb88682614bf9565b90918215613fa8575f9083986f0785ee10d5da46d900f436a000000000808611613f9a575b50670de0b6b3a7640000808b11613f8b575b50633b9aca00808b11613f7c575b50612710808b11613f6e575b5098805b613f5d5750819061189e989982600a0a9109960195817fcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccd0a93838211900382610100031b9203901c170291614c0c565b60019290920191600a900480613f0d565b60049a04998a930192613f09565b600991939a049901915f613efd565b601291939a049901915f613eef565b85049950602592505f613edd565b5092905061189e949550614c0c565b5f82121561400b57808413613ffd575b7f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb2841315613e985790925061189e939491614b17565b90925061189e939491614b7e565b80841215613fc75790925061189e939491614b17565b6134fb8282614274565b92909180614051576044848460405191637a97930f60e01b835260048301526024820152fd5b90919280155f1461406657505050505f905f90565b61407f9361407391614cc6565b92919490938492614cc6565b909391928461408d88614bd9565b9161409786614bd9565b947f161bcca7119915b50764b4abe86529797775a5f171951000000000000000000094604c9186881061423e575b030191600160ff1b98838a018112155f1461420b575050035b5f955f821280614202575b6141e4575b5f8112806141d2575b6141b45786820103966001600160ff1b03881490816141aa575b50806141a1575b80614198575b61417a57509061412e9291614e72565b915f8113614141575b5061189e93614c0c565b9091604c821361416f5761415891600a0a9061399e565b908115614165575f614137565b505050505f905f90565b50505050505f905f90565b876044916040519163d556b11160e01b835260048301526024820152fd5b505f851261411e565b50828414614118565b905088145f614111565b604489836040519163d556b11160e01b835260048301526024820152fd5b50806001600160ff1b030182136140f7565b95508087018613156141fc5786818703015b956140ee565b5f6141f6565b505f81136140e9565b89985090920390506001600160ff1b038190038701821361422f57018601946140de565b5050505050505050505f905f90565b7f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee80000000000000000009650604b92506140c5565b81156139a8570590565b8082601b82810b8314614469577d90e40fbeea1d3a4abc8955e946fe31cdcf66f634e10000000000000000008405614415575b8380820b0361440457507b199999999999999999999999999999999999999999999999999999987b0ccccccccccccccccccccccccccccccccccccccccccccccccccccccc840111156143b5575b838060030b03614339575b80841361431d5750506001600160e01b036001925b60e01b91161791565b8303600a0a80156139a8576001600160e01b0391071592614314565b92915f84131561438957509061434f8383614f14565b61436b57637ffffffe1901600a0a810290637fffffff926142ff565b506044916040519163d556b11160e01b835260048301526024820152fd5b637fffffff19928303906043821361416f576143a891600a0a9061426a565b91821561416557926142ff565b5f198401808060030b146143c957506142f4565b90506001600160e01b039293507b7fffffffffffffffffffffffffffffffffffffffffffffffffffffff915060e01b9260ff1d181617905f90565b600190940193600a909305926142a7565b937f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee8000000000000000000840515614456576305f5e100600894058094819201955b9150506142a7565b620186a06005940580948192019561444e565b50826142f457505050505f90600190565b919291600160ff1b84016144925761189e9350614f2d565b9061189e935f039161463e565b919291600160ff1b919080158061462c5750906144bb91614cc6565b9490929091905f868585858282138015614623575b614606575b505050508682841860ff1c94860391039081604c0381116145eb5701600a0a8082059190846145d1575b505081019182821860ff1c11156145c957826001600160ff1b03146145ab57905f600192135f1461457c57600a9004915b01925b8115811761454057509190565b80614559575b508015614551579190565b505f91508190565b919261456f9203600160ff1b01600a0a9061426a565b600160ff1b91905f614546565b600a60037fe6666666666666666666666666666666666666666666666666666666666666679201040191614530565b604490836040519163d556b11160e01b835260048301526024820152fd5b509092614533565b81076145de575b806144ff565b60ff1d600117015f6145d8565b5050509193506145f9579190565b60018160ff1d1790039190565b5f9a50909750909550600160ff1b945092509050868080806144d5565b50835f126144d0565b156146375750509190565b9350919050565b939291938415811581811761478f5750509061465991614cc6565b919490829561466a82958294614cc6565b8096929491969387868482138015614786575b61476d575b5050505050508682841860ff1c94860391039081604c0381116145eb5701600a0a808205919084614753575b505081019182821860ff1c111561474b57826001600160ff1b03146145ab57905f600192135f1461471c57600a9004915b01925b811581176146ef57509190565b806146ff57508015614551579190565b600160ff1b936147169291038401600a0a9061426a565b5f614546565b600a60037fe66666666666666666666666666666666666666666666666666666666666666792010401916146df565b5090926146e2565b8107614760575b806146ae565b60ff1d600117015f61475a565b929b5098509196509450925090505f8080808080614682565b5085841261467d565b93959390929190156147a5575050614551579190565b945092915050565b6008815110613a21576008015167ffffffffffffffff1667ff0a89c674ee78741490565b916040830192604061480b610bd2606087519401938451906001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b613e66565b9451930161481a8151866127e3565b614822575050565b909350611a19919250519251836134bd565b92915f9060018184145f871287151717176148ae575f928082136148a0575b03604c81135f82121761489457600a0a9084614872838202938461426a565b1461488757505015614883575f9190565b5f90565b9093509015611a19579190565b505015614883575f9190565b5f9560019450925090614853565b5050505f90565b93929190918083145f83125f87121883158715171717614904575f928082136148f75703604c81135f82121761489457600a0a9084614872838202938461426a565b9194600193509190614853565b50919050565b919082604091031261018257815160048110156101825760209092015160ff811681036101825790565b91925f83121561495c576044838360405191634a7d166b60e01b835260048301526024820152fd5b91928361496e57505090505f90600190565b60ff8116820191808312614a36575f8312156149a6575050604c198112614551575f03600a0a9161499f838261399e565b9283021490565b909293915f81135f14614a2c57604d8113614a0157600a0a9283156139a857835f190483116149d85750500290600190565b60405163c849483b60e01b815260048101849052602481019290925260ff166044820152606490fd5b5060405163c849483b60e01b81526004810192909252602482015260ff919091166044820152606490fd5b5050905090600190565b60405163c849483b60e01b815260048101869052602481019190915260ff82166044820152606490fd5b9091813b614a9b57614a72919261506b565b50614a7c81613ab7565b159182614a8857505090565b6001600160a01b03918216911614919050565b6020918160645f935160405192630b135d3f60e11b9788855260048501526040602485015286820190604485015e8281018201859052601f01601f191601915afa905f5114601f3d11161690565b9060ff165f03916001600160ff1b0382115f14614b0f57600a6001818404940192061590565b909190600190565b909392915f614b27918184613e66565b9490945f8483019182019412159081614b74575b8115614b6a575b50614b4c57505090565b604492506040519163d556b11160e01b835260048301526024820152fd5b905083125f614b42565b8281129150614b3b565b614b9393600160fe1b90810193920190613e66565b9081815f821215614bca575050604b1982126128d157614bb8915f03600a0a9061426a565b9081614bc2575f90565b600160ff1b90565b93600160ff1b90910192509050565b5f811215611a1957600160ff1b90808203614bf2575090565b90505f0390565b905f198183099102908180821091030391565b92939291905f8184181215614ca1576001600160ff1b039283831115614c8b57600160ff1b93838503614c4157505050509190565b90919293508514614c5b575050600a600191045f03920190565b604051630ed8062160e21b8152600481019190915260248101919091526044810182905260648101849052608490fd5b5090915050600160ff1b811461288a575f039190565b90916001600160ff1b0380841115612852578514614c5b575050600a60019104920190565b9190918015614e6857827f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee800000000000000000080830515614d76575b507f19999999999999999999999999999999999999999999999999999999999999997f0ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc830110614d67575b8313614d515791905f90565b919060018060ff1b926001600160ff1b03030190565b9290600a02905f190192614d45565b6f4b3b4ca85a86c47a098a22400000000080840515614e56575b507728c87cb5c89a2571ebfdcb54864ada834a00000000000000830515614e3f575b7b097edd871cfda3a5697758bf0e3cbb5ac5741c640000000000000000830515614e2b575b7e3899162693736ac531a5a58f1fbb4b746504382ca7e4000000000000000000830515614e1b57820515614e0c575b5f614cfa565b9290600a02905f190192614e06565b9391606402916001190193614dd7565b93916402540be40002916009190193614dd7565b9391678ac7230489e8000002916012190193614db2565b6025198301955092909202915f614d90565b505f915081908190565b90915f198383099280830292838086109503948086039584871015614ef05714614ee8579082910960018219018216809204600280826003021880830282030280830282030280830282030280830282030280830282030280920290030293600183805f03040190848311900302920304170290565b505091500490565b60648386866040519263362ced0960e11b8452600484015260248301526044820152fd5b611a1991905f811215614f28575f036150a5565b6150a5565b909291600160ff1b91828101614fbf5750808414614fb557808413918215614fad578185035b604c811115614f9c5750505f915b15614f8d57507f8000000000000000000000000000000000000000000000000000000000000001019190565b92506001600160ff1b03039190565b600a0a9081156139a8570491614f61565b848203614f53565b505090505f905f90565b93614fcc92945f0361449f565b80939180928114614fe0575b50505f039190565b915092506001600160ff1b0383146145ab57600a600191059201915f80614fd8565b73200e12d10bb0c5e4a17e7018f0f1161919bb9389803b158015615040575b6150285750565b602490604051906373e6d7b360e01b82526004820152fd5b507f1de7d717526cba131d684e312dedbf0852adef9cced9e36798ae4937f7145d41813f1415615021565b815191906041830361509b576150949250602082015190606060408401519301515f1a90615134565b9192909190565b50505f9160029190565b90637ffffff581131561512e57637ffffffe1981019060438213615127575f8212156150fb57637fffffff91505f0301600a0a7b8000000000000000000000000000000000000000000000000000000202111590565b50600a0a80156139a8577b80000000000000000000000000000000000000000000000000000001041090565b5050151590565b50505f90565b91907f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a084116151ab579160209360809260ff5f9560405194855216868401526040830152606082015282805260015afa1561022c575f516001600160a01b038116156151a157905f905f90565b505f906001905f90565b5050505f91600391905600000000000000000000000000000000000000000000200e12d10bb0c5e4a17e7018f0f1161919bb93890000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000044b608060405234801561000f575f80fd5b506004361061004a575f3560e01c80630782d7e11461004e57806354636d2b14610078578063b7bad1b11461009d578063f5c36eaf146100b0575b5f80fd5b61006161005c366004610363565b6100c3565b60405161006f929190610403565b60405180910390f35b61008b610086366004610363565b6100d8565b60405160ff909116815260200161006f565b6100616100ab366004610363565b6100e9565b61008b6100be366004610363565b6100f5565b5f806100cf5f84610100565b91509150915091565b5f6100e35f836101f0565b92915050565b5f806100cf5f84610281565b5f6100e35f83610356565b73ffffffffffffffffffffffffffffffffffffffff81165f9081526020838152604080832081518083019092525460ff8082161515835261010090910416818301527f313ce56700000000000000000000000000000000000000000000000000000000808452839283908190816004818a5afa915060203d1015610182575f91505b811561019857505f5160ff811115610198575f91505b816101af57505050602001516003925090506101e9565b83516101c3575f955093506101e992505050565b836020015160ff1681146101d85760026101db565b60015b846020015195509550505050505b9250929050565b5f805f6101fd8585610281565b909250905060018260038111156102165761021661039d565b1415801561023557505f8260038111156102325761023261039d565b14155b156102795783826040517fee07877f000000000000000000000000000000000000000000000000000000008152600401610270929190610421565b60405180910390fd5b949350505050565b5f805f8061028f8686610100565b90925090505f8260038111156102a7576102a761039d565b0361034b576040805180820182526001815260ff838116602080840191825273ffffffffffffffffffffffffffffffffffffffff8a165f908152908b9052939093209151825493517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00009094169015157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff161761010093909116929092029190911790555b909590945092505050565b5f805f6101fd8585610100565b5f60208284031215610373575f80fd5b813573ffffffffffffffffffffffffffffffffffffffff81168114610396575f80fd5b9392505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b600481106103ff577f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b9052565b6040810161041182856103ca565b60ff831660208301529392505050565b73ffffffffffffffffffffffffffffffffffffffff831681526040810161039660208301846103ca56000000000000000000000000000000000000000000"; diff --git a/src/generated/candidate/RaindexV6.sol b/src/generated/candidate/RaindexV6.sol index b6ace076e2..3f77726e45 100644 --- a/src/generated/candidate/RaindexV6.sol +++ b/src/generated/candidate/RaindexV6.sol @@ -5,19 +5,19 @@ pragma solidity ^0.8.25; // THIS FILE IS AUTOGENERATED BY THE BUILD SCRIPT. DO NOT EDIT BY HAND. /// @dev Hash of the known bytecode. -bytes32 constant BYTECODE_HASH = bytes32(0x4d3927d5f44ec129805cabc695b0ad4ea3c5b480ea6f353d4a982b412c06641b); +bytes32 constant BYTECODE_HASH = bytes32(0x8f9be42f1166b0ac357ba2c2dee72173c9497bc09a5b4769a7b1c9aee61a26dc); /// @dev The deterministic deploy address of the contract when deployed via /// the Zoltu factory. -address constant DEPLOYED_ADDRESS = address(0x522A6b8d2cD1E44d53475516fd3c55bc29A0E865); +address constant DEPLOYED_ADDRESS = address(0x50Ad4Ff129155D8f584deda447B11b4f5138840d); /// @dev The creation bytecode of the contract. bytes constant CREATION_CODE = - hex"6080806040523460395760017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00556151c2908161003e8239f35b5f80fdfe6080806040526004361015610012575f80fd5b5f3560e01c90816301ffc9a714611792575080631f69cb751461155c5780632cb77e9f146115305780632fbc4ba0146113ce57806341d1514f146113975780635cffe9de1461123b578063607461191461109f578063613255ab1461101c57806369c728561461072b578063709fb8a5146104375780639235084d146103e3578063ac9650d814610295578063d7e442ec14610237578063d9d98ce4146101865763fa501182146100c1575f80fd5b34610182576101403660031901126101825767ffffffffffffffff600435818111610182576100f4903690600401611b44565b6024358281116101825761010c903690600401611b44565b60c0366043190112610182576101043583811161018257610131903690600401611cea565b90610124359384116101825761014e61015c943690600401611cea565b926101576126da565b612220565b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055005b5f80fd5b34610182576040366003190112610182576001600160a01b036101a7611816565b166040516370a0823160e01b8152306004820152602081602481855afa90811561022c575f916101fa575b50156101e25760206040515f8152f35b60249060405190633c5bf76960e21b82526004820152fd5b90506020813d602011610224575b81610215602093836119b3565b810103126101825751826101d2565b3d9150610208565b6040513d5f823e3d90fd5b346101825760203660031901126101825760043567ffffffffffffffff81116101825761028f61026e61015c9236906004016117e5565b91906102786126da565b6040519261028584611997565b5f84523691611dbe565b90612991565b34610182576020806003193601126101825760043567ffffffffffffffff8111610182576102c79036906004016117e5565b9190604051926102d684611997565b5f84528284016102e582611a97565b946102f360405196876119b3565b8286526102ff83611a97565b9361031186880195601f190186612204565b5f5b84811061037557604080518881528951818a018190525f92600582901b83018101918a918c9085015b8287106103495785850386f35b909192938280610365600193603f198a820301865288516118a2565b960192019601959291909261033c565b806103c4886103be61039160019560059d9c9d1b8701876120e4565b929089846040519586938585013782018381015f81528b519283915e015f838201520380845201826119b3565b30613a32565b6103ce828a611fca565b526103d98189611fca565b5001969596610313565b3461018257600319602036820112610182576004359067ffffffffffffffff82116101825760809082360301126101825761042260609160040161212c565b90604051921515835260208301526040820152f35b34610182576003196040368201126101825760043567ffffffffffffffff8082116101825760c08260040193833603011261018257602435908111610182576104849036906004016117e5565b61048f9291926126da565b6104c06104bb6104b66104af6104a58880612117565b60408101906120e4565b36916119d5565b6139c8565b613a1d565b801561071957600110156107075760248201926104dd8486611f27565b9050156106f55760448301936104f38587611f27565b9050156106e3576105596105219561054d6105186105118a80612117565b948a611f27565b9890928a611f27565b91909261053e60405196610534886118c6565b3388523690611a39565b9960209a8b8801523691611aaf565b60408501523691611aaf565b6060820152606484013560808201526105718161271c565b90815f525f865260405f209485541595866105b5575b878760017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055604051908152f35b6001905560a46001600160a01b03917f87491344dfbcf91f6cbbc610cbbeedc85313d37a02df0c93527f7ea5f8db717f83855116604051908152868b82015260606040820152806106096060820188612032565b0390a10191610618838a6120e4565b905061063b575b50505061062e9394955061274d565b8190838080808080610587565b6106486104af848b6120e4565b610651816147b9565b156106bc57509761068f7fd46c2c56b35c8210e9e712ec3f02242d5fc90187c0ac8ed80cc33626846ec369936106af9361062e999a9b5116926120e4565b92906040519384938452868c850152606060408501526060840191611d19565b0390a1859493878061061f565b886106df604051928392630c89984b60e31b8452600484015260248301906118a2565b0390fd5b60405163540e5f0b60e01b8152600490fd5b604051636c44ef8f60e01b8152600490fd5b604051633c8270bd60e21b8152600490fd5b604051632cff108b60e21b8152600490fd5b34610182576003196020368201126101825767ffffffffffffffff600435116101825760c09060043536030112610182576107646126da565b5f808061077960048035608481019101611e70565b90501561100a576024600435013592610791846127dd565b15610ff8576060806040516107a58161192e565b6107ad611ec5565b81525f60208201525f604082015201526107c5611ec5565b506108256108206107ff6107f56107ef6107e9608460043501600435600401611e70565b90611ef7565b80611f12565b6040810190611f27565b60206108186107e9608460043501600435600401611e70565b013591611f5d565b611d05565b936001600160a01b0361087461082061085b6108516107ef6107e9608460043501600435600401611e70565b6060810190611f27565b60406108186107e9608460043501600435600401611e70565b8160405197610882896118f6565b16875216602086015260408501526108a4608460043501600435600401611e70565b9490506001604051955f87520160051b85016040525f905f5b6108d1608460043501600435600401611e70565b9050811080610fe5575b15610e32576108f4608460043501600435600401611e70565b821015610e1e578160051b810135607e198236030181121561018257608081830136031261018257604051916109298361192e565b8181013567ffffffffffffffff81116101825761094b90369084840101611b44565b835280820160208181013590850152604080820135908501526060013567ffffffffffffffff8111610182576109849236920101611cea565b606082015280516001600160a01b036109a66040830151602085015190611fca565b5151166001600160a01b0385511614801590610dea575b610dd8576109d5602083015160408401519083612ed1565b6109de8161271c565b91825f525f60205260405f2054155f14610a42575051604080513381526001600160a01b039092166020830152810191909152600191907fb70c12fa453793fa6818ec07c91e74363a47aa6a6829dcd9533937fdf30314f390606090a15b016108bd565b9190610a73602084979597015160408501519060608601519060405192610a6884611997565b5f8452339186613102565b925f93610a8b60608201516044600435013590612800565b15610af257505051604080513381526001600160a01b03909216602083015281019190915260019291907fe3151dc8cb7a54ffc4baabd28c1f241c94d510b5e5b502491ac3cad6c16316d590606090a15b8115610aea575b5092610a3c565b905088610ae3565b610aff60408201516127dd565b158015610dc5575b15610b5c57505051604080513381526001600160a01b03909216602083015281019190915260019291907f500b713857325f9e6dcb52ae832eca9109d107ed1aae9cb4928b4c1e13f051aa90606090a1610adc565b9250925050600196959691610b75606460043501611fde565b15610d325796610be597610bf560408401516040880151610b968183613461565b15610d2a5750925b610bef848592610bd8610bd260608a01516001600160e01b03601b918660e01d92828816810b928260e01d9216900b613e72565b9061402d565b9d8e9260408d015161352c565b60408c0152613556565b99613556565b98610c008484613580565b610c0a84826135de565b60405192338452608060208501526060610c308451608080880152610100870190612032565b93602081015160a0870152604081015160c0870152015192607f198582030160e0860152835180825260208201906020808260051b8501019601925f5b828110610ccc57505050505092806001979695937f194f1feb3b4d7076a2c272e774e792e0c48bb8c7aa1a9a3671c1cd6da9e6b4c193610cc796604084015260608301520390a180858c5101808d5260051b8c0152613731565b610adc565b9091929396602080610d1d600193601f198782030189528b51906001600160a01b0382511681526040610d0c8584015160608785015260608401906120b1565b9201519060408184039101526118a2565b9901950193929101610c6d565b905092610b9e565b610be590610bf56060840151610bef610d70610bd260408801516001600160e01b0394601b90868360e01d9316820b91878260e01d9216900b613e72565b60408a0151610d7f8183613461565b15610dbd5750915b829c8d916060890151908116155f14610dae575060408801515b96879460408d015161352c565b610db89085613488565b610da1565b905091610d87565b50610dd3606082015161343e565b610b07565b60405163936bb5ad60e01b8152600490fd5b506001600160a01b03610e066060830151604085015190611fca565b5151166001600160a01b0360208601511614156109bd565b634e487b7160e01b5f52603260045260245ffd5b50919390610e44606460043501611fde565b15610fdf57835b6004356004013590610e5d8282613461565b610fc15750508490610e7d856001600160a01b0360208701511633612e68565b505060a46004350190610e95826004356004016120e4565b905015159081610fb9575b50610f18575b506001600160a01b03610ebc9293511633612827565b50505b8351811015610ee45780610ede610ed860019387611fca565b5161390a565b01610ebf565b5060409160017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f005582519182526020820152f35b90506001600160a01b03602084015116610f426001600160a01b03855116926004356004016120e4565b929091333b1561018257610f8a5f93604051958694859463691f9ed760e01b8652600486015260248501528960448501528a606485015260a0608485015260a4840191611d19565b038183335af190811561022c57859115610ea6579050610faa915061194a565b5f836001600160a01b03610ea6565b905088610ea0565b604492506040519163573b6f4160e01b835260048301526024820152fd5b84610e4b565b50610ff360408301516127dd565b6108db565b60405163315f9e2360e21b8152600490fd5b604051639c95219f60e01b8152600490fd5b3461018257602080600319360112610182576024816001600160a01b03611041611816565b16604051928380926370a0823160e01b82523060048301525afa90811561022c575f91611072575b50604051908152f35b90508181813d8311611098575b61108981836119b3565b81010312610182575182611069565b503d61107f565b34610182576110ad36611856565b6110b56126da565b6110c08486336127a9565b6110c9836127dd565b1561120e576110d9848633612b9b565b6110e38185613461565b15611208575082935b6110f885828833612e0a565b9690947f8045c25080b0868951141ed0a91720bcad09a8364a2b3109ee1fd49c1f0bc8b860c0611129898533612e68565b94906001600160a01b0360405192338452169a8b6020840152876040840152856060840152608083015260a0820152a1836111845760017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055005b6111fb9761028f9660ff946040519960078b5260208b015260408a01526060890152608088015260a08701521660c08501523360e0850152610100840193846040526111cf8561197a565b600785526111e061012082016121e8565b6111e985611fba565b526111f384611fba565b503691611dbe565b808080808080808061015c565b936110ec565b604051623a3a4d60e21b81523360048201526001600160a01b038616602482015260448101859052606490fd5b34610182576080366003190112610182576004356001600160a01b03908181168091036101825761126a61182c565b6044359167ffffffffffffffff916064358381116101825736602382011215610182578060040135938411610182573660248583010111610182576112f79560209216936112b9868587612d2b565b60405196879283926323e30c8b60e01b84523360048501528760248501528860448501525f606485015260a06084850152602460a485019201611d19565b03815f855af193841561022c575f94611363575b507f439148f0bbc682ca079e46d6e2c2f0c1e3b820f1a291b069d8882abf8cf18dd9840361134a5761133f93503091612da4565b602060405160018152f35b604051630b6c58a960e31b815260048101859052602490fd5b9093506020813d60201161138f575b8161137f602093836119b3565b810103126101825751928461130b565b3d9150611372565b346101825760603660031901126101825760206113c66113b5611816565b6113bd61182c565b60443591612b9b565b604051908152f35b34610182576113dc36611856565b839493926113e86126da565b6113f38486336127a9565b6113fc816127dd565b15611502578061141061145f928733612827565b9590967f7f9dfa19cf1cc2f806f2f860fbc9c056b601fb1afc0e9b843dfe5c63616268e660806040513381526001600160a01b0384169a8b60208301528560408301526060820152a1336128cd565b9590938261148d5760017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055005b6114f69661028f9560ff936040519860068a5260208a01526040890152606088015260808701521660a08501523360c085015260e0840193846040526114d28561197a565b600785526114e361010082016121e8565b6114ec85611faa565b526111f384611faa565b8080808080808061015c565b6040516306dde9c360e41b81523360048201526001600160a01b038616602482015260448101859052606490fd5b34610182576020366003190112610182576004355f525f6020526020600160405f205414604051908152f35b3461018257600319604036820112610182576004359067ffffffffffffffff808311610182578260040160a08436039384011261018257602435828111610182576115ab9036906004016117e5565b906115b46126da565b5f946001600160a01b0394856115c986611d05565b163303611770576115e26115dd3687611b44565b61271c565b91825f525f60205260405f2096600188541461162a575b60208960017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00556040519015158152f35b9091929394959697505f6001985560405191338352846020840152606060408401528161165689611842565b16606084015260248a013590606219018112156101825789019060a060808401528061168460048401611842565b1661010084015261169760248301611842565b1661012083015260448101356022198236030181121561018257019560246004880135970192871161018257863603831361018257602098608461175384936117127f09d18501db0080ca2d6cd7c17fa7255daff4b2d503ea93b76ff68b6752ea8e63976117639c6060610140890152610160880191611d19565b6117446117396117256044880185611d39565b605f198a8603810160a08c01529491611d6e565b926064870190611d39565b918784030160c0880152611d6e565b91013560e08301520390a161274d565b82808080808080806115f9565b60248661177c87611d05565b6040516335252be360e01b815291166004820152fd5b34610182576020366003190112610182576004359063ffffffff60e01b82168092036101825760209163e414309160e01b81149081156117d4575b5015158152f35b6301ffc9a760e01b149050836117cd565b9181601f840112156101825782359167ffffffffffffffff8311610182576020808501948460051b01011161018257565b600435906001600160a01b038216820361018257565b602435906001600160a01b038216820361018257565b35906001600160a01b038216820361018257565b906080600319830112610182576004356001600160a01b0381168103610182579160243591604435916064359067ffffffffffffffff82116101825761189e916004016117e5565b9091565b805180835260209291819084018484015e5f828201840152601f01601f1916010190565b60a0810190811067ffffffffffffffff8211176118e257604052565b634e487b7160e01b5f52604160045260245ffd5b6060810190811067ffffffffffffffff8211176118e257604052565b6040810190811067ffffffffffffffff8211176118e257604052565b6080810190811067ffffffffffffffff8211176118e257604052565b67ffffffffffffffff81116118e257604052565b60e0810190811067ffffffffffffffff8211176118e257604052565b610100810190811067ffffffffffffffff8211176118e257604052565b6020810190811067ffffffffffffffff8211176118e257604052565b90601f8019910116810190811067ffffffffffffffff8211176118e257604052565b92919267ffffffffffffffff82116118e257604051916119ff601f8201601f1916602001846119b3565b829481845281830111610182578281602093845f960137010152565b9080601f8301121561018257816020611a36933591016119d5565b90565b91906060838203126101825760405190611a52826118f6565b8193611a5d81611842565b8352611a6b60208201611842565b602084015260408101359167ffffffffffffffff831161018257604092611a929201611a1b565b910152565b67ffffffffffffffff81116118e25760051b60200190565b929192611abb82611a97565b604092611acb60405192836119b3565b819581835260208093019160061b84019381851161018257915b848310611af457505050505050565b8583830312610182578386918251611b0b81611912565b611b1486611842565b81528286013583820152815201920191611ae5565b9080601f8301121561018257816020611a3693359101611aaf565b91909160a0818403126101825760405190611b5e826118c6565b8193611b6982611842565b835267ffffffffffffffff9160208101358381116101825782611b8d918301611a39565b602085015260408101358381116101825782611baa918301611b29565b6040850152606081013592831161018257611bcb6080939284938301611b29565b60608501520135910152565b909291611be384611a97565b916040611bf360405194856119b3565b839580855260208095019160059160051b8401948086116101825784935b868510611c22575050505050505050565b67ffffffffffffffff90853582811161018257870190606082850312610182578451611c4d816118f6565b611c5683611842565b81528a83013584811161018257830185601f8201121561018257803590611c7c82611a97565b91611c89895193846119b3565b8083528d808401918b1b83010191888311610182578e809101915b838310611cda57509150508201528583013593841161018257611ccb858c95869501611a1b565b86820152815201940193611c11565b82358152918101918f9101611ca4565b9080601f8301121561018257816020611a3693359101611bd7565b356001600160a01b03811681036101825790565b908060209392818452848401375f828201840152601f01601f1916010190565b9035601e198236030181121561018257016020813591019167ffffffffffffffff8211610182578160061b3603831361018257565b9190808252602080920192915f905b828210611d8b575050505090565b909192936001906001600160a01b03611da387611842565b16815285830135838201526040908101950193920190611d7d565b90929192611dcb81611a97565b91604091611ddc60405194856119b3565b839581855260208095019160051b8301938185116101825783925b858410611e075750505050505050565b67ffffffffffffffff908435828111610182578601908382860312610182578351611e3181611912565b82358481116101825786611e46918501611a39565b81528983013593841161018257611e61868b95869501611cea565b83820152815201930192611df7565b903590601e1981360301821215610182570180359067ffffffffffffffff821161018257602001918160051b3603831361018257565b60405190611eb3826118f6565b60606040835f81525f60208201520152565b60405190611ed2826118c6565b5f608083828152611ee1611ea6565b6020820152606060408201526060808201520152565b9015610e1e57803590607e1981360301821215610182570190565b903590609e1981360301821215610182570190565b903590601e1981360301821215610182570180359067ffffffffffffffff821161018257602001918160061b3603831361018257565b9190811015610e1e5760061b0190565b805115610e1e5760200190565b805160011015610e1e5760400190565b805160021015610e1e5760600190565b805160031015610e1e5760800190565b805160041015610e1e5760a00190565b805160051015610e1e5760c00190565b8051821015610e1e5760209160051b010190565b3580151581036101825790565b9081518082526020808093019301915f5b82811061200a575050505090565b835180516001600160a01b031686528201518583015260409094019392810192600101611ffc565b906080806120a861209661208460406001600160a01b0380895116885260208901519060a060208a01528082511660a08a015260208201511660c08901520151606060e08801526101008701906118a2565b60408701518682036040880152611feb565b60608601518582036060870152611feb565b93015191015290565b9081518082526020808093019301915f5b8281106120d0575050505090565b8351855293810193928101926001016120c2565b903590601e1981360301821215610182570180359067ffffffffffffffff82116101825760200191813603831361018257565b903590605e1981360301821215610182570190565b6121436115dd61213c8380611f12565b3690611b44565b5f525f602052600160405f2054036121df5780612163816121cf93611f12565b6121c76121826121876020850135938460408701359384923690611b44565b612ed1565b61219f6121948580611f12565b946060810190611e70565b92906121bf604051966121b188611997565b5f88525f3681373690611b44565b933691611bd7565b923392613102565b6040810151606090910151600192565b505f905f905f90565b5f5b60e081106121f6575050565b6060828201526020016121ea565b5f5b82811061221257505050565b606082820152602001612206565b926001600160a01b038451166001600160a01b03835116146126c8576001600160a01b03612255606086015160643590611fca565b515116906040830151916001600160a01b036122746084358095611fca565b51511614801590612688575b610dd8576040850151906001600160a01b0361229f6044358094611fca565b5151166001600160a01b036122ba60643560608a0151611fca565b51511614612676576122cb8661271c565b805f525f60205260405f20541561262357506122e68461271c565b805f525f60205260405f2054156125cf57506123c992916123a3917f6fa7f4c28634b0a9d6831401c45ae468195fb63aed07308935c35374ff5d9e396040518061234e61234061012033845280602085015283018d612032565b82810360408401528a612032565b85606083015260643560808301528760a083015260a43560c083015260c43560e083015260e4356101008301520390a16001600160a01b038651166040519261239684611997565b5f8452606435908a613102565b936001600160a01b03865116604051926123bc84611997565b5f845260a4359086613102565b916123d760408201516127dd565b1580156125bb575b80156125a8575b8015612595575b61258357604051916123fe8361192e565b5f83525f60208401525f60408401525f606084015261241d84836147dd565b8452604084015261244361243183866147dd565b6020860152806060860152845161352c565b94612457602085015160408601519061352c565b936124618761343e565b8015612574575b6125625761252961255b957fd9fa84dd790c969daa5c33d8050dc06b4a9b59d5b42e2be5f5e8ae20447f618d9461250b6125609a60a0966124aa8a8851613580565b6124b88c6020890151613580565b6124c68a60408901516135de565b6124d48c60608901516135de565b6124dd8a61390a565b6124e68c61390a565b6001600160a01b0361250260c435926060606435910151611fca565b515116336128cd565b50506001600160a01b0361250260e43592606060a435910151611fca565b5050606060405191338352805160208401526020810151604084015260408101518284015201516080820152a1613731565b613731565b565b604051630d86822160e01b8152600490fd5b5061257e8561343e565b612468565b6040516321badf1f60e01b8152600490fd5b506125a3606084015161343e565b6123ed565b506125b6606082015161343e565b6123e6565b506125c960408401516127dd565b156123df565b9351604080513381526001600160a01b039092166020830152810194909452507fb70c12fa453793fa6818ec07c91e74363a47aa6a6829dcd9533937fdf30314f3945091925082915050606081015b0390a1565b9551604080513381526001600160a01b039092166020830152810196909652507fb70c12fa453793fa6818ec07c91e74363a47aa6a6829dcd9533937fdf30314f39493508392505060608201905061261e565b604051631cd2f1c760e21b8152600490fd5b506001600160a01b036126a2606085015160a43590611fca565b5151166001600160a01b036126be604088015160443590611fca565b5151161415612280565b604051630a98f1f360e21b8152600490fd5b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00600281541461270a5760029055565b604051633ee5aeb560e01b8152600490fd5b604051612747816127396020820194602086526040830190612032565b03601f1981018352826119b3565b51902090565b612560929161277861028f923390919060405192600284526020840152604083015260608201604052565b92604051936127868561197a565b60078552612796602086016121e8565b61279f85611f6d565b526111f384611f6d565b9091156127b4575050565b6040516305dbdfd960e41b81526001600160a01b03918216600482015291166024820152604490fd5b6127fc905f60e01d906001600160e01b038160e01d9116601b0b614840565b1290565b906127fc916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b6148c1565b92919261283382613b05565b9361283d8161343e565b6128bb5784816001600160e01b0361285c9360e01d9116601b0b614940565b9290809315612892575b50829081612876575b5050509190565b61288a926001600160a01b03309216612da4565b5f818161286f565b9092505f1981146128a757600101915f612866565b634e487b7160e01b5f52601160045260245ffd5b604051632eaefac360e21b8152600490fd5b939291936128da8361343e565b61297857846128f6576128ee939450612e68565b50505f905f90565b6001600160a01b039392919380911694855f52602060018152604092835f20961695865f528152825f20825f528152612933835f20549485613556565b9561293d8761343e565b612960575f97885260018252838820908852815282872091875252909320829055565b835163c5e12af560e01b815260048101889052602490fd5b60405163793a8f5560e01b815260048101849052602490fd5b6040805192936129a08461197a565b6007845260206129b18186016121e8565b5f5b84518110156129e657806129c960019287611fca565b516129d48289611fca565b526129df8188611fca565b50016129b3565b50925092939093335f52308352845f2092855191612a0383611912565b612a0b611ea6565b835260608281940152865193612a2085611997565b5f8552875190612a2f82611997565b5f82525f3681375f5b8151811015612b8f57612a4b8183611fca565b51908a8251015151612a62575b6001915001612a38565b8a89875f612a73828701518a613c40565b938651946001600160a01b0394828680895116968901511697015190835197612a9b8961195e565b88528d88015282870152828d87015260808601528c60a08601528860c086015251809263d04dfe2360e01b82528180612ad860049889830161304a565b03915afa948515612b855789915f96612b5f575b508551612afd575b50505050612a58565b5101511692833b1561018257612b2b935f92838f5180978195829463012c676d60e21b8452339084016136f0565b03925af1918215612b5557600192612b46575b808781612af4565b612b4f9061194a565b5f612b3e565b8b513d5f823e3d90fd5b612b7c9196503d805f833e612b7481836119b3565b810190612f06565b9050945f612aec565b8e513d5f823e3d90fd5b50505050505050509050565b8215612bd0576001600160a01b038091165f52600160205260405f2091165f5260205260405f20905f5260205260405f205490565b909150612bdc82613be4565b6001600160a01b03809316906040918251946370a0823160e01b86528416938460048701526020928387602481865afa968715612cf2575f97612cfc575b5083612c33612c2c83612c639a614a6c565b5090614280565b508651636eb1769f60e11b81526001600160a01b0390941660048501523060248501529297889081906044820190565b0381865afa968715612cf2575f97612cc1575b50612c2c612c8791611a3698614a6c565b50612c928183613461565b15612cb95750935b5f5260018252825f20905f528152815f20905f8052525f205490613556565b905093612c9a565b96508387813d8311612ceb575b612cd881836119b3565b8101031261018257955195612c2c612c76565b503d612cce565b85513d5f823e3d90fd5b96508387813d8311612d24575b612d1381836119b3565b810103126101825795519583612c1a565b503d612d09565b6040519263a9059cbb60e01b5f526001600160a01b0380931660045260245260205f60448180855af160015f5114811615612d85575b8360405215612d6f57505050565b635274afe760e01b835216600482015260249150fd5b6001811516612d9b57813b15153d151616612d61565b833d5f823e3d90fd5b9092604051936323b872dd60e01b5f526001600160a01b0393848092166004521660245260445260205f60648180855af160015f5114811615612df4575b836040525f60605215612d6f57505050565b6001811516612d9b57813b15153d151616612de2565b93929193612e178361343e565b6129785784612e2b576128ee939450612827565b6001600160a01b039392919380911694855f52602060018152604092835f20961695865f528152825f20825f528152612933835f2054948561352c565b90929192612e7581613b05565b93612e7f8161343e565b612ebf5784816001600160e01b03612e9e9360e01d9116601b0b614940565b50809281612ead575050509190565b6001600160a01b0361288a9316612d2b565b604051632d1671a360e11b8152600490fd5b91612efc906060612ef1936001600160a01b039485916040880151611fca565b515116940151611fca565b5151161461267657565b919060408382031261018257825167ffffffffffffffff908181116101825784019082601f83011215610182578151602092612f4182611a97565b91612f4f60405193846119b3565b808352848084019160051b830101918683116101825785809101915b838310612fde5750505050948281015191821161018257019180601f84011215610182578251612f9a81611a97565b93612fa860405195866119b3565b818552838086019260051b820101928311610182578301905b828210612fcf575050505090565b81518152908301908301612fc1565b8251815291810191869101612f6b565b90808251908181526020809101926020808460051b8301019501935f915b84831061301c5750505050505090565b909192939495848061303a600193601f198682030187528a516120b1565b980193019301919493929061300c565b91906020928381526001600160a01b0382511684820152838201516040820152613084604083015160e060608401526101008301906118a2565b90606083015160808201526130ab608084015192601f1993848483030160a0850152612fee565b9260a081015193838382030160c08401528680865192838152019501905f5b8181106130ee57505050611a3694955060c060e091015192828503019101526120b1565b8251875295880195918801916001016130ca565b949193613347919360c0915f6132ce6040928351946131208661195e565b613128611ec5565b86526020958487820152848682015260609781868a809401528260808201528660a0820152015261327e85519161315e8361197a565b6007835261316d8884016121e8565b8d6131778161271c565b9c896001600160a01b039e8f94859182865116908d5194600486528501528c840152168c82015233608082015260a081018a526131b386611f6d565b526131bd85611f6d565b5088516131c9816118f6565b6002815289368c8301376131dc86611f7a565b526131e685611f7a565b5060ff8a6132498b8501936132338761320c81613204858a51611fca565b515116613be4565b9751168861321b848951611fca565b5151168561322a858a51611fca565b51015191612b9b565b9661323f828751611fca565b5151169451611fca565b51015192169093929190604051946005865260208601526040850152606084015260808301525f60a083015260c08201604052565b61328782611f8a565b5261329181611f8a565b506132b58a8d8d60ff8a6132498d8501936132338761320c81613204858a51611fca565b6132be82611f9a565b526132c881611f9a565b50613c40565b95878a511697848b0191825191868184511693015116928a855230875285808620915101518651916132ff83611997565b86835287519561330e8761195e565b86528886015286850152848885015289608085015260a084015260c08301528351808098819463d04dfe2360e01b83526004830161304a565b03915afa968715613434575f945f98613412575b508451600281106133fb5750818386015195015161338161337b88611faa565b51611f9a565b5161338c8183613461565b156133f35750925b6133b68685919060405192600284526020840152604083015260608201604052565b6133bf88611f8a565b526133c987611f8a565b508251996133d68b61195e565b8a52890152870152850152608084015260a083015260c082015290565b905092613394565b602490835190630fbb8e5560e21b82526004820152fd5b90975061342a9194503d805f833e612b7481836119b3565b939093965f61335b565b50513d5f823e3d90fd5b61345d905f60e01d906001600160e01b038160e01d9116601b0b614840565b1390565b9061345d916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b6148c1565b6134af6001600160e01b0392838316601b0b9260e01d938160e01d9116601b0b8484614037565b90637ffffff582136134ff575b906134c691614280565b92909215806134f7575b6134d957505090565b6044925060405191638eba4d0760e01b835260048301526024820152fd5b5082156134d0565b6135098282614f20565b156134bc57604483856040519163d556b11160e01b835260048301526024820152fd5b611a3691610bd2916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b614486565b611a3691610bd2916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b61464a565b6135da91608081018261359c6135968351611faa565b51611faa565b526135d36135cd6001600160a01b038094515116936135c46135be8551611faa565b51611f6d565b51169251611faa565b51611f8a565b5191612e0a565b5050565b906080810191806135f26135968551611f9a565b526001600160a01b0380925151169161360e6135be8551611f9a565b511661361d6135cd8551611f9a565b5190816136b85761362d8361343e565b612978579183917f4cb6e22a3e7e651d7cf0376cff48f20f5007a54147777865be7f5f6c38c50f4a959361261e955f5260209060018252613683604094855f20835f528452855f20855f528452855f2054613556565b945f5260018252835f20905f528152825f20915f52525f20555b51604051918291338352604060208401526040830190612fee565b916136e9917f4cb6e22a3e7e651d7cf0376cff48f20f5007a54147777865be7f5f6c38c50f4a959361261e956128cd565b505061369d565b90604082019082526020606081936040838201528551809452019301915f5b82811061371d575050505090565b83518552938101939281019260010161370f565b60c0810151908151915f926138a5575b506137e66020918281510151926001600160a01b039081818187511696015116928660a082019485518252308452604097888320898686510151015160808601518b519161378e83611997565b8683528c519361379d85611997565b8785528d51966137ac8861195e565b8752898701528c86015260016060860152608085015260a084015260c08301528851808099819463d04dfe2360e01b83526004830161304a565b03915afa94851561389b57879561387d575b508451613809575b50505050505050565b81905101510151169051813b156138795791849184938361383e965180978195829463012c676d60e21b8452600484016136f0565b03925af19081156138705750613859575b8080808080613800565b613863829161194a565b61386d578061384f565b80fd5b513d84823e3d90fd5b8480fd5b6138929195503d8089833e612b7481836119b3565b9050935f6137f8565b86513d89823e3d90fd5b6001600160a01b03602080845101510151169060a083015190823b15610182576138e8925f928360405180968195829463012c676d60e21b8452600484016136f0565b03925af1801561022c57156137415761390291925061194a565b5f905f613741565b6080810161391b6135cd8251611f9a565b5191821561392857505050565b6139426135be6001600160a01b0380935151169351611f9a565b5116815f5260209160018352604092835f20835f528152835f20855f528152835f2054936001600160e01b03851661397d575b505050505050565b6139a1955f9284845260018152828420868552815282842091845252812055612e68565b5f808080613975565b81156139b4570490565b634e487b7160e01b5f52601260045260245ffd5b6040815110613a10576020810151908051603f1981019081116128a75760051c82116139fc5760016020920160051b010190565b5050604051613a0a81611997565b5f815290565b50604051613a0a81611997565b805115613a2d57602001515f1a90565b505f90565b905f8091602081519101845af48080613ab0575b15613a665750506040513d81523d5f602083013e60203d82010160405290565b15613a8d57604051639996b31560e01b81526001600160a01b039091166004820152602490fd5b3d15613a9e576040513d5f823e3d90fd5b60405163d6bda27560e01b8152600490fd5b503d151580613a465750813b1515613a46565b60041115613acd57565b634e487b7160e01b5f52602160045260245ffd5b602090939291936001600160a01b036040820195168152613b0183613ac3565b0152565b613b0d61500e565b6040805163b7bad1b160e01b81526001600160a01b0383166004820152909182826024815f73200e12d10bb0c5e4a17e7018f0f1161919bb93895af1928315613bdb575f925f94613ba6575b50613b6383613ac3565b600183141580613b94575b613b785750505090565b5163ee07877f60e01b81529182916106df919060048401613ae1565b50613b9e83613ac3565b821515613b6e565b90809450613bca9293503d8511613bd4575b613bc281836119b3565b810190614916565b919091925f613b59565b503d613bb8565b513d5f823e3d90fd5b613bec61500e565b60408051630782d7e160e01b81526001600160a01b03831660048201529091828260248173200e12d10bb0c5e4a17e7018f0f1161919bb93895afa928315613bdb575f925f94613ba65750613b6383613ac3565b90805191613c4d83611a97565b91613c68604094613c60865195866119b3565b808552611a97565b601f199460209186013686840137835183519095908015613e67576001613cbe9101965b6001978891010197613cb5613ca08a611a97565b99613cad86519b8c6119b3565b808b52611a97565b01848901612204565b85805f9684516002815233878201523086820152606081018652613ce18b611f6d565b52613ceb8a611f6d565b505f925b613e23575b5050508351613d07575b50505050505090565b85809598979692980181613d1b8289611fca565b52613d268188611fca565b505f925b613d39575b5085969750613cfe565b8451831015613e1e576001600160a01b03613db081613d588689611fca565b51511686613d66878a611fca565b51015187815160051b9101207f19457468657265756d205369676e6564204d6573736167653a0a3332000000005f52601c52603c5f208c613da7888b611fca565b51015191614a9a565b15613e0657868098999a928192613dc7878a611fca565b515116613dd48787611fca565b52019385613de28289611fca565b510151613def868c611fca565b52613dfa858b611fca565b50019290989796613d2a565b8951630a57f30960e31b815260048101859052602490fd5b613d2f565b9091968151881015613e5e578280910197613e3e8184611fca565b51613e498a8d611fca565b52613e54898c611fca565b5001919081613cef565b96829150613cf4565b50613cbe5f96613c8c565b9091939284158215175f14613e8c5750505090505f905f90565b82810192600160fd1b8082019083011760fe1c613fc3575b5050613eaf81614be5565b93613eb981614be5565b94613ec48682614c05565b90918215613fb4575f9083986f0785ee10d5da46d900f436a000000000808611613fa6575b50670de0b6b3a7640000808b11613f97575b50633b9aca00808b11613f88575b50612710808b11613f7a575b5098805b613f695750819061189e989982600a0a9109960195817fcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccd0a93838211900382610100031b9203901c170291614c18565b60019290920191600a900480613f19565b60049a04998a930192613f15565b600991939a049901915f613f09565b601291939a049901915f613efb565b85049950602592505f613ee9565b5092905061189e949550614c18565b5f82121561401757808413614009575b7f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb2841315613ea45790925061189e939491614b23565b90925061189e939491614b8a565b80841215613fd35790925061189e939491614b23565b6134c68282614280565b9290918061405d576044848460405191637a97930f60e01b835260048301526024820152fd5b90919280155f1461407257505050505f905f90565b61408b9361407f91614cd2565b92919490938492614cd2565b909391928461409988614be5565b916140a386614be5565b947f161bcca7119915b50764b4abe86529797775a5f171951000000000000000000094604c9186881061424a575b030191600160ff1b98838a018112155f14614217575050035b5f955f82128061420e575b6141f0575b5f8112806141de575b6141c05786820103966001600160ff1b03881490816141b6575b50806141ad575b806141a4575b61418657509061413a9291614e7e565b915f811361414d575b5061189e93614c18565b9091604c821361417b5761416491600a0a906139aa565b908115614171575f614143565b505050505f905f90565b50505050505f905f90565b876044916040519163d556b11160e01b835260048301526024820152fd5b505f851261412a565b50828414614124565b905088145f61411d565b604489836040519163d556b11160e01b835260048301526024820152fd5b50806001600160ff1b03018213614103565b95508087018613156142085786818703015b956140fa565b5f614202565b505f81136140f5565b89985090920390506001600160ff1b038190038701821361423b57018601946140ea565b5050505050505050505f905f90565b7f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee80000000000000000009650604b92506140d1565b81156139b4570590565b8082601b82810b8314614475577d90e40fbeea1d3a4abc8955e946fe31cdcf66f634e10000000000000000008405614421575b8380820b0361441057507b199999999999999999999999999999999999999999999999999999987b0ccccccccccccccccccccccccccccccccccccccccccccccccccccccc840111156143c1575b838060030b03614345575b8084136143295750506001600160e01b036001925b60e01b91161791565b8303600a0a80156139b4576001600160e01b0391071592614320565b92915f84131561439557509061435b8383614f20565b61437757637ffffffe1901600a0a810290637fffffff9261430b565b506044916040519163d556b11160e01b835260048301526024820152fd5b637fffffff19928303906043821361417b576143b491600a0a90614276565b918215614171579261430b565b5f198401808060030b146143d55750614300565b90506001600160e01b039293507b7fffffffffffffffffffffffffffffffffffffffffffffffffffffff915060e01b9260ff1d181617905f90565b600190940193600a909305926142b3565b937f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee8000000000000000000840515614462576305f5e100600894058094819201955b9150506142b3565b620186a06005940580948192019561445a565b508261430057505050505f90600190565b919291600160ff1b840161449e5761189e9350614f39565b9061189e935f039161464a565b919291600160ff1b91908015806146385750906144c791614cd2565b9490929091905f86858585828213801561462f575b614612575b505050508682841860ff1c94860391039081604c0381116145f75701600a0a8082059190846145dd575b505081019182821860ff1c11156145d557826001600160ff1b03146145b757905f600192135f1461458857600a9004915b01925b8115811761454c57509190565b80614565575b50801561455d579190565b505f91508190565b919261457b9203600160ff1b01600a0a90614276565b600160ff1b91905f614552565b600a60037fe666666666666666666666666666666666666666666666666666666666666667920104019161453c565b604490836040519163d556b11160e01b835260048301526024820152fd5b50909261453f565b81076145ea575b8061450b565b60ff1d600117015f6145e4565b505050919350614605579190565b60018160ff1d1790039190565b5f9a50909750909550600160ff1b945092509050868080806144e1565b50835f126144dc565b156146435750509190565b9350919050565b939291938415811581811761479b5750509061466591614cd2565b919490829561467682958294614cd2565b8096929491969387868482138015614792575b614779575b5050505050508682841860ff1c94860391039081604c0381116145f75701600a0a80820591908461475f575b505081019182821860ff1c111561475757826001600160ff1b03146145b757905f600192135f1461472857600a9004915b01925b811581176146fb57509190565b8061470b5750801561455d579190565b600160ff1b936147229291038401600a0a90614276565b5f614552565b600a60037fe66666666666666666666666666666666666666666666666666666666666666792010401916146eb565b5090926146ee565b810761476c575b806146ba565b60ff1d600117015f614766565b929b5098509196509450925090505f808080808061468e565b50858412614689565b93959390929190156147b157505061455d579190565b945092915050565b6008815110613a2d576008015167ffffffffffffffff1667ff0a89c674ee78741490565b9160408301926040614817610bd2606087519401938451906001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b613e72565b94519301614826815186612800565b61482e575050565b909350611a3691925051925183613488565b92915f9060018184145f871287151717176148ba575f928082136148ac575b03604c81135f8212176148a057600a0a908461487e8382029384614276565b146148935750501561488f575f9190565b5f90565b9093509015611a36579190565b50501561488f575f9190565b5f956001945092509061485f565b5050505f90565b93929190918083145f83125f87121883158715171717614910575f928082136149035703604c81135f8212176148a057600a0a908461487e8382029384614276565b919460019350919061485f565b50919050565b919082604091031261018257815160048110156101825760209092015160ff811681036101825790565b91925f831215614968576044838360405191634a7d166b60e01b835260048301526024820152fd5b91928361497a57505090505f90600190565b60ff8116820191808312614a42575f8312156149b2575050604c19811261455d575f03600a0a916149ab83826139aa565b9283021490565b909293915f81135f14614a3857604d8113614a0d57600a0a9283156139b457835f190483116149e45750500290600190565b60405163c849483b60e01b815260048101849052602481019290925260ff166044820152606490fd5b5060405163c849483b60e01b81526004810192909252602482015260ff919091166044820152606490fd5b5050905090600190565b60405163c849483b60e01b815260048101869052602481019190915260ff82166044820152606490fd5b9060ff165f03916001600160ff1b0382115f14614a9257600a6001818404940192061590565b909190600190565b9091813b614ad557614aac9192615077565b50614ab681613ac3565b159182614ac257505090565b6001600160a01b03918216911614919050565b6020918160645f935160405192630b135d3f60e11b9788855260048501526040602485015286820190604485015e8281018201859052601f01601f191601915afa905f5114601f3d11161690565b909392915f614b33918184613e72565b9490945f8483019182019412159081614b80575b8115614b76575b50614b5857505090565b604492506040519163d556b11160e01b835260048301526024820152fd5b905083125f614b4e565b8281129150614b47565b614b9f93600160fe1b90810193920190613e72565b9081815f821215614bd6575050604b1982126128ee57614bc4915f03600a0a90614276565b9081614bce575f90565b600160ff1b90565b93600160ff1b90910192509050565b5f811215611a3657600160ff1b90808203614bfe575090565b90505f0390565b905f198183099102908180821091030391565b92939291905f8184181215614cad576001600160ff1b039283831115614c9757600160ff1b93838503614c4d57505050509190565b90919293508514614c67575050600a600191045f03920190565b604051630ed8062160e21b8152600481019190915260248101919091526044810182905260648101849052608490fd5b5090915050600160ff1b81146128a7575f039190565b90916001600160ff1b038084111561286f578514614c67575050600a60019104920190565b9190918015614e7457827f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee800000000000000000080830515614d82575b507f19999999999999999999999999999999999999999999999999999999999999997f0ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc830110614d73575b8313614d5d5791905f90565b919060018060ff1b926001600160ff1b03030190565b9290600a02905f190192614d51565b6f4b3b4ca85a86c47a098a22400000000080840515614e62575b507728c87cb5c89a2571ebfdcb54864ada834a00000000000000830515614e4b575b7b097edd871cfda3a5697758bf0e3cbb5ac5741c640000000000000000830515614e37575b7e3899162693736ac531a5a58f1fbb4b746504382ca7e4000000000000000000830515614e2757820515614e18575b5f614d06565b9290600a02905f190192614e12565b9391606402916001190193614de3565b93916402540be40002916009190193614de3565b9391678ac7230489e8000002916012190193614dbe565b6025198301955092909202915f614d9c565b505f915081908190565b90915f198383099280830292838086109503948086039584871015614efc5714614ef4579082910960018219018216809204600280826003021880830282030280830282030280830282030280830282030280830282030280920290030293600183805f03040190848311900302920304170290565b505091500490565b60648386866040519263362ced0960e11b8452600484015260248301526044820152fd5b611a3691905f811215614f34575f036150b1565b6150b1565b909291600160ff1b91828101614fcb5750808414614fc157808413918215614fb9578185035b604c811115614fa85750505f915b15614f9957507f8000000000000000000000000000000000000000000000000000000000000001019190565b92506001600160ff1b03039190565b600a0a9081156139b4570491614f6d565b848203614f5f565b505090505f905f90565b93614fd892945f036144ab565b80939180928114614fec575b50505f039190565b915092506001600160ff1b0383146145b757600a600191059201915f80614fe4565b73200e12d10bb0c5e4a17e7018f0f1161919bb9389803b15801561504c575b6150345750565b602490604051906373e6d7b360e01b82526004820152fd5b507f1de7d717526cba131d684e312dedbf0852adef9cced9e36798ae4937f7145d41813f141561502d565b81519190604183036150a7576150a09250602082015190606060408401519301515f1a90615140565b9192909190565b50505f9160029190565b90637ffffff581131561513a57637ffffffe1981019060438213615133575f82121561510757637fffffff91505f0301600a0a7b8000000000000000000000000000000000000000000000000000000202111590565b50600a0a80156139b4577b80000000000000000000000000000000000000000000000000000001041090565b5050151590565b50505f90565b91907f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a084116151b7579160209360809260ff5f9560405194855216868401526040830152606082015282805260015afa1561022c575f516001600160a01b038116156151ad57905f905f90565b505f906001905f90565b5050505f916003919056"; + hex"6080806040523460395760017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00556151b6908161003e8239f35b5f80fdfe6080806040526004361015610012575f80fd5b5f3560e01c90816301ffc9a714611792575080631f69cb751461155c5780632cb77e9f146115305780632fbc4ba0146113ce57806341d1514f146113975780635cffe9de1461123b578063607461191461109f578063613255ab1461101c57806369c728561461072b578063709fb8a5146104375780639235084d146103e3578063ac9650d814610295578063d7e442ec14610237578063d9d98ce4146101865763fa501182146100c1575f80fd5b34610182576101403660031901126101825767ffffffffffffffff600435818111610182576100f4903690600401611b27565b6024358281116101825761010c903690600401611b27565b60c0366043190112610182576101043583811161018257610131903690600401611ccd565b90610124359384116101825761014e61015c943690600401611ccd565b926101576126bd565b612203565b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055005b5f80fd5b34610182576040366003190112610182576001600160a01b036101a7611816565b166040516370a0823160e01b8152306004820152602081602481855afa90811561022c575f916101fa575b50156101e25760206040515f8152f35b60249060405190633c5bf76960e21b82526004820152fd5b90506020813d602011610224575b8161021560209383611996565b810103126101825751826101d2565b3d9150610208565b6040513d5f823e3d90fd5b346101825760203660031901126101825760043567ffffffffffffffff81116101825761028f61026e61015c9236906004016117e5565b91906102786126bd565b604051926102858461197a565b5f84523691611da1565b90612bb1565b34610182576020806003193601126101825760043567ffffffffffffffff8111610182576102c79036906004016117e5565b9190604051926102d68461197a565b5f84528284016102e582611a7a565b946102f36040519687611996565b8286526102ff83611a7a565b9361031186880195601f1901866121e7565b5f5b84811061037557604080518881528951818a018190525f92600582901b83018101918a918c9085015b8287106103495785850386f35b909192938280610365600193603f198a820301865288516118a2565b960192019601959291909261033c565b806103c4886103be61039160019560059d9c9d1b8701876120c7565b929089846040519586938585013782018381015f81528b519283915e015f83820152038084520182611996565b30613a26565b6103ce828a611fad565b526103d98189611fad565b5001969596610313565b3461018257600319602036820112610182576004359067ffffffffffffffff82116101825760809082360301126101825761042260609160040161210f565b90604051921515835260208301526040820152f35b34610182576003196040368201126101825760043567ffffffffffffffff8082116101825760c08260040193833603011261018257602435908111610182576104849036906004016117e5565b61048f9291926126bd565b6104c06104bb6104b66104af6104a588806120fa565b60408101906120c7565b36916119b8565b6139bc565b613a11565b801561071957600110156107075760248201926104dd8486611f0a565b9050156106f55760448301936104f38587611f0a565b9050156106e3576105596105219561054d6105186105118a806120fa565b948a611f0a565b9890928a611f0a565b91909261053e60405196610534886118c6565b3388523690611a1c565b9960209a8b8801523691611a92565b60408501523691611a92565b606082015260648401356080820152610571816126ff565b90815f525f865260405f209485541595866105b5575b878760017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055604051908152f35b6001905560a46001600160a01b03917f87491344dfbcf91f6cbbc610cbbeedc85313d37a02df0c93527f7ea5f8db717f83855116604051908152868b82015260606040820152806106096060820188612015565b0390a10191610618838a6120c7565b905061063b575b50505061062e93949550612730565b8190838080808080610587565b6106486104af848b6120c7565b610651816147ad565b156106bc57509761068f7fd46c2c56b35c8210e9e712ec3f02242d5fc90187c0ac8ed80cc33626846ec369936106af9361062e999a9b5116926120c7565b92906040519384938452868c850152606060408501526060840191611cfc565b0390a1859493878061061f565b886106df604051928392630c89984b60e31b8452600484015260248301906118a2565b0390fd5b60405163540e5f0b60e01b8152600490fd5b604051636c44ef8f60e01b8152600490fd5b604051633c8270bd60e21b8152600490fd5b604051632cff108b60e21b8152600490fd5b34610182576003196020368201126101825767ffffffffffffffff600435116101825760c09060043536030112610182576107646126bd565b5f808061077960048035608481019101611e53565b90501561100a576024600435013592610791846127c0565b15610ff8576060806040516107a58161192e565b6107ad611ea8565b81525f60208201525f604082015201526107c5611ea8565b506108256108206107ff6107f56107ef6107e9608460043501600435600401611e53565b90611eda565b80611ef5565b6040810190611f0a565b60206108186107e9608460043501600435600401611e53565b013591611f40565b611ce8565b936001600160a01b0361087461082061085b6108516107ef6107e9608460043501600435600401611e53565b6060810190611f0a565b60406108186107e9608460043501600435600401611e53565b8160405197610882896118f6565b16875216602086015260408501526108a4608460043501600435600401611e53565b9490506001604051955f87520160051b85016040525f905f5b6108d1608460043501600435600401611e53565b9050811080610fe5575b15610e32576108f4608460043501600435600401611e53565b821015610e1e578160051b810135607e198236030181121561018257608081830136031261018257604051916109298361192e565b8181013567ffffffffffffffff81116101825761094b90369084840101611b27565b835280820160208181013590850152604080820135908501526060013567ffffffffffffffff8111610182576109849236920101611ccd565b606082015280516001600160a01b036109a66040830151602085015190611fad565b5151166001600160a01b0385511614801590610dea575b610dd8576109d5602083015160408401519083613102565b6109de816126ff565b91825f525f60205260405f2054155f14610a42575051604080513381526001600160a01b039092166020830152810191909152600191907fb70c12fa453793fa6818ec07c91e74363a47aa6a6829dcd9533937fdf30314f390606090a15b016108bd565b9190610a73602084979597015160408501519060608601519060405192610a688461197a565b5f8452339186613137565b925f93610a8b606082015160446004350135906127e3565b15610af257505051604080513381526001600160a01b03909216602083015281019190915260019291907fe3151dc8cb7a54ffc4baabd28c1f241c94d510b5e5b502491ac3cad6c16316d590606090a15b8115610aea575b5092610a3c565b905088610ae3565b610aff60408201516127c0565b158015610dc5575b15610b5c57505051604080513381526001600160a01b03909216602083015281019190915260019291907f500b713857325f9e6dcb52ae832eca9109d107ed1aae9cb4928b4c1e13f051aa90606090a1610adc565b9250925050600196959691610b75606460043501611fc1565b15610d325796610be597610bf560408401516040880151610b968183613496565b15610d2a5750925b610bef848592610bd8610bd260608a01516001600160e01b03601b918660e01d92828816810b928260e01d9216900b613e66565b90614021565b9d8e9260408d0151613561565b60408c015261358b565b9961358b565b98610c0084846135b5565b610c0a8482613613565b60405192338452608060208501526060610c308451608080880152610100870190612015565b93602081015160a0870152604081015160c0870152015192607f198582030160e0860152835180825260208201906020808260051b8501019601925f5b828110610ccc57505050505092806001979695937f194f1feb3b4d7076a2c272e774e792e0c48bb8c7aa1a9a3671c1cd6da9e6b4c193610cc796604084015260608301520390a180858c5101808d5260051b8c0152613725565b610adc565b9091929396602080610d1d600193601f198782030189528b51906001600160a01b0382511681526040610d0c858401516060878501526060840190612094565b9201519060408184039101526118a2565b9901950193929101610c6d565b905092610b9e565b610be590610bf56060840151610bef610d70610bd260408801516001600160e01b0394601b90868360e01d9316820b91878260e01d9216900b613e66565b60408a0151610d7f8183613496565b15610dbd5750915b829c8d916060890151908116155f14610dae575060408801515b96879460408d0151613561565b610db890856134bd565b610da1565b905091610d87565b50610dd36060820151613473565b610b07565b60405163936bb5ad60e01b8152600490fd5b506001600160a01b03610e066060830151604085015190611fad565b5151166001600160a01b0360208601511614156109bd565b634e487b7160e01b5f52603260045260245ffd5b50919390610e44606460043501611fc1565b15610fdf57835b6004356004013590610e5d8282613496565b610fc15750508490610e7d856001600160a01b0360208701511633613099565b505060a46004350190610e95826004356004016120c7565b905015159081610fb9575b50610f18575b506001600160a01b03610ebc929351163361280a565b50505b8351811015610ee45780610ede610ed860019387611fad565b516138fe565b01610ebf565b5060409160017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f005582519182526020820152f35b90506001600160a01b03602084015116610f426001600160a01b03855116926004356004016120c7565b929091333b1561018257610f8a5f93604051958694859463691f9ed760e01b8652600486015260248501528960448501528a606485015260a0608485015260a4840191611cfc565b038183335af190811561022c57859115610ea6579050610faa915061194a565b5f836001600160a01b03610ea6565b905088610ea0565b604492506040519163573b6f4160e01b835260048301526024820152fd5b84610e4b565b50610ff360408301516127c0565b6108db565b60405163315f9e2360e21b8152600490fd5b604051639c95219f60e01b8152600490fd5b3461018257602080600319360112610182576024816001600160a01b03611041611816565b16604051928380926370a0823160e01b82523060048301525afa90811561022c575f91611072575b50604051908152f35b90508181813d8311611098575b6110898183611996565b81010312610182575182611069565b503d61107f565b34610182576110ad36611856565b6110b56126bd565b6110c084863361278c565b6110c9836127c0565b1561120e576110d9848633612dcc565b6110e38185613496565b15611208575082935b6110f88582883361303b565b9690947f8045c25080b0868951141ed0a91720bcad09a8364a2b3109ee1fd49c1f0bc8b860c0611129898533613099565b94906001600160a01b0360405192338452169a8b6020840152876040840152856060840152608083015260a0820152a1836111845760017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055005b6111fb9761028f9660ff946040519960078b5260208b015260408a01526060890152608088015260a08701521660c08501523360e0850152610100840193846040526111cf8561195e565b600685526111e061012082016121cb565b6111e985611f9d565b526111f384611f9d565b503691611da1565b808080808080808061015c565b936110ec565b604051623a3a4d60e21b81523360048201526001600160a01b038616602482015260448101859052606490fd5b34610182576080366003190112610182576004356001600160a01b03908181168091036101825761126a61182c565b6044359167ffffffffffffffff916064358381116101825736602382011215610182578060040135938411610182573660248583010111610182576112f79560209216936112b9868587612f5c565b60405196879283926323e30c8b60e01b84523360048501528760248501528860448501525f606485015260a06084850152602460a485019201611cfc565b03815f855af193841561022c575f94611363575b507f439148f0bbc682ca079e46d6e2c2f0c1e3b820f1a291b069d8882abf8cf18dd9840361134a5761133f93503091612fd5565b602060405160018152f35b604051630b6c58a960e31b815260048101859052602490fd5b9093506020813d60201161138f575b8161137f60209383611996565b810103126101825751928461130b565b3d9150611372565b346101825760603660031901126101825760206113c66113b5611816565b6113bd61182c565b60443591612dcc565b604051908152f35b34610182576113dc36611856565b839493926113e86126bd565b6113f384863361278c565b6113fc816127c0565b15611502578061141061145f92873361280a565b9590967f7f9dfa19cf1cc2f806f2f860fbc9c056b601fb1afc0e9b843dfe5c63616268e660806040513381526001600160a01b0384169a8b60208301528560408301526060820152a1336128b0565b9590938261148d5760017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055005b6114f69661028f9560ff936040519860068a5260208a01526040890152606088015260808701521660a08501523360c085015260e0840193846040526114d28561195e565b600685526114e361010082016121cb565b6114ec85611f8d565b526111f384611f8d565b8080808080808061015c565b6040516306dde9c360e41b81523360048201526001600160a01b038616602482015260448101859052606490fd5b34610182576020366003190112610182576004355f525f6020526020600160405f205414604051908152f35b3461018257600319604036820112610182576004359067ffffffffffffffff808311610182578260040160a08436039384011261018257602435828111610182576115ab9036906004016117e5565b906115b46126bd565b5f946001600160a01b0394856115c986611ce8565b163303611770576115e26115dd3687611b27565b6126ff565b91825f525f60205260405f2096600188541461162a575b60208960017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00556040519015158152f35b9091929394959697505f6001985560405191338352846020840152606060408401528161165689611842565b16606084015260248a013590606219018112156101825789019060a060808401528061168460048401611842565b1661010084015261169760248301611842565b1661012083015260448101356022198236030181121561018257019560246004880135970192871161018257863603831361018257602098608461175384936117127f09d18501db0080ca2d6cd7c17fa7255daff4b2d503ea93b76ff68b6752ea8e63976117639c6060610140890152610160880191611cfc565b6117446117396117256044880185611d1c565b605f198a8603810160a08c01529491611d51565b926064870190611d1c565b918784030160c0880152611d51565b91013560e08301520390a1612730565b82808080808080806115f9565b60248661177c87611ce8565b6040516335252be360e01b815291166004820152fd5b34610182576020366003190112610182576004359063ffffffff60e01b82168092036101825760209163e414309160e01b81149081156117d4575b5015158152f35b6301ffc9a760e01b149050836117cd565b9181601f840112156101825782359167ffffffffffffffff8311610182576020808501948460051b01011161018257565b600435906001600160a01b038216820361018257565b602435906001600160a01b038216820361018257565b35906001600160a01b038216820361018257565b906080600319830112610182576004356001600160a01b0381168103610182579160243591604435916064359067ffffffffffffffff82116101825761189e916004016117e5565b9091565b805180835260209291819084018484015e5f828201840152601f01601f1916010190565b60a0810190811067ffffffffffffffff8211176118e257604052565b634e487b7160e01b5f52604160045260245ffd5b6060810190811067ffffffffffffffff8211176118e257604052565b6040810190811067ffffffffffffffff8211176118e257604052565b6080810190811067ffffffffffffffff8211176118e257604052565b67ffffffffffffffff81116118e257604052565b60e0810190811067ffffffffffffffff8211176118e257604052565b6020810190811067ffffffffffffffff8211176118e257604052565b90601f8019910116810190811067ffffffffffffffff8211176118e257604052565b92919267ffffffffffffffff82116118e257604051916119e2601f8201601f191660200184611996565b829481845281830111610182578281602093845f960137010152565b9080601f8301121561018257816020611a19933591016119b8565b90565b91906060838203126101825760405190611a35826118f6565b8193611a4081611842565b8352611a4e60208201611842565b602084015260408101359167ffffffffffffffff831161018257604092611a7592016119fe565b910152565b67ffffffffffffffff81116118e25760051b60200190565b929192611a9e82611a7a565b604092611aae6040519283611996565b819581835260208093019160061b84019381851161018257915b848310611ad757505050505050565b8583830312610182578386918251611aee81611912565b611af786611842565b81528286013583820152815201920191611ac8565b9080601f8301121561018257816020611a1993359101611a92565b91909160a0818403126101825760405190611b41826118c6565b8193611b4c82611842565b835267ffffffffffffffff9160208101358381116101825782611b70918301611a1c565b602085015260408101358381116101825782611b8d918301611b0c565b6040850152606081013592831161018257611bae6080939284938301611b0c565b60608501520135910152565b909291611bc684611a7a565b916040611bd66040519485611996565b839580855260208095019160059160051b8401948086116101825784935b868510611c05575050505050505050565b67ffffffffffffffff90853582811161018257870190606082850312610182578451611c30816118f6565b611c3983611842565b81528a83013584811161018257830185601f8201121561018257803590611c5f82611a7a565b91611c6c89519384611996565b8083528d808401918b1b83010191888311610182578e809101915b838310611cbd57509150508201528583013593841161018257611cae858c958695016119fe565b86820152815201940193611bf4565b82358152918101918f9101611c87565b9080601f8301121561018257816020611a1993359101611bba565b356001600160a01b03811681036101825790565b908060209392818452848401375f828201840152601f01601f1916010190565b9035601e198236030181121561018257016020813591019167ffffffffffffffff8211610182578160061b3603831361018257565b9190808252602080920192915f905b828210611d6e575050505090565b909192936001906001600160a01b03611d8687611842565b16815285830135838201526040908101950193920190611d60565b90929192611dae81611a7a565b91604091611dbf6040519485611996565b839581855260208095019160051b8301938185116101825783925b858410611dea5750505050505050565b67ffffffffffffffff908435828111610182578601908382860312610182578351611e1481611912565b82358481116101825786611e29918501611a1c565b81528983013593841161018257611e44868b95869501611ccd565b83820152815201930192611dda565b903590601e1981360301821215610182570180359067ffffffffffffffff821161018257602001918160051b3603831361018257565b60405190611e96826118f6565b60606040835f81525f60208201520152565b60405190611eb5826118c6565b5f608083828152611ec4611e89565b6020820152606060408201526060808201520152565b9015610e1e57803590607e1981360301821215610182570190565b903590609e1981360301821215610182570190565b903590601e1981360301821215610182570180359067ffffffffffffffff821161018257602001918160061b3603831361018257565b9190811015610e1e5760061b0190565b805115610e1e5760200190565b805160011015610e1e5760400190565b805160021015610e1e5760600190565b805160031015610e1e5760800190565b805160041015610e1e5760a00190565b805160051015610e1e5760c00190565b8051821015610e1e5760209160051b010190565b3580151581036101825790565b9081518082526020808093019301915f5b828110611fed575050505090565b835180516001600160a01b031686528201518583015260409094019392810192600101611fdf565b9060808061208b61207961206760406001600160a01b0380895116885260208901519060a060208a01528082511660a08a015260208201511660c08901520151606060e08801526101008701906118a2565b60408701518682036040880152611fce565b60608601518582036060870152611fce565b93015191015290565b9081518082526020808093019301915f5b8281106120b3575050505090565b8351855293810193928101926001016120a5565b903590601e1981360301821215610182570180359067ffffffffffffffff82116101825760200191813603831361018257565b903590605e1981360301821215610182570190565b6121266115dd61211f8380611ef5565b3690611b27565b5f525f602052600160405f2054036121c25780612146816121b293611ef5565b6121aa61216561216a6020850135938460408701359384923690611b27565b613102565b6121826121778580611ef5565b946060810190611e53565b92906121a2604051966121948861197a565b5f88525f3681373690611b27565b933691611bba565b923392613137565b6040810151606090910151600192565b505f905f905f90565b5f5b60c081106121d9575050565b6060828201526020016121cd565b5f5b8281106121f557505050565b6060828201526020016121e9565b926001600160a01b038451166001600160a01b03835116146126ab576001600160a01b03612238606086015160643590611fad565b515116906040830151916001600160a01b036122576084358095611fad565b5151161480159061266b575b610dd8576040850151906001600160a01b036122826044358094611fad565b5151166001600160a01b0361229d60643560608a0151611fad565b51511614612659576122ae866126ff565b805f525f60205260405f20541561260657506122c9846126ff565b805f525f60205260405f2054156125b257506123ac9291612386917f6fa7f4c28634b0a9d6831401c45ae468195fb63aed07308935c35374ff5d9e396040518061233161232361012033845280602085015283018d612015565b82810360408401528a612015565b85606083015260643560808301528760a083015260a43560c083015260c43560e083015260e4356101008301520390a16001600160a01b03865116604051926123798461197a565b5f8452606435908a613137565b936001600160a01b038651166040519261239f8461197a565b5f845260a4359086613137565b916123ba60408201516127c0565b15801561259e575b801561258b575b8015612578575b61256657604051916123e18361192e565b5f83525f60208401525f60408401525f606084015261240084836147d1565b8452604084015261242661241483866147d1565b60208601528060608601528451613561565b9461243a6020850151604086015190613561565b9361244487613473565b8015612557575b6125455761250c61253e957fd9fa84dd790c969daa5c33d8050dc06b4a9b59d5b42e2be5f5e8ae20447f618d946124ee6125439a60a09661248d8a88516135b5565b61249b8c60208901516135b5565b6124a98a6040890151613613565b6124b78c6060890151613613565b6124c08a6138fe565b6124c98c6138fe565b6001600160a01b036124e560c435926060606435910151611fad565b515116336128b0565b50506001600160a01b036124e560e43592606060a435910151611fad565b5050606060405191338352805160208401526020810151604084015260408101518284015201516080820152a1613725565b613725565b565b604051630d86822160e01b8152600490fd5b5061256185613473565b61244b565b6040516321badf1f60e01b8152600490fd5b506125866060840151613473565b6123d0565b506125996060820151613473565b6123c9565b506125ac60408401516127c0565b156123c2565b9351604080513381526001600160a01b039092166020830152810194909452507fb70c12fa453793fa6818ec07c91e74363a47aa6a6829dcd9533937fdf30314f3945091925082915050606081015b0390a1565b9551604080513381526001600160a01b039092166020830152810196909652507fb70c12fa453793fa6818ec07c91e74363a47aa6a6829dcd9533937fdf30314f394935083925050606082019050612601565b604051631cd2f1c760e21b8152600490fd5b506001600160a01b03612685606085015160a43590611fad565b5151166001600160a01b036126a1604088015160443590611fad565b5151161415612263565b604051630a98f1f360e21b8152600490fd5b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0060028154146126ed5760029055565b604051633ee5aeb560e01b8152600490fd5b60405161272a8161271c6020820194602086526040830190612015565b03601f198101835282611996565b51902090565b612543929161275b61028f923390919060405192600284526020840152604083015260608201604052565b92604051936127698561195e565b60068552612779602086016121cb565b61278285611f50565b526111f384611f50565b909115612797575050565b6040516305dbdfd960e41b81526001600160a01b03918216600482015291166024820152604490fd5b6127df905f60e01d906001600160e01b038160e01d9116601b0b614834565b1290565b906127df916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b6148b5565b92919261281682613af9565b9361282081613473565b61289e5784816001600160e01b0361283f9360e01d9116601b0b614934565b9290809315612875575b50829081612859575b5050509190565b61286d926001600160a01b03309216612fd5565b5f8181612852565b9092505f19811461288a57600101915f612849565b634e487b7160e01b5f52601160045260245ffd5b604051632eaefac360e21b8152600490fd5b939291936128bd83613473565b61295b57846128d9576128d1939450613099565b50505f905f90565b6001600160a01b039392919380911694855f52602060018152604092835f20961695865f528152825f20825f528152612916835f2054948561358b565b9561292087613473565b612943575f97885260018252838820908852815282872091875252909320829055565b835163c5e12af560e01b815260048101889052602490fd5b60405163793a8f5560e01b815260048101849052602490fd5b919060408382031261018257825167ffffffffffffffff908181116101825784019082601f830112156101825781516020926129af82611a7a565b916129bd6040519384611996565b808352848084019160051b830101918683116101825785809101915b838310612a4c5750505050948281015191821161018257019180601f84011215610182578251612a0881611a7a565b93612a166040519586611996565b818552838086019260051b820101928311610182578301905b828210612a3d575050505090565b81518152908301908301612a2f565b82518152918101918691016129d9565b90808251908181526020809101926020808460051b8301019501935f915b848310612a8a5750505050505090565b9091929394958480612aa8600193601f198682030187528a51612094565b9801930193019194939290612a7a565b91906020928381526001600160a01b0382511684820152838201516040820152612af2604083015160e060608401526101008301906118a2565b9060608301516080820152612b19608084015192601f1993848483030160a0850152612a5c565b9260a081015193838382030160c08401528680865192838152019501905f5b818110612b5c57505050611a1994955060c060e09101519282850301910152612094565b825187529588019591880191600101612b38565b90604082019082526020606081936040838201528551809452019301915f5b828110612b9d575050505090565b835185529381019392810192600101612b8f565b919091604092835192612bc38461195e565b60068452602094612bd58686016121cb565b5f5b8451811015612c0a5780612bed60019287611fad565b51612bf88289611fad565b52612c038188611fad565b5001612bd7565b50925092939093335f52308252825f2091835195612c2787611912565b612c2f611e89565b875260608281980152845190612c448261197a565b5f8252855190612c538261197a565b5f82525f3681375f5b8151811015612dc057898688612c728486611fad565b51888151948d80870151908151612c94575b5050505050505050600101612c5c565b905f92916001600160a01b0396612cb98887818d51169c015116998789015190613bd8565b95825199612cc68b61195e565b8a5289015287015285015260808401528760a08401528660c08401525f8c51809563d04dfe2360e01b82528180612d01600498898301612ab8565b03915afa938415612db6579089915f95612d90575b508451612d2c575b50899250808e8c938e612c84565b5101511691823b1561018257612d5a925f92838d5180968195829463012c676d60e21b845233908401612b70565b03925af18015612d86579060019291612d77575b81928782612d1e565b612d809061194a565b5f612d6e565b89513d5f823e3d90fd5b612dad9195503d805f833e612da58183611996565b810190612974565b9050935f612d16565b8c513d5f823e3d90fd5b50505050505050509050565b8215612e01576001600160a01b038091165f52600160205260405f2091165f5260205260405f20905f5260205260405f205490565b909150612e0d82613e0a565b6001600160a01b03809316906040918251946370a0823160e01b86528416938460048701526020928387602481865afa968715612f23575f97612f2d575b5083612e64612e5d83612e949a614ae9565b5090614274565b508651636eb1769f60e11b81526001600160a01b0390941660048501523060248501529297889081906044820190565b0381865afa968715612f23575f97612ef2575b50612e5d612eb891611a1998614ae9565b50612ec38183613496565b15612eea5750935b5f5260018252825f20905f528152815f20905f8052525f20549061358b565b905093612ecb565b96508387813d8311612f1c575b612f098183611996565b8101031261018257955195612e5d612ea7565b503d612eff565b85513d5f823e3d90fd5b96508387813d8311612f55575b612f448183611996565b810103126101825795519583612e4b565b503d612f3a565b6040519263a9059cbb60e01b5f526001600160a01b0380931660045260245260205f60448180855af160015f5114811615612fb6575b8360405215612fa057505050565b635274afe760e01b835216600482015260249150fd5b6001811516612fcc57813b15153d151616612f92565b833d5f823e3d90fd5b9092604051936323b872dd60e01b5f526001600160a01b0393848092166004521660245260445260205f60648180855af160015f5114811615613025575b836040525f60605215612fa057505050565b6001811516612fcc57813b15153d151616613013565b9392919361304883613473565b61295b578461305c576128d193945061280a565b6001600160a01b039392919380911694855f52602060018152604092835f20961695865f528152825f20825f528152612916835f20549485613561565b909291926130a681613af9565b936130b081613473565b6130f05784816001600160e01b036130cf9360e01d9116601b0b614934565b508092816130de575050509190565b6001600160a01b0361286d9316612f5c565b604051632d1671a360e11b8152600490fd5b9161312d906060613122936001600160a01b039485916040880151611fad565b515116940151611fad565b5151161461265957565b94919361337c919360c0915f6133036040928351946131558661195e565b61315d611ea8565b86526020958487820152848682015260609781868a809401528260808201528660a082015201526132b38551916131938361195e565b600683526131a28884016121cb565b8d6131ac816126ff565b9c896001600160a01b039e8f94859182865116908d5194600486528501528c840152168c82015233608082015260a081018a526131e886611f50565b526131f285611f50565b5088516131fe816118f6565b6002815289368c83013761321186611f5d565b5261321b85611f5d565b5060ff8a61327e8b8501936132688761324181613239858a51611fad565b515116613e0a565b97511688613250848951611fad565b5151168561325f858a51611fad565b51015191612dcc565b96613274828751611fad565b5151169451611fad565b51015192169093929190604051946005865260208601526040850152606084015260808301525f60a083015260c08201604052565b6132bc82611f6d565b526132c681611f6d565b506132ea8a8d8d60ff8a61327e8d8501936132688761324181613239858a51611fad565b6132f382611f7d565b526132fd81611f7d565b50613bd8565b95878a511697848b0191825191868184511693015116928a855230875285808620915101518651916133348361197a565b8683528751956133438761195e565b86528886015286850152848885015289608085015260a084015260c08301528351808098819463d04dfe2360e01b835260048301612ab8565b03915afa968715613469575f945f98613447575b50845160028110613430575081838601519501516133b66133b088611f8d565b51611f7d565b516133c18183613496565b156134285750925b6133eb8685919060405192600284526020840152604083015260608201604052565b6133f488611f6d565b526133fe87611f6d565b5082519961340b8b61195e565b8a52890152870152850152608084015260a083015260c082015290565b9050926133c9565b602490835190630fbb8e5560e21b82526004820152fd5b90975061345f9194503d805f833e612da58183611996565b939093965f613390565b50513d5f823e3d90fd5b613492905f60e01d906001600160e01b038160e01d9116601b0b614834565b1390565b90613492916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b6148b5565b6134e46001600160e01b0392838316601b0b9260e01d938160e01d9116601b0b848461402b565b90637ffffff58213613534575b906134fb91614274565b929092158061352c575b61350e57505090565b6044925060405191638eba4d0760e01b835260048301526024820152fd5b508215613505565b61353e8282614f14565b156134f157604483856040519163d556b11160e01b835260048301526024820152fd5b611a1991610bd2916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b61447a565b611a1991610bd2916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b61463e565b61360f9160808101826135d16135cb8351611f8d565b51611f8d565b526136086136026001600160a01b038094515116936135f96135f38551611f8d565b51611f50565b51169251611f8d565b51611f6d565b519161303b565b5050565b906080810191806136276135cb8551611f7d565b526001600160a01b038092515116916136436135f38551611f7d565b51166136526136028551611f7d565b5190816136ed5761366283613473565b61295b579183917f4cb6e22a3e7e651d7cf0376cff48f20f5007a54147777865be7f5f6c38c50f4a9593612601955f52602090600182526136b8604094855f20835f528452855f20855f528452855f205461358b565b945f5260018252835f20905f528152825f20915f52525f20555b51604051918291338352604060208401526040830190612a5c565b9161371e917f4cb6e22a3e7e651d7cf0376cff48f20f5007a54147777865be7f5f6c38c50f4a9593612601956128b0565b50506136d2565b60c0810151908151915f92613899575b506137da6020918281510151926001600160a01b039081818187511696015116928660a082019485518252308452604097888320898686510151015160808601518b51916137828361197a565b8683528c51936137918561197a565b8785528d51966137a08861195e565b8752898701528c86015260016060860152608085015260a084015260c08301528851808099819463d04dfe2360e01b835260048301612ab8565b03915afa94851561388f578795613871575b5084516137fd575b50505050505050565b81905101510151169051813b1561386d57918491849383613832965180978195829463012c676d60e21b845260048401612b70565b03925af1908115613864575061384d575b80808080806137f4565b613857829161194a565b6138615780613843565b80fd5b513d84823e3d90fd5b8480fd5b6138869195503d8089833e612da58183611996565b9050935f6137ec565b86513d89823e3d90fd5b6001600160a01b03602080845101510151169060a083015190823b15610182576138dc925f928360405180968195829463012c676d60e21b845260048401612b70565b03925af1801561022c5715613735576138f691925061194a565b5f905f613735565b6080810161390f6136028251611f7d565b5191821561391c57505050565b6139366135f36001600160a01b0380935151169351611f7d565b5116815f5260209160018352604092835f20835f528152835f20855f528152835f2054936001600160e01b038516613971575b505050505050565b613995955f9284845260018152828420868552815282842091845252812055613099565b5f808080613969565b81156139a8570490565b634e487b7160e01b5f52601260045260245ffd5b6040815110613a04576020810151908051603f19810190811161288a5760051c82116139f05760016020920160051b010190565b50506040516139fe8161197a565b5f815290565b506040516139fe8161197a565b805115613a2157602001515f1a90565b505f90565b905f8091602081519101845af48080613aa4575b15613a5a5750506040513d81523d5f602083013e60203d82010160405290565b15613a8157604051639996b31560e01b81526001600160a01b039091166004820152602490fd5b3d15613a92576040513d5f823e3d90fd5b60405163d6bda27560e01b8152600490fd5b503d151580613a3a5750813b1515613a3a565b60041115613ac157565b634e487b7160e01b5f52602160045260245ffd5b602090939291936001600160a01b036040820195168152613af583613ab7565b0152565b613b01615002565b6040805163b7bad1b160e01b81526001600160a01b0383166004820152909182826024815f73200e12d10bb0c5e4a17e7018f0f1161919bb93895af1928315613bcf575f925f94613b9a575b50613b5783613ab7565b600183141580613b88575b613b6c5750505090565b5163ee07877f60e01b81529182916106df919060048401613ad5565b50613b9283613ab7565b821515613b62565b90809450613bbe9293503d8511613bc8575b613bb68183611996565b81019061490a565b919091925f613b4d565b503d613bac565b513d5f823e3d90fd5b90805191613be583611a7a565b91613c00604094613bf886519586611996565b808552611a7a565b601f199460209186013686840137835183519095908015613dff576001613c569101965b6001978891010197613c4d613c388a611a7a565b99613c4586519b8c611996565b808b52611a7a565b018489016121e7565b85805f9684516002815233878201523086820152606081018652613c798b611f50565b52613c838a611f50565b505f925b613dbb575b5050508351613c9f575b50505050505090565b85809598979692980181613cb38289611fad565b52613cbe8188611fad565b505f925b613cd1575b5085969750613c96565b8451831015613db6576001600160a01b03613d4881613cf08689611fad565b51511686613cfe878a611fad565b51015187815160051b9101207f19457468657265756d205369676e6564204d6573736167653a0a3332000000005f52601c52603c5f208c613d3f888b611fad565b51015191614a60565b15613d9e57868098999a928192613d5f878a611fad565b515116613d6c8787611fad565b52019385613d7a8289611fad565b510151613d87868c611fad565b52613d92858b611fad565b50019290989796613cc2565b8951630a57f30960e31b815260048101859052602490fd5b613cc7565b9091968151881015613df6578280910197613dd68184611fad565b51613de18a8d611fad565b52613dec898c611fad565b5001919081613c87565b96829150613c8c565b50613c565f96613c24565b613e12615002565b60408051630782d7e160e01b81526001600160a01b03831660048201529091828260248173200e12d10bb0c5e4a17e7018f0f1161919bb93895afa928315613bcf575f925f94613b9a5750613b5783613ab7565b9091939284158215175f14613e805750505090505f905f90565b82810192600160fd1b8082019083011760fe1c613fb7575b5050613ea381614bd9565b93613ead81614bd9565b94613eb88682614bf9565b90918215613fa8575f9083986f0785ee10d5da46d900f436a000000000808611613f9a575b50670de0b6b3a7640000808b11613f8b575b50633b9aca00808b11613f7c575b50612710808b11613f6e575b5098805b613f5d5750819061189e989982600a0a9109960195817fcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccd0a93838211900382610100031b9203901c170291614c0c565b60019290920191600a900480613f0d565b60049a04998a930192613f09565b600991939a049901915f613efd565b601291939a049901915f613eef565b85049950602592505f613edd565b5092905061189e949550614c0c565b5f82121561400b57808413613ffd575b7f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb2841315613e985790925061189e939491614b17565b90925061189e939491614b7e565b80841215613fc75790925061189e939491614b17565b6134fb8282614274565b92909180614051576044848460405191637a97930f60e01b835260048301526024820152fd5b90919280155f1461406657505050505f905f90565b61407f9361407391614cc6565b92919490938492614cc6565b909391928461408d88614bd9565b9161409786614bd9565b947f161bcca7119915b50764b4abe86529797775a5f171951000000000000000000094604c9186881061423e575b030191600160ff1b98838a018112155f1461420b575050035b5f955f821280614202575b6141e4575b5f8112806141d2575b6141b45786820103966001600160ff1b03881490816141aa575b50806141a1575b80614198575b61417a57509061412e9291614e72565b915f8113614141575b5061189e93614c0c565b9091604c821361416f5761415891600a0a9061399e565b908115614165575f614137565b505050505f905f90565b50505050505f905f90565b876044916040519163d556b11160e01b835260048301526024820152fd5b505f851261411e565b50828414614118565b905088145f614111565b604489836040519163d556b11160e01b835260048301526024820152fd5b50806001600160ff1b030182136140f7565b95508087018613156141fc5786818703015b956140ee565b5f6141f6565b505f81136140e9565b89985090920390506001600160ff1b038190038701821361422f57018601946140de565b5050505050505050505f905f90565b7f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee80000000000000000009650604b92506140c5565b81156139a8570590565b8082601b82810b8314614469577d90e40fbeea1d3a4abc8955e946fe31cdcf66f634e10000000000000000008405614415575b8380820b0361440457507b199999999999999999999999999999999999999999999999999999987b0ccccccccccccccccccccccccccccccccccccccccccccccccccccccc840111156143b5575b838060030b03614339575b80841361431d5750506001600160e01b036001925b60e01b91161791565b8303600a0a80156139a8576001600160e01b0391071592614314565b92915f84131561438957509061434f8383614f14565b61436b57637ffffffe1901600a0a810290637fffffff926142ff565b506044916040519163d556b11160e01b835260048301526024820152fd5b637fffffff19928303906043821361416f576143a891600a0a9061426a565b91821561416557926142ff565b5f198401808060030b146143c957506142f4565b90506001600160e01b039293507b7fffffffffffffffffffffffffffffffffffffffffffffffffffffff915060e01b9260ff1d181617905f90565b600190940193600a909305926142a7565b937f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee8000000000000000000840515614456576305f5e100600894058094819201955b9150506142a7565b620186a06005940580948192019561444e565b50826142f457505050505f90600190565b919291600160ff1b84016144925761189e9350614f2d565b9061189e935f039161463e565b919291600160ff1b919080158061462c5750906144bb91614cc6565b9490929091905f868585858282138015614623575b614606575b505050508682841860ff1c94860391039081604c0381116145eb5701600a0a8082059190846145d1575b505081019182821860ff1c11156145c957826001600160ff1b03146145ab57905f600192135f1461457c57600a9004915b01925b8115811761454057509190565b80614559575b508015614551579190565b505f91508190565b919261456f9203600160ff1b01600a0a9061426a565b600160ff1b91905f614546565b600a60037fe6666666666666666666666666666666666666666666666666666666666666679201040191614530565b604490836040519163d556b11160e01b835260048301526024820152fd5b509092614533565b81076145de575b806144ff565b60ff1d600117015f6145d8565b5050509193506145f9579190565b60018160ff1d1790039190565b5f9a50909750909550600160ff1b945092509050868080806144d5565b50835f126144d0565b156146375750509190565b9350919050565b939291938415811581811761478f5750509061465991614cc6565b919490829561466a82958294614cc6565b8096929491969387868482138015614786575b61476d575b5050505050508682841860ff1c94860391039081604c0381116145eb5701600a0a808205919084614753575b505081019182821860ff1c111561474b57826001600160ff1b03146145ab57905f600192135f1461471c57600a9004915b01925b811581176146ef57509190565b806146ff57508015614551579190565b600160ff1b936147169291038401600a0a9061426a565b5f614546565b600a60037fe66666666666666666666666666666666666666666666666666666666666666792010401916146df565b5090926146e2565b8107614760575b806146ae565b60ff1d600117015f61475a565b929b5098509196509450925090505f8080808080614682565b5085841261467d565b93959390929190156147a5575050614551579190565b945092915050565b6008815110613a21576008015167ffffffffffffffff1667ff0a89c674ee78741490565b916040830192604061480b610bd2606087519401938451906001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b613e66565b9451930161481a8151866127e3565b614822575050565b909350611a19919250519251836134bd565b92915f9060018184145f871287151717176148ae575f928082136148a0575b03604c81135f82121761489457600a0a9084614872838202938461426a565b1461488757505015614883575f9190565b5f90565b9093509015611a19579190565b505015614883575f9190565b5f9560019450925090614853565b5050505f90565b93929190918083145f83125f87121883158715171717614904575f928082136148f75703604c81135f82121761489457600a0a9084614872838202938461426a565b9194600193509190614853565b50919050565b919082604091031261018257815160048110156101825760209092015160ff811681036101825790565b91925f83121561495c576044838360405191634a7d166b60e01b835260048301526024820152fd5b91928361496e57505090505f90600190565b60ff8116820191808312614a36575f8312156149a6575050604c198112614551575f03600a0a9161499f838261399e565b9283021490565b909293915f81135f14614a2c57604d8113614a0157600a0a9283156139a857835f190483116149d85750500290600190565b60405163c849483b60e01b815260048101849052602481019290925260ff166044820152606490fd5b5060405163c849483b60e01b81526004810192909252602482015260ff919091166044820152606490fd5b5050905090600190565b60405163c849483b60e01b815260048101869052602481019190915260ff82166044820152606490fd5b9091813b614a9b57614a72919261506b565b50614a7c81613ab7565b159182614a8857505090565b6001600160a01b03918216911614919050565b6020918160645f935160405192630b135d3f60e11b9788855260048501526040602485015286820190604485015e8281018201859052601f01601f191601915afa905f5114601f3d11161690565b9060ff165f03916001600160ff1b0382115f14614b0f57600a6001818404940192061590565b909190600190565b909392915f614b27918184613e66565b9490945f8483019182019412159081614b74575b8115614b6a575b50614b4c57505090565b604492506040519163d556b11160e01b835260048301526024820152fd5b905083125f614b42565b8281129150614b3b565b614b9393600160fe1b90810193920190613e66565b9081815f821215614bca575050604b1982126128d157614bb8915f03600a0a9061426a565b9081614bc2575f90565b600160ff1b90565b93600160ff1b90910192509050565b5f811215611a1957600160ff1b90808203614bf2575090565b90505f0390565b905f198183099102908180821091030391565b92939291905f8184181215614ca1576001600160ff1b039283831115614c8b57600160ff1b93838503614c4157505050509190565b90919293508514614c5b575050600a600191045f03920190565b604051630ed8062160e21b8152600481019190915260248101919091526044810182905260648101849052608490fd5b5090915050600160ff1b811461288a575f039190565b90916001600160ff1b0380841115612852578514614c5b575050600a60019104920190565b9190918015614e6857827f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee800000000000000000080830515614d76575b507f19999999999999999999999999999999999999999999999999999999999999997f0ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc830110614d67575b8313614d515791905f90565b919060018060ff1b926001600160ff1b03030190565b9290600a02905f190192614d45565b6f4b3b4ca85a86c47a098a22400000000080840515614e56575b507728c87cb5c89a2571ebfdcb54864ada834a00000000000000830515614e3f575b7b097edd871cfda3a5697758bf0e3cbb5ac5741c640000000000000000830515614e2b575b7e3899162693736ac531a5a58f1fbb4b746504382ca7e4000000000000000000830515614e1b57820515614e0c575b5f614cfa565b9290600a02905f190192614e06565b9391606402916001190193614dd7565b93916402540be40002916009190193614dd7565b9391678ac7230489e8000002916012190193614db2565b6025198301955092909202915f614d90565b505f915081908190565b90915f198383099280830292838086109503948086039584871015614ef05714614ee8579082910960018219018216809204600280826003021880830282030280830282030280830282030280830282030280830282030280920290030293600183805f03040190848311900302920304170290565b505091500490565b60648386866040519263362ced0960e11b8452600484015260248301526044820152fd5b611a1991905f811215614f28575f036150a5565b6150a5565b909291600160ff1b91828101614fbf5750808414614fb557808413918215614fad578185035b604c811115614f9c5750505f915b15614f8d57507f8000000000000000000000000000000000000000000000000000000000000001019190565b92506001600160ff1b03039190565b600a0a9081156139a8570491614f61565b848203614f53565b505090505f905f90565b93614fcc92945f0361449f565b80939180928114614fe0575b50505f039190565b915092506001600160ff1b0383146145ab57600a600191059201915f80614fd8565b73200e12d10bb0c5e4a17e7018f0f1161919bb9389803b158015615040575b6150285750565b602490604051906373e6d7b360e01b82526004820152fd5b507f1de7d717526cba131d684e312dedbf0852adef9cced9e36798ae4937f7145d41813f1415615021565b815191906041830361509b576150949250602082015190606060408401519301515f1a90615134565b9192909190565b50505f9160029190565b90637ffffff581131561512e57637ffffffe1981019060438213615127575f8212156150fb57637fffffff91505f0301600a0a7b8000000000000000000000000000000000000000000000000000000202111590565b50600a0a80156139a8577b80000000000000000000000000000000000000000000000000000001041090565b5050151590565b50505f90565b91907f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a084116151ab579160209360809260ff5f9560405194855216868401526040830152606082015282805260015afa1561022c575f516001600160a01b038116156151a157905f905f90565b505f906001905f90565b5050505f916003919056"; /// @dev The runtime bytecode of the contract. bytes constant RUNTIME_CODE = - hex"6080806040526004361015610012575f80fd5b5f3560e01c90816301ffc9a714611792575080631f69cb751461155c5780632cb77e9f146115305780632fbc4ba0146113ce57806341d1514f146113975780635cffe9de1461123b578063607461191461109f578063613255ab1461101c57806369c728561461072b578063709fb8a5146104375780639235084d146103e3578063ac9650d814610295578063d7e442ec14610237578063d9d98ce4146101865763fa501182146100c1575f80fd5b34610182576101403660031901126101825767ffffffffffffffff600435818111610182576100f4903690600401611b44565b6024358281116101825761010c903690600401611b44565b60c0366043190112610182576101043583811161018257610131903690600401611cea565b90610124359384116101825761014e61015c943690600401611cea565b926101576126da565b612220565b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055005b5f80fd5b34610182576040366003190112610182576001600160a01b036101a7611816565b166040516370a0823160e01b8152306004820152602081602481855afa90811561022c575f916101fa575b50156101e25760206040515f8152f35b60249060405190633c5bf76960e21b82526004820152fd5b90506020813d602011610224575b81610215602093836119b3565b810103126101825751826101d2565b3d9150610208565b6040513d5f823e3d90fd5b346101825760203660031901126101825760043567ffffffffffffffff81116101825761028f61026e61015c9236906004016117e5565b91906102786126da565b6040519261028584611997565b5f84523691611dbe565b90612991565b34610182576020806003193601126101825760043567ffffffffffffffff8111610182576102c79036906004016117e5565b9190604051926102d684611997565b5f84528284016102e582611a97565b946102f360405196876119b3565b8286526102ff83611a97565b9361031186880195601f190186612204565b5f5b84811061037557604080518881528951818a018190525f92600582901b83018101918a918c9085015b8287106103495785850386f35b909192938280610365600193603f198a820301865288516118a2565b960192019601959291909261033c565b806103c4886103be61039160019560059d9c9d1b8701876120e4565b929089846040519586938585013782018381015f81528b519283915e015f838201520380845201826119b3565b30613a32565b6103ce828a611fca565b526103d98189611fca565b5001969596610313565b3461018257600319602036820112610182576004359067ffffffffffffffff82116101825760809082360301126101825761042260609160040161212c565b90604051921515835260208301526040820152f35b34610182576003196040368201126101825760043567ffffffffffffffff8082116101825760c08260040193833603011261018257602435908111610182576104849036906004016117e5565b61048f9291926126da565b6104c06104bb6104b66104af6104a58880612117565b60408101906120e4565b36916119d5565b6139c8565b613a1d565b801561071957600110156107075760248201926104dd8486611f27565b9050156106f55760448301936104f38587611f27565b9050156106e3576105596105219561054d6105186105118a80612117565b948a611f27565b9890928a611f27565b91909261053e60405196610534886118c6565b3388523690611a39565b9960209a8b8801523691611aaf565b60408501523691611aaf565b6060820152606484013560808201526105718161271c565b90815f525f865260405f209485541595866105b5575b878760017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055604051908152f35b6001905560a46001600160a01b03917f87491344dfbcf91f6cbbc610cbbeedc85313d37a02df0c93527f7ea5f8db717f83855116604051908152868b82015260606040820152806106096060820188612032565b0390a10191610618838a6120e4565b905061063b575b50505061062e9394955061274d565b8190838080808080610587565b6106486104af848b6120e4565b610651816147b9565b156106bc57509761068f7fd46c2c56b35c8210e9e712ec3f02242d5fc90187c0ac8ed80cc33626846ec369936106af9361062e999a9b5116926120e4565b92906040519384938452868c850152606060408501526060840191611d19565b0390a1859493878061061f565b886106df604051928392630c89984b60e31b8452600484015260248301906118a2565b0390fd5b60405163540e5f0b60e01b8152600490fd5b604051636c44ef8f60e01b8152600490fd5b604051633c8270bd60e21b8152600490fd5b604051632cff108b60e21b8152600490fd5b34610182576003196020368201126101825767ffffffffffffffff600435116101825760c09060043536030112610182576107646126da565b5f808061077960048035608481019101611e70565b90501561100a576024600435013592610791846127dd565b15610ff8576060806040516107a58161192e565b6107ad611ec5565b81525f60208201525f604082015201526107c5611ec5565b506108256108206107ff6107f56107ef6107e9608460043501600435600401611e70565b90611ef7565b80611f12565b6040810190611f27565b60206108186107e9608460043501600435600401611e70565b013591611f5d565b611d05565b936001600160a01b0361087461082061085b6108516107ef6107e9608460043501600435600401611e70565b6060810190611f27565b60406108186107e9608460043501600435600401611e70565b8160405197610882896118f6565b16875216602086015260408501526108a4608460043501600435600401611e70565b9490506001604051955f87520160051b85016040525f905f5b6108d1608460043501600435600401611e70565b9050811080610fe5575b15610e32576108f4608460043501600435600401611e70565b821015610e1e578160051b810135607e198236030181121561018257608081830136031261018257604051916109298361192e565b8181013567ffffffffffffffff81116101825761094b90369084840101611b44565b835280820160208181013590850152604080820135908501526060013567ffffffffffffffff8111610182576109849236920101611cea565b606082015280516001600160a01b036109a66040830151602085015190611fca565b5151166001600160a01b0385511614801590610dea575b610dd8576109d5602083015160408401519083612ed1565b6109de8161271c565b91825f525f60205260405f2054155f14610a42575051604080513381526001600160a01b039092166020830152810191909152600191907fb70c12fa453793fa6818ec07c91e74363a47aa6a6829dcd9533937fdf30314f390606090a15b016108bd565b9190610a73602084979597015160408501519060608601519060405192610a6884611997565b5f8452339186613102565b925f93610a8b60608201516044600435013590612800565b15610af257505051604080513381526001600160a01b03909216602083015281019190915260019291907fe3151dc8cb7a54ffc4baabd28c1f241c94d510b5e5b502491ac3cad6c16316d590606090a15b8115610aea575b5092610a3c565b905088610ae3565b610aff60408201516127dd565b158015610dc5575b15610b5c57505051604080513381526001600160a01b03909216602083015281019190915260019291907f500b713857325f9e6dcb52ae832eca9109d107ed1aae9cb4928b4c1e13f051aa90606090a1610adc565b9250925050600196959691610b75606460043501611fde565b15610d325796610be597610bf560408401516040880151610b968183613461565b15610d2a5750925b610bef848592610bd8610bd260608a01516001600160e01b03601b918660e01d92828816810b928260e01d9216900b613e72565b9061402d565b9d8e9260408d015161352c565b60408c0152613556565b99613556565b98610c008484613580565b610c0a84826135de565b60405192338452608060208501526060610c308451608080880152610100870190612032565b93602081015160a0870152604081015160c0870152015192607f198582030160e0860152835180825260208201906020808260051b8501019601925f5b828110610ccc57505050505092806001979695937f194f1feb3b4d7076a2c272e774e792e0c48bb8c7aa1a9a3671c1cd6da9e6b4c193610cc796604084015260608301520390a180858c5101808d5260051b8c0152613731565b610adc565b9091929396602080610d1d600193601f198782030189528b51906001600160a01b0382511681526040610d0c8584015160608785015260608401906120b1565b9201519060408184039101526118a2565b9901950193929101610c6d565b905092610b9e565b610be590610bf56060840151610bef610d70610bd260408801516001600160e01b0394601b90868360e01d9316820b91878260e01d9216900b613e72565b60408a0151610d7f8183613461565b15610dbd5750915b829c8d916060890151908116155f14610dae575060408801515b96879460408d015161352c565b610db89085613488565b610da1565b905091610d87565b50610dd3606082015161343e565b610b07565b60405163936bb5ad60e01b8152600490fd5b506001600160a01b03610e066060830151604085015190611fca565b5151166001600160a01b0360208601511614156109bd565b634e487b7160e01b5f52603260045260245ffd5b50919390610e44606460043501611fde565b15610fdf57835b6004356004013590610e5d8282613461565b610fc15750508490610e7d856001600160a01b0360208701511633612e68565b505060a46004350190610e95826004356004016120e4565b905015159081610fb9575b50610f18575b506001600160a01b03610ebc9293511633612827565b50505b8351811015610ee45780610ede610ed860019387611fca565b5161390a565b01610ebf565b5060409160017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f005582519182526020820152f35b90506001600160a01b03602084015116610f426001600160a01b03855116926004356004016120e4565b929091333b1561018257610f8a5f93604051958694859463691f9ed760e01b8652600486015260248501528960448501528a606485015260a0608485015260a4840191611d19565b038183335af190811561022c57859115610ea6579050610faa915061194a565b5f836001600160a01b03610ea6565b905088610ea0565b604492506040519163573b6f4160e01b835260048301526024820152fd5b84610e4b565b50610ff360408301516127dd565b6108db565b60405163315f9e2360e21b8152600490fd5b604051639c95219f60e01b8152600490fd5b3461018257602080600319360112610182576024816001600160a01b03611041611816565b16604051928380926370a0823160e01b82523060048301525afa90811561022c575f91611072575b50604051908152f35b90508181813d8311611098575b61108981836119b3565b81010312610182575182611069565b503d61107f565b34610182576110ad36611856565b6110b56126da565b6110c08486336127a9565b6110c9836127dd565b1561120e576110d9848633612b9b565b6110e38185613461565b15611208575082935b6110f885828833612e0a565b9690947f8045c25080b0868951141ed0a91720bcad09a8364a2b3109ee1fd49c1f0bc8b860c0611129898533612e68565b94906001600160a01b0360405192338452169a8b6020840152876040840152856060840152608083015260a0820152a1836111845760017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055005b6111fb9761028f9660ff946040519960078b5260208b015260408a01526060890152608088015260a08701521660c08501523360e0850152610100840193846040526111cf8561197a565b600785526111e061012082016121e8565b6111e985611fba565b526111f384611fba565b503691611dbe565b808080808080808061015c565b936110ec565b604051623a3a4d60e21b81523360048201526001600160a01b038616602482015260448101859052606490fd5b34610182576080366003190112610182576004356001600160a01b03908181168091036101825761126a61182c565b6044359167ffffffffffffffff916064358381116101825736602382011215610182578060040135938411610182573660248583010111610182576112f79560209216936112b9868587612d2b565b60405196879283926323e30c8b60e01b84523360048501528760248501528860448501525f606485015260a06084850152602460a485019201611d19565b03815f855af193841561022c575f94611363575b507f439148f0bbc682ca079e46d6e2c2f0c1e3b820f1a291b069d8882abf8cf18dd9840361134a5761133f93503091612da4565b602060405160018152f35b604051630b6c58a960e31b815260048101859052602490fd5b9093506020813d60201161138f575b8161137f602093836119b3565b810103126101825751928461130b565b3d9150611372565b346101825760603660031901126101825760206113c66113b5611816565b6113bd61182c565b60443591612b9b565b604051908152f35b34610182576113dc36611856565b839493926113e86126da565b6113f38486336127a9565b6113fc816127dd565b15611502578061141061145f928733612827565b9590967f7f9dfa19cf1cc2f806f2f860fbc9c056b601fb1afc0e9b843dfe5c63616268e660806040513381526001600160a01b0384169a8b60208301528560408301526060820152a1336128cd565b9590938261148d5760017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055005b6114f69661028f9560ff936040519860068a5260208a01526040890152606088015260808701521660a08501523360c085015260e0840193846040526114d28561197a565b600785526114e361010082016121e8565b6114ec85611faa565b526111f384611faa565b8080808080808061015c565b6040516306dde9c360e41b81523360048201526001600160a01b038616602482015260448101859052606490fd5b34610182576020366003190112610182576004355f525f6020526020600160405f205414604051908152f35b3461018257600319604036820112610182576004359067ffffffffffffffff808311610182578260040160a08436039384011261018257602435828111610182576115ab9036906004016117e5565b906115b46126da565b5f946001600160a01b0394856115c986611d05565b163303611770576115e26115dd3687611b44565b61271c565b91825f525f60205260405f2096600188541461162a575b60208960017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00556040519015158152f35b9091929394959697505f6001985560405191338352846020840152606060408401528161165689611842565b16606084015260248a013590606219018112156101825789019060a060808401528061168460048401611842565b1661010084015261169760248301611842565b1661012083015260448101356022198236030181121561018257019560246004880135970192871161018257863603831361018257602098608461175384936117127f09d18501db0080ca2d6cd7c17fa7255daff4b2d503ea93b76ff68b6752ea8e63976117639c6060610140890152610160880191611d19565b6117446117396117256044880185611d39565b605f198a8603810160a08c01529491611d6e565b926064870190611d39565b918784030160c0880152611d6e565b91013560e08301520390a161274d565b82808080808080806115f9565b60248661177c87611d05565b6040516335252be360e01b815291166004820152fd5b34610182576020366003190112610182576004359063ffffffff60e01b82168092036101825760209163e414309160e01b81149081156117d4575b5015158152f35b6301ffc9a760e01b149050836117cd565b9181601f840112156101825782359167ffffffffffffffff8311610182576020808501948460051b01011161018257565b600435906001600160a01b038216820361018257565b602435906001600160a01b038216820361018257565b35906001600160a01b038216820361018257565b906080600319830112610182576004356001600160a01b0381168103610182579160243591604435916064359067ffffffffffffffff82116101825761189e916004016117e5565b9091565b805180835260209291819084018484015e5f828201840152601f01601f1916010190565b60a0810190811067ffffffffffffffff8211176118e257604052565b634e487b7160e01b5f52604160045260245ffd5b6060810190811067ffffffffffffffff8211176118e257604052565b6040810190811067ffffffffffffffff8211176118e257604052565b6080810190811067ffffffffffffffff8211176118e257604052565b67ffffffffffffffff81116118e257604052565b60e0810190811067ffffffffffffffff8211176118e257604052565b610100810190811067ffffffffffffffff8211176118e257604052565b6020810190811067ffffffffffffffff8211176118e257604052565b90601f8019910116810190811067ffffffffffffffff8211176118e257604052565b92919267ffffffffffffffff82116118e257604051916119ff601f8201601f1916602001846119b3565b829481845281830111610182578281602093845f960137010152565b9080601f8301121561018257816020611a36933591016119d5565b90565b91906060838203126101825760405190611a52826118f6565b8193611a5d81611842565b8352611a6b60208201611842565b602084015260408101359167ffffffffffffffff831161018257604092611a929201611a1b565b910152565b67ffffffffffffffff81116118e25760051b60200190565b929192611abb82611a97565b604092611acb60405192836119b3565b819581835260208093019160061b84019381851161018257915b848310611af457505050505050565b8583830312610182578386918251611b0b81611912565b611b1486611842565b81528286013583820152815201920191611ae5565b9080601f8301121561018257816020611a3693359101611aaf565b91909160a0818403126101825760405190611b5e826118c6565b8193611b6982611842565b835267ffffffffffffffff9160208101358381116101825782611b8d918301611a39565b602085015260408101358381116101825782611baa918301611b29565b6040850152606081013592831161018257611bcb6080939284938301611b29565b60608501520135910152565b909291611be384611a97565b916040611bf360405194856119b3565b839580855260208095019160059160051b8401948086116101825784935b868510611c22575050505050505050565b67ffffffffffffffff90853582811161018257870190606082850312610182578451611c4d816118f6565b611c5683611842565b81528a83013584811161018257830185601f8201121561018257803590611c7c82611a97565b91611c89895193846119b3565b8083528d808401918b1b83010191888311610182578e809101915b838310611cda57509150508201528583013593841161018257611ccb858c95869501611a1b565b86820152815201940193611c11565b82358152918101918f9101611ca4565b9080601f8301121561018257816020611a3693359101611bd7565b356001600160a01b03811681036101825790565b908060209392818452848401375f828201840152601f01601f1916010190565b9035601e198236030181121561018257016020813591019167ffffffffffffffff8211610182578160061b3603831361018257565b9190808252602080920192915f905b828210611d8b575050505090565b909192936001906001600160a01b03611da387611842565b16815285830135838201526040908101950193920190611d7d565b90929192611dcb81611a97565b91604091611ddc60405194856119b3565b839581855260208095019160051b8301938185116101825783925b858410611e075750505050505050565b67ffffffffffffffff908435828111610182578601908382860312610182578351611e3181611912565b82358481116101825786611e46918501611a39565b81528983013593841161018257611e61868b95869501611cea565b83820152815201930192611df7565b903590601e1981360301821215610182570180359067ffffffffffffffff821161018257602001918160051b3603831361018257565b60405190611eb3826118f6565b60606040835f81525f60208201520152565b60405190611ed2826118c6565b5f608083828152611ee1611ea6565b6020820152606060408201526060808201520152565b9015610e1e57803590607e1981360301821215610182570190565b903590609e1981360301821215610182570190565b903590601e1981360301821215610182570180359067ffffffffffffffff821161018257602001918160061b3603831361018257565b9190811015610e1e5760061b0190565b805115610e1e5760200190565b805160011015610e1e5760400190565b805160021015610e1e5760600190565b805160031015610e1e5760800190565b805160041015610e1e5760a00190565b805160051015610e1e5760c00190565b8051821015610e1e5760209160051b010190565b3580151581036101825790565b9081518082526020808093019301915f5b82811061200a575050505090565b835180516001600160a01b031686528201518583015260409094019392810192600101611ffc565b906080806120a861209661208460406001600160a01b0380895116885260208901519060a060208a01528082511660a08a015260208201511660c08901520151606060e08801526101008701906118a2565b60408701518682036040880152611feb565b60608601518582036060870152611feb565b93015191015290565b9081518082526020808093019301915f5b8281106120d0575050505090565b8351855293810193928101926001016120c2565b903590601e1981360301821215610182570180359067ffffffffffffffff82116101825760200191813603831361018257565b903590605e1981360301821215610182570190565b6121436115dd61213c8380611f12565b3690611b44565b5f525f602052600160405f2054036121df5780612163816121cf93611f12565b6121c76121826121876020850135938460408701359384923690611b44565b612ed1565b61219f6121948580611f12565b946060810190611e70565b92906121bf604051966121b188611997565b5f88525f3681373690611b44565b933691611bd7565b923392613102565b6040810151606090910151600192565b505f905f905f90565b5f5b60e081106121f6575050565b6060828201526020016121ea565b5f5b82811061221257505050565b606082820152602001612206565b926001600160a01b038451166001600160a01b03835116146126c8576001600160a01b03612255606086015160643590611fca565b515116906040830151916001600160a01b036122746084358095611fca565b51511614801590612688575b610dd8576040850151906001600160a01b0361229f6044358094611fca565b5151166001600160a01b036122ba60643560608a0151611fca565b51511614612676576122cb8661271c565b805f525f60205260405f20541561262357506122e68461271c565b805f525f60205260405f2054156125cf57506123c992916123a3917f6fa7f4c28634b0a9d6831401c45ae468195fb63aed07308935c35374ff5d9e396040518061234e61234061012033845280602085015283018d612032565b82810360408401528a612032565b85606083015260643560808301528760a083015260a43560c083015260c43560e083015260e4356101008301520390a16001600160a01b038651166040519261239684611997565b5f8452606435908a613102565b936001600160a01b03865116604051926123bc84611997565b5f845260a4359086613102565b916123d760408201516127dd565b1580156125bb575b80156125a8575b8015612595575b61258357604051916123fe8361192e565b5f83525f60208401525f60408401525f606084015261241d84836147dd565b8452604084015261244361243183866147dd565b6020860152806060860152845161352c565b94612457602085015160408601519061352c565b936124618761343e565b8015612574575b6125625761252961255b957fd9fa84dd790c969daa5c33d8050dc06b4a9b59d5b42e2be5f5e8ae20447f618d9461250b6125609a60a0966124aa8a8851613580565b6124b88c6020890151613580565b6124c68a60408901516135de565b6124d48c60608901516135de565b6124dd8a61390a565b6124e68c61390a565b6001600160a01b0361250260c435926060606435910151611fca565b515116336128cd565b50506001600160a01b0361250260e43592606060a435910151611fca565b5050606060405191338352805160208401526020810151604084015260408101518284015201516080820152a1613731565b613731565b565b604051630d86822160e01b8152600490fd5b5061257e8561343e565b612468565b6040516321badf1f60e01b8152600490fd5b506125a3606084015161343e565b6123ed565b506125b6606082015161343e565b6123e6565b506125c960408401516127dd565b156123df565b9351604080513381526001600160a01b039092166020830152810194909452507fb70c12fa453793fa6818ec07c91e74363a47aa6a6829dcd9533937fdf30314f3945091925082915050606081015b0390a1565b9551604080513381526001600160a01b039092166020830152810196909652507fb70c12fa453793fa6818ec07c91e74363a47aa6a6829dcd9533937fdf30314f39493508392505060608201905061261e565b604051631cd2f1c760e21b8152600490fd5b506001600160a01b036126a2606085015160a43590611fca565b5151166001600160a01b036126be604088015160443590611fca565b5151161415612280565b604051630a98f1f360e21b8152600490fd5b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00600281541461270a5760029055565b604051633ee5aeb560e01b8152600490fd5b604051612747816127396020820194602086526040830190612032565b03601f1981018352826119b3565b51902090565b612560929161277861028f923390919060405192600284526020840152604083015260608201604052565b92604051936127868561197a565b60078552612796602086016121e8565b61279f85611f6d565b526111f384611f6d565b9091156127b4575050565b6040516305dbdfd960e41b81526001600160a01b03918216600482015291166024820152604490fd5b6127fc905f60e01d906001600160e01b038160e01d9116601b0b614840565b1290565b906127fc916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b6148c1565b92919261283382613b05565b9361283d8161343e565b6128bb5784816001600160e01b0361285c9360e01d9116601b0b614940565b9290809315612892575b50829081612876575b5050509190565b61288a926001600160a01b03309216612da4565b5f818161286f565b9092505f1981146128a757600101915f612866565b634e487b7160e01b5f52601160045260245ffd5b604051632eaefac360e21b8152600490fd5b939291936128da8361343e565b61297857846128f6576128ee939450612e68565b50505f905f90565b6001600160a01b039392919380911694855f52602060018152604092835f20961695865f528152825f20825f528152612933835f20549485613556565b9561293d8761343e565b612960575f97885260018252838820908852815282872091875252909320829055565b835163c5e12af560e01b815260048101889052602490fd5b60405163793a8f5560e01b815260048101849052602490fd5b6040805192936129a08461197a565b6007845260206129b18186016121e8565b5f5b84518110156129e657806129c960019287611fca565b516129d48289611fca565b526129df8188611fca565b50016129b3565b50925092939093335f52308352845f2092855191612a0383611912565b612a0b611ea6565b835260608281940152865193612a2085611997565b5f8552875190612a2f82611997565b5f82525f3681375f5b8151811015612b8f57612a4b8183611fca565b51908a8251015151612a62575b6001915001612a38565b8a89875f612a73828701518a613c40565b938651946001600160a01b0394828680895116968901511697015190835197612a9b8961195e565b88528d88015282870152828d87015260808601528c60a08601528860c086015251809263d04dfe2360e01b82528180612ad860049889830161304a565b03915afa948515612b855789915f96612b5f575b508551612afd575b50505050612a58565b5101511692833b1561018257612b2b935f92838f5180978195829463012c676d60e21b8452339084016136f0565b03925af1918215612b5557600192612b46575b808781612af4565b612b4f9061194a565b5f612b3e565b8b513d5f823e3d90fd5b612b7c9196503d805f833e612b7481836119b3565b810190612f06565b9050945f612aec565b8e513d5f823e3d90fd5b50505050505050509050565b8215612bd0576001600160a01b038091165f52600160205260405f2091165f5260205260405f20905f5260205260405f205490565b909150612bdc82613be4565b6001600160a01b03809316906040918251946370a0823160e01b86528416938460048701526020928387602481865afa968715612cf2575f97612cfc575b5083612c33612c2c83612c639a614a6c565b5090614280565b508651636eb1769f60e11b81526001600160a01b0390941660048501523060248501529297889081906044820190565b0381865afa968715612cf2575f97612cc1575b50612c2c612c8791611a3698614a6c565b50612c928183613461565b15612cb95750935b5f5260018252825f20905f528152815f20905f8052525f205490613556565b905093612c9a565b96508387813d8311612ceb575b612cd881836119b3565b8101031261018257955195612c2c612c76565b503d612cce565b85513d5f823e3d90fd5b96508387813d8311612d24575b612d1381836119b3565b810103126101825795519583612c1a565b503d612d09565b6040519263a9059cbb60e01b5f526001600160a01b0380931660045260245260205f60448180855af160015f5114811615612d85575b8360405215612d6f57505050565b635274afe760e01b835216600482015260249150fd5b6001811516612d9b57813b15153d151616612d61565b833d5f823e3d90fd5b9092604051936323b872dd60e01b5f526001600160a01b0393848092166004521660245260445260205f60648180855af160015f5114811615612df4575b836040525f60605215612d6f57505050565b6001811516612d9b57813b15153d151616612de2565b93929193612e178361343e565b6129785784612e2b576128ee939450612827565b6001600160a01b039392919380911694855f52602060018152604092835f20961695865f528152825f20825f528152612933835f2054948561352c565b90929192612e7581613b05565b93612e7f8161343e565b612ebf5784816001600160e01b03612e9e9360e01d9116601b0b614940565b50809281612ead575050509190565b6001600160a01b0361288a9316612d2b565b604051632d1671a360e11b8152600490fd5b91612efc906060612ef1936001600160a01b039485916040880151611fca565b515116940151611fca565b5151161461267657565b919060408382031261018257825167ffffffffffffffff908181116101825784019082601f83011215610182578151602092612f4182611a97565b91612f4f60405193846119b3565b808352848084019160051b830101918683116101825785809101915b838310612fde5750505050948281015191821161018257019180601f84011215610182578251612f9a81611a97565b93612fa860405195866119b3565b818552838086019260051b820101928311610182578301905b828210612fcf575050505090565b81518152908301908301612fc1565b8251815291810191869101612f6b565b90808251908181526020809101926020808460051b8301019501935f915b84831061301c5750505050505090565b909192939495848061303a600193601f198682030187528a516120b1565b980193019301919493929061300c565b91906020928381526001600160a01b0382511684820152838201516040820152613084604083015160e060608401526101008301906118a2565b90606083015160808201526130ab608084015192601f1993848483030160a0850152612fee565b9260a081015193838382030160c08401528680865192838152019501905f5b8181106130ee57505050611a3694955060c060e091015192828503019101526120b1565b8251875295880195918801916001016130ca565b949193613347919360c0915f6132ce6040928351946131208661195e565b613128611ec5565b86526020958487820152848682015260609781868a809401528260808201528660a0820152015261327e85519161315e8361197a565b6007835261316d8884016121e8565b8d6131778161271c565b9c896001600160a01b039e8f94859182865116908d5194600486528501528c840152168c82015233608082015260a081018a526131b386611f6d565b526131bd85611f6d565b5088516131c9816118f6565b6002815289368c8301376131dc86611f7a565b526131e685611f7a565b5060ff8a6132498b8501936132338761320c81613204858a51611fca565b515116613be4565b9751168861321b848951611fca565b5151168561322a858a51611fca565b51015191612b9b565b9661323f828751611fca565b5151169451611fca565b51015192169093929190604051946005865260208601526040850152606084015260808301525f60a083015260c08201604052565b61328782611f8a565b5261329181611f8a565b506132b58a8d8d60ff8a6132498d8501936132338761320c81613204858a51611fca565b6132be82611f9a565b526132c881611f9a565b50613c40565b95878a511697848b0191825191868184511693015116928a855230875285808620915101518651916132ff83611997565b86835287519561330e8761195e565b86528886015286850152848885015289608085015260a084015260c08301528351808098819463d04dfe2360e01b83526004830161304a565b03915afa968715613434575f945f98613412575b508451600281106133fb5750818386015195015161338161337b88611faa565b51611f9a565b5161338c8183613461565b156133f35750925b6133b68685919060405192600284526020840152604083015260608201604052565b6133bf88611f8a565b526133c987611f8a565b508251996133d68b61195e565b8a52890152870152850152608084015260a083015260c082015290565b905092613394565b602490835190630fbb8e5560e21b82526004820152fd5b90975061342a9194503d805f833e612b7481836119b3565b939093965f61335b565b50513d5f823e3d90fd5b61345d905f60e01d906001600160e01b038160e01d9116601b0b614840565b1390565b9061345d916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b6148c1565b6134af6001600160e01b0392838316601b0b9260e01d938160e01d9116601b0b8484614037565b90637ffffff582136134ff575b906134c691614280565b92909215806134f7575b6134d957505090565b6044925060405191638eba4d0760e01b835260048301526024820152fd5b5082156134d0565b6135098282614f20565b156134bc57604483856040519163d556b11160e01b835260048301526024820152fd5b611a3691610bd2916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b614486565b611a3691610bd2916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b61464a565b6135da91608081018261359c6135968351611faa565b51611faa565b526135d36135cd6001600160a01b038094515116936135c46135be8551611faa565b51611f6d565b51169251611faa565b51611f8a565b5191612e0a565b5050565b906080810191806135f26135968551611f9a565b526001600160a01b0380925151169161360e6135be8551611f9a565b511661361d6135cd8551611f9a565b5190816136b85761362d8361343e565b612978579183917f4cb6e22a3e7e651d7cf0376cff48f20f5007a54147777865be7f5f6c38c50f4a959361261e955f5260209060018252613683604094855f20835f528452855f20855f528452855f2054613556565b945f5260018252835f20905f528152825f20915f52525f20555b51604051918291338352604060208401526040830190612fee565b916136e9917f4cb6e22a3e7e651d7cf0376cff48f20f5007a54147777865be7f5f6c38c50f4a959361261e956128cd565b505061369d565b90604082019082526020606081936040838201528551809452019301915f5b82811061371d575050505090565b83518552938101939281019260010161370f565b60c0810151908151915f926138a5575b506137e66020918281510151926001600160a01b039081818187511696015116928660a082019485518252308452604097888320898686510151015160808601518b519161378e83611997565b8683528c519361379d85611997565b8785528d51966137ac8861195e565b8752898701528c86015260016060860152608085015260a084015260c08301528851808099819463d04dfe2360e01b83526004830161304a565b03915afa94851561389b57879561387d575b508451613809575b50505050505050565b81905101510151169051813b156138795791849184938361383e965180978195829463012c676d60e21b8452600484016136f0565b03925af19081156138705750613859575b8080808080613800565b613863829161194a565b61386d578061384f565b80fd5b513d84823e3d90fd5b8480fd5b6138929195503d8089833e612b7481836119b3565b9050935f6137f8565b86513d89823e3d90fd5b6001600160a01b03602080845101510151169060a083015190823b15610182576138e8925f928360405180968195829463012c676d60e21b8452600484016136f0565b03925af1801561022c57156137415761390291925061194a565b5f905f613741565b6080810161391b6135cd8251611f9a565b5191821561392857505050565b6139426135be6001600160a01b0380935151169351611f9a565b5116815f5260209160018352604092835f20835f528152835f20855f528152835f2054936001600160e01b03851661397d575b505050505050565b6139a1955f9284845260018152828420868552815282842091845252812055612e68565b5f808080613975565b81156139b4570490565b634e487b7160e01b5f52601260045260245ffd5b6040815110613a10576020810151908051603f1981019081116128a75760051c82116139fc5760016020920160051b010190565b5050604051613a0a81611997565b5f815290565b50604051613a0a81611997565b805115613a2d57602001515f1a90565b505f90565b905f8091602081519101845af48080613ab0575b15613a665750506040513d81523d5f602083013e60203d82010160405290565b15613a8d57604051639996b31560e01b81526001600160a01b039091166004820152602490fd5b3d15613a9e576040513d5f823e3d90fd5b60405163d6bda27560e01b8152600490fd5b503d151580613a465750813b1515613a46565b60041115613acd57565b634e487b7160e01b5f52602160045260245ffd5b602090939291936001600160a01b036040820195168152613b0183613ac3565b0152565b613b0d61500e565b6040805163b7bad1b160e01b81526001600160a01b0383166004820152909182826024815f73200e12d10bb0c5e4a17e7018f0f1161919bb93895af1928315613bdb575f925f94613ba6575b50613b6383613ac3565b600183141580613b94575b613b785750505090565b5163ee07877f60e01b81529182916106df919060048401613ae1565b50613b9e83613ac3565b821515613b6e565b90809450613bca9293503d8511613bd4575b613bc281836119b3565b810190614916565b919091925f613b59565b503d613bb8565b513d5f823e3d90fd5b613bec61500e565b60408051630782d7e160e01b81526001600160a01b03831660048201529091828260248173200e12d10bb0c5e4a17e7018f0f1161919bb93895afa928315613bdb575f925f94613ba65750613b6383613ac3565b90805191613c4d83611a97565b91613c68604094613c60865195866119b3565b808552611a97565b601f199460209186013686840137835183519095908015613e67576001613cbe9101965b6001978891010197613cb5613ca08a611a97565b99613cad86519b8c6119b3565b808b52611a97565b01848901612204565b85805f9684516002815233878201523086820152606081018652613ce18b611f6d565b52613ceb8a611f6d565b505f925b613e23575b5050508351613d07575b50505050505090565b85809598979692980181613d1b8289611fca565b52613d268188611fca565b505f925b613d39575b5085969750613cfe565b8451831015613e1e576001600160a01b03613db081613d588689611fca565b51511686613d66878a611fca565b51015187815160051b9101207f19457468657265756d205369676e6564204d6573736167653a0a3332000000005f52601c52603c5f208c613da7888b611fca565b51015191614a9a565b15613e0657868098999a928192613dc7878a611fca565b515116613dd48787611fca565b52019385613de28289611fca565b510151613def868c611fca565b52613dfa858b611fca565b50019290989796613d2a565b8951630a57f30960e31b815260048101859052602490fd5b613d2f565b9091968151881015613e5e578280910197613e3e8184611fca565b51613e498a8d611fca565b52613e54898c611fca565b5001919081613cef565b96829150613cf4565b50613cbe5f96613c8c565b9091939284158215175f14613e8c5750505090505f905f90565b82810192600160fd1b8082019083011760fe1c613fc3575b5050613eaf81614be5565b93613eb981614be5565b94613ec48682614c05565b90918215613fb4575f9083986f0785ee10d5da46d900f436a000000000808611613fa6575b50670de0b6b3a7640000808b11613f97575b50633b9aca00808b11613f88575b50612710808b11613f7a575b5098805b613f695750819061189e989982600a0a9109960195817fcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccd0a93838211900382610100031b9203901c170291614c18565b60019290920191600a900480613f19565b60049a04998a930192613f15565b600991939a049901915f613f09565b601291939a049901915f613efb565b85049950602592505f613ee9565b5092905061189e949550614c18565b5f82121561401757808413614009575b7f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb2841315613ea45790925061189e939491614b23565b90925061189e939491614b8a565b80841215613fd35790925061189e939491614b23565b6134c68282614280565b9290918061405d576044848460405191637a97930f60e01b835260048301526024820152fd5b90919280155f1461407257505050505f905f90565b61408b9361407f91614cd2565b92919490938492614cd2565b909391928461409988614be5565b916140a386614be5565b947f161bcca7119915b50764b4abe86529797775a5f171951000000000000000000094604c9186881061424a575b030191600160ff1b98838a018112155f14614217575050035b5f955f82128061420e575b6141f0575b5f8112806141de575b6141c05786820103966001600160ff1b03881490816141b6575b50806141ad575b806141a4575b61418657509061413a9291614e7e565b915f811361414d575b5061189e93614c18565b9091604c821361417b5761416491600a0a906139aa565b908115614171575f614143565b505050505f905f90565b50505050505f905f90565b876044916040519163d556b11160e01b835260048301526024820152fd5b505f851261412a565b50828414614124565b905088145f61411d565b604489836040519163d556b11160e01b835260048301526024820152fd5b50806001600160ff1b03018213614103565b95508087018613156142085786818703015b956140fa565b5f614202565b505f81136140f5565b89985090920390506001600160ff1b038190038701821361423b57018601946140ea565b5050505050505050505f905f90565b7f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee80000000000000000009650604b92506140d1565b81156139b4570590565b8082601b82810b8314614475577d90e40fbeea1d3a4abc8955e946fe31cdcf66f634e10000000000000000008405614421575b8380820b0361441057507b199999999999999999999999999999999999999999999999999999987b0ccccccccccccccccccccccccccccccccccccccccccccccccccccccc840111156143c1575b838060030b03614345575b8084136143295750506001600160e01b036001925b60e01b91161791565b8303600a0a80156139b4576001600160e01b0391071592614320565b92915f84131561439557509061435b8383614f20565b61437757637ffffffe1901600a0a810290637fffffff9261430b565b506044916040519163d556b11160e01b835260048301526024820152fd5b637fffffff19928303906043821361417b576143b491600a0a90614276565b918215614171579261430b565b5f198401808060030b146143d55750614300565b90506001600160e01b039293507b7fffffffffffffffffffffffffffffffffffffffffffffffffffffff915060e01b9260ff1d181617905f90565b600190940193600a909305926142b3565b937f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee8000000000000000000840515614462576305f5e100600894058094819201955b9150506142b3565b620186a06005940580948192019561445a565b508261430057505050505f90600190565b919291600160ff1b840161449e5761189e9350614f39565b9061189e935f039161464a565b919291600160ff1b91908015806146385750906144c791614cd2565b9490929091905f86858585828213801561462f575b614612575b505050508682841860ff1c94860391039081604c0381116145f75701600a0a8082059190846145dd575b505081019182821860ff1c11156145d557826001600160ff1b03146145b757905f600192135f1461458857600a9004915b01925b8115811761454c57509190565b80614565575b50801561455d579190565b505f91508190565b919261457b9203600160ff1b01600a0a90614276565b600160ff1b91905f614552565b600a60037fe666666666666666666666666666666666666666666666666666666666666667920104019161453c565b604490836040519163d556b11160e01b835260048301526024820152fd5b50909261453f565b81076145ea575b8061450b565b60ff1d600117015f6145e4565b505050919350614605579190565b60018160ff1d1790039190565b5f9a50909750909550600160ff1b945092509050868080806144e1565b50835f126144dc565b156146435750509190565b9350919050565b939291938415811581811761479b5750509061466591614cd2565b919490829561467682958294614cd2565b8096929491969387868482138015614792575b614779575b5050505050508682841860ff1c94860391039081604c0381116145f75701600a0a80820591908461475f575b505081019182821860ff1c111561475757826001600160ff1b03146145b757905f600192135f1461472857600a9004915b01925b811581176146fb57509190565b8061470b5750801561455d579190565b600160ff1b936147229291038401600a0a90614276565b5f614552565b600a60037fe66666666666666666666666666666666666666666666666666666666666666792010401916146eb565b5090926146ee565b810761476c575b806146ba565b60ff1d600117015f614766565b929b5098509196509450925090505f808080808061468e565b50858412614689565b93959390929190156147b157505061455d579190565b945092915050565b6008815110613a2d576008015167ffffffffffffffff1667ff0a89c674ee78741490565b9160408301926040614817610bd2606087519401938451906001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b613e72565b94519301614826815186612800565b61482e575050565b909350611a3691925051925183613488565b92915f9060018184145f871287151717176148ba575f928082136148ac575b03604c81135f8212176148a057600a0a908461487e8382029384614276565b146148935750501561488f575f9190565b5f90565b9093509015611a36579190565b50501561488f575f9190565b5f956001945092509061485f565b5050505f90565b93929190918083145f83125f87121883158715171717614910575f928082136149035703604c81135f8212176148a057600a0a908461487e8382029384614276565b919460019350919061485f565b50919050565b919082604091031261018257815160048110156101825760209092015160ff811681036101825790565b91925f831215614968576044838360405191634a7d166b60e01b835260048301526024820152fd5b91928361497a57505090505f90600190565b60ff8116820191808312614a42575f8312156149b2575050604c19811261455d575f03600a0a916149ab83826139aa565b9283021490565b909293915f81135f14614a3857604d8113614a0d57600a0a9283156139b457835f190483116149e45750500290600190565b60405163c849483b60e01b815260048101849052602481019290925260ff166044820152606490fd5b5060405163c849483b60e01b81526004810192909252602482015260ff919091166044820152606490fd5b5050905090600190565b60405163c849483b60e01b815260048101869052602481019190915260ff82166044820152606490fd5b9060ff165f03916001600160ff1b0382115f14614a9257600a6001818404940192061590565b909190600190565b9091813b614ad557614aac9192615077565b50614ab681613ac3565b159182614ac257505090565b6001600160a01b03918216911614919050565b6020918160645f935160405192630b135d3f60e11b9788855260048501526040602485015286820190604485015e8281018201859052601f01601f191601915afa905f5114601f3d11161690565b909392915f614b33918184613e72565b9490945f8483019182019412159081614b80575b8115614b76575b50614b5857505090565b604492506040519163d556b11160e01b835260048301526024820152fd5b905083125f614b4e565b8281129150614b47565b614b9f93600160fe1b90810193920190613e72565b9081815f821215614bd6575050604b1982126128ee57614bc4915f03600a0a90614276565b9081614bce575f90565b600160ff1b90565b93600160ff1b90910192509050565b5f811215611a3657600160ff1b90808203614bfe575090565b90505f0390565b905f198183099102908180821091030391565b92939291905f8184181215614cad576001600160ff1b039283831115614c9757600160ff1b93838503614c4d57505050509190565b90919293508514614c67575050600a600191045f03920190565b604051630ed8062160e21b8152600481019190915260248101919091526044810182905260648101849052608490fd5b5090915050600160ff1b81146128a7575f039190565b90916001600160ff1b038084111561286f578514614c67575050600a60019104920190565b9190918015614e7457827f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee800000000000000000080830515614d82575b507f19999999999999999999999999999999999999999999999999999999999999997f0ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc830110614d73575b8313614d5d5791905f90565b919060018060ff1b926001600160ff1b03030190565b9290600a02905f190192614d51565b6f4b3b4ca85a86c47a098a22400000000080840515614e62575b507728c87cb5c89a2571ebfdcb54864ada834a00000000000000830515614e4b575b7b097edd871cfda3a5697758bf0e3cbb5ac5741c640000000000000000830515614e37575b7e3899162693736ac531a5a58f1fbb4b746504382ca7e4000000000000000000830515614e2757820515614e18575b5f614d06565b9290600a02905f190192614e12565b9391606402916001190193614de3565b93916402540be40002916009190193614de3565b9391678ac7230489e8000002916012190193614dbe565b6025198301955092909202915f614d9c565b505f915081908190565b90915f198383099280830292838086109503948086039584871015614efc5714614ef4579082910960018219018216809204600280826003021880830282030280830282030280830282030280830282030280830282030280920290030293600183805f03040190848311900302920304170290565b505091500490565b60648386866040519263362ced0960e11b8452600484015260248301526044820152fd5b611a3691905f811215614f34575f036150b1565b6150b1565b909291600160ff1b91828101614fcb5750808414614fc157808413918215614fb9578185035b604c811115614fa85750505f915b15614f9957507f8000000000000000000000000000000000000000000000000000000000000001019190565b92506001600160ff1b03039190565b600a0a9081156139b4570491614f6d565b848203614f5f565b505090505f905f90565b93614fd892945f036144ab565b80939180928114614fec575b50505f039190565b915092506001600160ff1b0383146145b757600a600191059201915f80614fe4565b73200e12d10bb0c5e4a17e7018f0f1161919bb9389803b15801561504c575b6150345750565b602490604051906373e6d7b360e01b82526004820152fd5b507f1de7d717526cba131d684e312dedbf0852adef9cced9e36798ae4937f7145d41813f141561502d565b81519190604183036150a7576150a09250602082015190606060408401519301515f1a90615140565b9192909190565b50505f9160029190565b90637ffffff581131561513a57637ffffffe1981019060438213615133575f82121561510757637fffffff91505f0301600a0a7b8000000000000000000000000000000000000000000000000000000202111590565b50600a0a80156139b4577b80000000000000000000000000000000000000000000000000000001041090565b5050151590565b50505f90565b91907f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a084116151b7579160209360809260ff5f9560405194855216868401526040830152606082015282805260015afa1561022c575f516001600160a01b038116156151ad57905f905f90565b505f906001905f90565b5050505f916003919056"; + hex"6080806040526004361015610012575f80fd5b5f3560e01c90816301ffc9a714611792575080631f69cb751461155c5780632cb77e9f146115305780632fbc4ba0146113ce57806341d1514f146113975780635cffe9de1461123b578063607461191461109f578063613255ab1461101c57806369c728561461072b578063709fb8a5146104375780639235084d146103e3578063ac9650d814610295578063d7e442ec14610237578063d9d98ce4146101865763fa501182146100c1575f80fd5b34610182576101403660031901126101825767ffffffffffffffff600435818111610182576100f4903690600401611b27565b6024358281116101825761010c903690600401611b27565b60c0366043190112610182576101043583811161018257610131903690600401611ccd565b90610124359384116101825761014e61015c943690600401611ccd565b926101576126bd565b612203565b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055005b5f80fd5b34610182576040366003190112610182576001600160a01b036101a7611816565b166040516370a0823160e01b8152306004820152602081602481855afa90811561022c575f916101fa575b50156101e25760206040515f8152f35b60249060405190633c5bf76960e21b82526004820152fd5b90506020813d602011610224575b8161021560209383611996565b810103126101825751826101d2565b3d9150610208565b6040513d5f823e3d90fd5b346101825760203660031901126101825760043567ffffffffffffffff81116101825761028f61026e61015c9236906004016117e5565b91906102786126bd565b604051926102858461197a565b5f84523691611da1565b90612bb1565b34610182576020806003193601126101825760043567ffffffffffffffff8111610182576102c79036906004016117e5565b9190604051926102d68461197a565b5f84528284016102e582611a7a565b946102f36040519687611996565b8286526102ff83611a7a565b9361031186880195601f1901866121e7565b5f5b84811061037557604080518881528951818a018190525f92600582901b83018101918a918c9085015b8287106103495785850386f35b909192938280610365600193603f198a820301865288516118a2565b960192019601959291909261033c565b806103c4886103be61039160019560059d9c9d1b8701876120c7565b929089846040519586938585013782018381015f81528b519283915e015f83820152038084520182611996565b30613a26565b6103ce828a611fad565b526103d98189611fad565b5001969596610313565b3461018257600319602036820112610182576004359067ffffffffffffffff82116101825760809082360301126101825761042260609160040161210f565b90604051921515835260208301526040820152f35b34610182576003196040368201126101825760043567ffffffffffffffff8082116101825760c08260040193833603011261018257602435908111610182576104849036906004016117e5565b61048f9291926126bd565b6104c06104bb6104b66104af6104a588806120fa565b60408101906120c7565b36916119b8565b6139bc565b613a11565b801561071957600110156107075760248201926104dd8486611f0a565b9050156106f55760448301936104f38587611f0a565b9050156106e3576105596105219561054d6105186105118a806120fa565b948a611f0a565b9890928a611f0a565b91909261053e60405196610534886118c6565b3388523690611a1c565b9960209a8b8801523691611a92565b60408501523691611a92565b606082015260648401356080820152610571816126ff565b90815f525f865260405f209485541595866105b5575b878760017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055604051908152f35b6001905560a46001600160a01b03917f87491344dfbcf91f6cbbc610cbbeedc85313d37a02df0c93527f7ea5f8db717f83855116604051908152868b82015260606040820152806106096060820188612015565b0390a10191610618838a6120c7565b905061063b575b50505061062e93949550612730565b8190838080808080610587565b6106486104af848b6120c7565b610651816147ad565b156106bc57509761068f7fd46c2c56b35c8210e9e712ec3f02242d5fc90187c0ac8ed80cc33626846ec369936106af9361062e999a9b5116926120c7565b92906040519384938452868c850152606060408501526060840191611cfc565b0390a1859493878061061f565b886106df604051928392630c89984b60e31b8452600484015260248301906118a2565b0390fd5b60405163540e5f0b60e01b8152600490fd5b604051636c44ef8f60e01b8152600490fd5b604051633c8270bd60e21b8152600490fd5b604051632cff108b60e21b8152600490fd5b34610182576003196020368201126101825767ffffffffffffffff600435116101825760c09060043536030112610182576107646126bd565b5f808061077960048035608481019101611e53565b90501561100a576024600435013592610791846127c0565b15610ff8576060806040516107a58161192e565b6107ad611ea8565b81525f60208201525f604082015201526107c5611ea8565b506108256108206107ff6107f56107ef6107e9608460043501600435600401611e53565b90611eda565b80611ef5565b6040810190611f0a565b60206108186107e9608460043501600435600401611e53565b013591611f40565b611ce8565b936001600160a01b0361087461082061085b6108516107ef6107e9608460043501600435600401611e53565b6060810190611f0a565b60406108186107e9608460043501600435600401611e53565b8160405197610882896118f6565b16875216602086015260408501526108a4608460043501600435600401611e53565b9490506001604051955f87520160051b85016040525f905f5b6108d1608460043501600435600401611e53565b9050811080610fe5575b15610e32576108f4608460043501600435600401611e53565b821015610e1e578160051b810135607e198236030181121561018257608081830136031261018257604051916109298361192e565b8181013567ffffffffffffffff81116101825761094b90369084840101611b27565b835280820160208181013590850152604080820135908501526060013567ffffffffffffffff8111610182576109849236920101611ccd565b606082015280516001600160a01b036109a66040830151602085015190611fad565b5151166001600160a01b0385511614801590610dea575b610dd8576109d5602083015160408401519083613102565b6109de816126ff565b91825f525f60205260405f2054155f14610a42575051604080513381526001600160a01b039092166020830152810191909152600191907fb70c12fa453793fa6818ec07c91e74363a47aa6a6829dcd9533937fdf30314f390606090a15b016108bd565b9190610a73602084979597015160408501519060608601519060405192610a688461197a565b5f8452339186613137565b925f93610a8b606082015160446004350135906127e3565b15610af257505051604080513381526001600160a01b03909216602083015281019190915260019291907fe3151dc8cb7a54ffc4baabd28c1f241c94d510b5e5b502491ac3cad6c16316d590606090a15b8115610aea575b5092610a3c565b905088610ae3565b610aff60408201516127c0565b158015610dc5575b15610b5c57505051604080513381526001600160a01b03909216602083015281019190915260019291907f500b713857325f9e6dcb52ae832eca9109d107ed1aae9cb4928b4c1e13f051aa90606090a1610adc565b9250925050600196959691610b75606460043501611fc1565b15610d325796610be597610bf560408401516040880151610b968183613496565b15610d2a5750925b610bef848592610bd8610bd260608a01516001600160e01b03601b918660e01d92828816810b928260e01d9216900b613e66565b90614021565b9d8e9260408d0151613561565b60408c015261358b565b9961358b565b98610c0084846135b5565b610c0a8482613613565b60405192338452608060208501526060610c308451608080880152610100870190612015565b93602081015160a0870152604081015160c0870152015192607f198582030160e0860152835180825260208201906020808260051b8501019601925f5b828110610ccc57505050505092806001979695937f194f1feb3b4d7076a2c272e774e792e0c48bb8c7aa1a9a3671c1cd6da9e6b4c193610cc796604084015260608301520390a180858c5101808d5260051b8c0152613725565b610adc565b9091929396602080610d1d600193601f198782030189528b51906001600160a01b0382511681526040610d0c858401516060878501526060840190612094565b9201519060408184039101526118a2565b9901950193929101610c6d565b905092610b9e565b610be590610bf56060840151610bef610d70610bd260408801516001600160e01b0394601b90868360e01d9316820b91878260e01d9216900b613e66565b60408a0151610d7f8183613496565b15610dbd5750915b829c8d916060890151908116155f14610dae575060408801515b96879460408d0151613561565b610db890856134bd565b610da1565b905091610d87565b50610dd36060820151613473565b610b07565b60405163936bb5ad60e01b8152600490fd5b506001600160a01b03610e066060830151604085015190611fad565b5151166001600160a01b0360208601511614156109bd565b634e487b7160e01b5f52603260045260245ffd5b50919390610e44606460043501611fc1565b15610fdf57835b6004356004013590610e5d8282613496565b610fc15750508490610e7d856001600160a01b0360208701511633613099565b505060a46004350190610e95826004356004016120c7565b905015159081610fb9575b50610f18575b506001600160a01b03610ebc929351163361280a565b50505b8351811015610ee45780610ede610ed860019387611fad565b516138fe565b01610ebf565b5060409160017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f005582519182526020820152f35b90506001600160a01b03602084015116610f426001600160a01b03855116926004356004016120c7565b929091333b1561018257610f8a5f93604051958694859463691f9ed760e01b8652600486015260248501528960448501528a606485015260a0608485015260a4840191611cfc565b038183335af190811561022c57859115610ea6579050610faa915061194a565b5f836001600160a01b03610ea6565b905088610ea0565b604492506040519163573b6f4160e01b835260048301526024820152fd5b84610e4b565b50610ff360408301516127c0565b6108db565b60405163315f9e2360e21b8152600490fd5b604051639c95219f60e01b8152600490fd5b3461018257602080600319360112610182576024816001600160a01b03611041611816565b16604051928380926370a0823160e01b82523060048301525afa90811561022c575f91611072575b50604051908152f35b90508181813d8311611098575b6110898183611996565b81010312610182575182611069565b503d61107f565b34610182576110ad36611856565b6110b56126bd565b6110c084863361278c565b6110c9836127c0565b1561120e576110d9848633612dcc565b6110e38185613496565b15611208575082935b6110f88582883361303b565b9690947f8045c25080b0868951141ed0a91720bcad09a8364a2b3109ee1fd49c1f0bc8b860c0611129898533613099565b94906001600160a01b0360405192338452169a8b6020840152876040840152856060840152608083015260a0820152a1836111845760017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055005b6111fb9761028f9660ff946040519960078b5260208b015260408a01526060890152608088015260a08701521660c08501523360e0850152610100840193846040526111cf8561195e565b600685526111e061012082016121cb565b6111e985611f9d565b526111f384611f9d565b503691611da1565b808080808080808061015c565b936110ec565b604051623a3a4d60e21b81523360048201526001600160a01b038616602482015260448101859052606490fd5b34610182576080366003190112610182576004356001600160a01b03908181168091036101825761126a61182c565b6044359167ffffffffffffffff916064358381116101825736602382011215610182578060040135938411610182573660248583010111610182576112f79560209216936112b9868587612f5c565b60405196879283926323e30c8b60e01b84523360048501528760248501528860448501525f606485015260a06084850152602460a485019201611cfc565b03815f855af193841561022c575f94611363575b507f439148f0bbc682ca079e46d6e2c2f0c1e3b820f1a291b069d8882abf8cf18dd9840361134a5761133f93503091612fd5565b602060405160018152f35b604051630b6c58a960e31b815260048101859052602490fd5b9093506020813d60201161138f575b8161137f60209383611996565b810103126101825751928461130b565b3d9150611372565b346101825760603660031901126101825760206113c66113b5611816565b6113bd61182c565b60443591612dcc565b604051908152f35b34610182576113dc36611856565b839493926113e86126bd565b6113f384863361278c565b6113fc816127c0565b15611502578061141061145f92873361280a565b9590967f7f9dfa19cf1cc2f806f2f860fbc9c056b601fb1afc0e9b843dfe5c63616268e660806040513381526001600160a01b0384169a8b60208301528560408301526060820152a1336128b0565b9590938261148d5760017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055005b6114f69661028f9560ff936040519860068a5260208a01526040890152606088015260808701521660a08501523360c085015260e0840193846040526114d28561195e565b600685526114e361010082016121cb565b6114ec85611f8d565b526111f384611f8d565b8080808080808061015c565b6040516306dde9c360e41b81523360048201526001600160a01b038616602482015260448101859052606490fd5b34610182576020366003190112610182576004355f525f6020526020600160405f205414604051908152f35b3461018257600319604036820112610182576004359067ffffffffffffffff808311610182578260040160a08436039384011261018257602435828111610182576115ab9036906004016117e5565b906115b46126bd565b5f946001600160a01b0394856115c986611ce8565b163303611770576115e26115dd3687611b27565b6126ff565b91825f525f60205260405f2096600188541461162a575b60208960017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00556040519015158152f35b9091929394959697505f6001985560405191338352846020840152606060408401528161165689611842565b16606084015260248a013590606219018112156101825789019060a060808401528061168460048401611842565b1661010084015261169760248301611842565b1661012083015260448101356022198236030181121561018257019560246004880135970192871161018257863603831361018257602098608461175384936117127f09d18501db0080ca2d6cd7c17fa7255daff4b2d503ea93b76ff68b6752ea8e63976117639c6060610140890152610160880191611cfc565b6117446117396117256044880185611d1c565b605f198a8603810160a08c01529491611d51565b926064870190611d1c565b918784030160c0880152611d51565b91013560e08301520390a1612730565b82808080808080806115f9565b60248661177c87611ce8565b6040516335252be360e01b815291166004820152fd5b34610182576020366003190112610182576004359063ffffffff60e01b82168092036101825760209163e414309160e01b81149081156117d4575b5015158152f35b6301ffc9a760e01b149050836117cd565b9181601f840112156101825782359167ffffffffffffffff8311610182576020808501948460051b01011161018257565b600435906001600160a01b038216820361018257565b602435906001600160a01b038216820361018257565b35906001600160a01b038216820361018257565b906080600319830112610182576004356001600160a01b0381168103610182579160243591604435916064359067ffffffffffffffff82116101825761189e916004016117e5565b9091565b805180835260209291819084018484015e5f828201840152601f01601f1916010190565b60a0810190811067ffffffffffffffff8211176118e257604052565b634e487b7160e01b5f52604160045260245ffd5b6060810190811067ffffffffffffffff8211176118e257604052565b6040810190811067ffffffffffffffff8211176118e257604052565b6080810190811067ffffffffffffffff8211176118e257604052565b67ffffffffffffffff81116118e257604052565b60e0810190811067ffffffffffffffff8211176118e257604052565b6020810190811067ffffffffffffffff8211176118e257604052565b90601f8019910116810190811067ffffffffffffffff8211176118e257604052565b92919267ffffffffffffffff82116118e257604051916119e2601f8201601f191660200184611996565b829481845281830111610182578281602093845f960137010152565b9080601f8301121561018257816020611a19933591016119b8565b90565b91906060838203126101825760405190611a35826118f6565b8193611a4081611842565b8352611a4e60208201611842565b602084015260408101359167ffffffffffffffff831161018257604092611a7592016119fe565b910152565b67ffffffffffffffff81116118e25760051b60200190565b929192611a9e82611a7a565b604092611aae6040519283611996565b819581835260208093019160061b84019381851161018257915b848310611ad757505050505050565b8583830312610182578386918251611aee81611912565b611af786611842565b81528286013583820152815201920191611ac8565b9080601f8301121561018257816020611a1993359101611a92565b91909160a0818403126101825760405190611b41826118c6565b8193611b4c82611842565b835267ffffffffffffffff9160208101358381116101825782611b70918301611a1c565b602085015260408101358381116101825782611b8d918301611b0c565b6040850152606081013592831161018257611bae6080939284938301611b0c565b60608501520135910152565b909291611bc684611a7a565b916040611bd66040519485611996565b839580855260208095019160059160051b8401948086116101825784935b868510611c05575050505050505050565b67ffffffffffffffff90853582811161018257870190606082850312610182578451611c30816118f6565b611c3983611842565b81528a83013584811161018257830185601f8201121561018257803590611c5f82611a7a565b91611c6c89519384611996565b8083528d808401918b1b83010191888311610182578e809101915b838310611cbd57509150508201528583013593841161018257611cae858c958695016119fe565b86820152815201940193611bf4565b82358152918101918f9101611c87565b9080601f8301121561018257816020611a1993359101611bba565b356001600160a01b03811681036101825790565b908060209392818452848401375f828201840152601f01601f1916010190565b9035601e198236030181121561018257016020813591019167ffffffffffffffff8211610182578160061b3603831361018257565b9190808252602080920192915f905b828210611d6e575050505090565b909192936001906001600160a01b03611d8687611842565b16815285830135838201526040908101950193920190611d60565b90929192611dae81611a7a565b91604091611dbf6040519485611996565b839581855260208095019160051b8301938185116101825783925b858410611dea5750505050505050565b67ffffffffffffffff908435828111610182578601908382860312610182578351611e1481611912565b82358481116101825786611e29918501611a1c565b81528983013593841161018257611e44868b95869501611ccd565b83820152815201930192611dda565b903590601e1981360301821215610182570180359067ffffffffffffffff821161018257602001918160051b3603831361018257565b60405190611e96826118f6565b60606040835f81525f60208201520152565b60405190611eb5826118c6565b5f608083828152611ec4611e89565b6020820152606060408201526060808201520152565b9015610e1e57803590607e1981360301821215610182570190565b903590609e1981360301821215610182570190565b903590601e1981360301821215610182570180359067ffffffffffffffff821161018257602001918160061b3603831361018257565b9190811015610e1e5760061b0190565b805115610e1e5760200190565b805160011015610e1e5760400190565b805160021015610e1e5760600190565b805160031015610e1e5760800190565b805160041015610e1e5760a00190565b805160051015610e1e5760c00190565b8051821015610e1e5760209160051b010190565b3580151581036101825790565b9081518082526020808093019301915f5b828110611fed575050505090565b835180516001600160a01b031686528201518583015260409094019392810192600101611fdf565b9060808061208b61207961206760406001600160a01b0380895116885260208901519060a060208a01528082511660a08a015260208201511660c08901520151606060e08801526101008701906118a2565b60408701518682036040880152611fce565b60608601518582036060870152611fce565b93015191015290565b9081518082526020808093019301915f5b8281106120b3575050505090565b8351855293810193928101926001016120a5565b903590601e1981360301821215610182570180359067ffffffffffffffff82116101825760200191813603831361018257565b903590605e1981360301821215610182570190565b6121266115dd61211f8380611ef5565b3690611b27565b5f525f602052600160405f2054036121c25780612146816121b293611ef5565b6121aa61216561216a6020850135938460408701359384923690611b27565b613102565b6121826121778580611ef5565b946060810190611e53565b92906121a2604051966121948861197a565b5f88525f3681373690611b27565b933691611bba565b923392613137565b6040810151606090910151600192565b505f905f905f90565b5f5b60c081106121d9575050565b6060828201526020016121cd565b5f5b8281106121f557505050565b6060828201526020016121e9565b926001600160a01b038451166001600160a01b03835116146126ab576001600160a01b03612238606086015160643590611fad565b515116906040830151916001600160a01b036122576084358095611fad565b5151161480159061266b575b610dd8576040850151906001600160a01b036122826044358094611fad565b5151166001600160a01b0361229d60643560608a0151611fad565b51511614612659576122ae866126ff565b805f525f60205260405f20541561260657506122c9846126ff565b805f525f60205260405f2054156125b257506123ac9291612386917f6fa7f4c28634b0a9d6831401c45ae468195fb63aed07308935c35374ff5d9e396040518061233161232361012033845280602085015283018d612015565b82810360408401528a612015565b85606083015260643560808301528760a083015260a43560c083015260c43560e083015260e4356101008301520390a16001600160a01b03865116604051926123798461197a565b5f8452606435908a613137565b936001600160a01b038651166040519261239f8461197a565b5f845260a4359086613137565b916123ba60408201516127c0565b15801561259e575b801561258b575b8015612578575b61256657604051916123e18361192e565b5f83525f60208401525f60408401525f606084015261240084836147d1565b8452604084015261242661241483866147d1565b60208601528060608601528451613561565b9461243a6020850151604086015190613561565b9361244487613473565b8015612557575b6125455761250c61253e957fd9fa84dd790c969daa5c33d8050dc06b4a9b59d5b42e2be5f5e8ae20447f618d946124ee6125439a60a09661248d8a88516135b5565b61249b8c60208901516135b5565b6124a98a6040890151613613565b6124b78c6060890151613613565b6124c08a6138fe565b6124c98c6138fe565b6001600160a01b036124e560c435926060606435910151611fad565b515116336128b0565b50506001600160a01b036124e560e43592606060a435910151611fad565b5050606060405191338352805160208401526020810151604084015260408101518284015201516080820152a1613725565b613725565b565b604051630d86822160e01b8152600490fd5b5061256185613473565b61244b565b6040516321badf1f60e01b8152600490fd5b506125866060840151613473565b6123d0565b506125996060820151613473565b6123c9565b506125ac60408401516127c0565b156123c2565b9351604080513381526001600160a01b039092166020830152810194909452507fb70c12fa453793fa6818ec07c91e74363a47aa6a6829dcd9533937fdf30314f3945091925082915050606081015b0390a1565b9551604080513381526001600160a01b039092166020830152810196909652507fb70c12fa453793fa6818ec07c91e74363a47aa6a6829dcd9533937fdf30314f394935083925050606082019050612601565b604051631cd2f1c760e21b8152600490fd5b506001600160a01b03612685606085015160a43590611fad565b5151166001600160a01b036126a1604088015160443590611fad565b5151161415612263565b604051630a98f1f360e21b8152600490fd5b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0060028154146126ed5760029055565b604051633ee5aeb560e01b8152600490fd5b60405161272a8161271c6020820194602086526040830190612015565b03601f198101835282611996565b51902090565b612543929161275b61028f923390919060405192600284526020840152604083015260608201604052565b92604051936127698561195e565b60068552612779602086016121cb565b61278285611f50565b526111f384611f50565b909115612797575050565b6040516305dbdfd960e41b81526001600160a01b03918216600482015291166024820152604490fd5b6127df905f60e01d906001600160e01b038160e01d9116601b0b614834565b1290565b906127df916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b6148b5565b92919261281682613af9565b9361282081613473565b61289e5784816001600160e01b0361283f9360e01d9116601b0b614934565b9290809315612875575b50829081612859575b5050509190565b61286d926001600160a01b03309216612fd5565b5f8181612852565b9092505f19811461288a57600101915f612849565b634e487b7160e01b5f52601160045260245ffd5b604051632eaefac360e21b8152600490fd5b939291936128bd83613473565b61295b57846128d9576128d1939450613099565b50505f905f90565b6001600160a01b039392919380911694855f52602060018152604092835f20961695865f528152825f20825f528152612916835f2054948561358b565b9561292087613473565b612943575f97885260018252838820908852815282872091875252909320829055565b835163c5e12af560e01b815260048101889052602490fd5b60405163793a8f5560e01b815260048101849052602490fd5b919060408382031261018257825167ffffffffffffffff908181116101825784019082601f830112156101825781516020926129af82611a7a565b916129bd6040519384611996565b808352848084019160051b830101918683116101825785809101915b838310612a4c5750505050948281015191821161018257019180601f84011215610182578251612a0881611a7a565b93612a166040519586611996565b818552838086019260051b820101928311610182578301905b828210612a3d575050505090565b81518152908301908301612a2f565b82518152918101918691016129d9565b90808251908181526020809101926020808460051b8301019501935f915b848310612a8a5750505050505090565b9091929394958480612aa8600193601f198682030187528a51612094565b9801930193019194939290612a7a565b91906020928381526001600160a01b0382511684820152838201516040820152612af2604083015160e060608401526101008301906118a2565b9060608301516080820152612b19608084015192601f1993848483030160a0850152612a5c565b9260a081015193838382030160c08401528680865192838152019501905f5b818110612b5c57505050611a1994955060c060e09101519282850301910152612094565b825187529588019591880191600101612b38565b90604082019082526020606081936040838201528551809452019301915f5b828110612b9d575050505090565b835185529381019392810192600101612b8f565b919091604092835192612bc38461195e565b60068452602094612bd58686016121cb565b5f5b8451811015612c0a5780612bed60019287611fad565b51612bf88289611fad565b52612c038188611fad565b5001612bd7565b50925092939093335f52308252825f2091835195612c2787611912565b612c2f611e89565b875260608281980152845190612c448261197a565b5f8252855190612c538261197a565b5f82525f3681375f5b8151811015612dc057898688612c728486611fad565b51888151948d80870151908151612c94575b5050505050505050600101612c5c565b905f92916001600160a01b0396612cb98887818d51169c015116998789015190613bd8565b95825199612cc68b61195e565b8a5289015287015285015260808401528760a08401528660c08401525f8c51809563d04dfe2360e01b82528180612d01600498898301612ab8565b03915afa938415612db6579089915f95612d90575b508451612d2c575b50899250808e8c938e612c84565b5101511691823b1561018257612d5a925f92838d5180968195829463012c676d60e21b845233908401612b70565b03925af18015612d86579060019291612d77575b81928782612d1e565b612d809061194a565b5f612d6e565b89513d5f823e3d90fd5b612dad9195503d805f833e612da58183611996565b810190612974565b9050935f612d16565b8c513d5f823e3d90fd5b50505050505050509050565b8215612e01576001600160a01b038091165f52600160205260405f2091165f5260205260405f20905f5260205260405f205490565b909150612e0d82613e0a565b6001600160a01b03809316906040918251946370a0823160e01b86528416938460048701526020928387602481865afa968715612f23575f97612f2d575b5083612e64612e5d83612e949a614ae9565b5090614274565b508651636eb1769f60e11b81526001600160a01b0390941660048501523060248501529297889081906044820190565b0381865afa968715612f23575f97612ef2575b50612e5d612eb891611a1998614ae9565b50612ec38183613496565b15612eea5750935b5f5260018252825f20905f528152815f20905f8052525f20549061358b565b905093612ecb565b96508387813d8311612f1c575b612f098183611996565b8101031261018257955195612e5d612ea7565b503d612eff565b85513d5f823e3d90fd5b96508387813d8311612f55575b612f448183611996565b810103126101825795519583612e4b565b503d612f3a565b6040519263a9059cbb60e01b5f526001600160a01b0380931660045260245260205f60448180855af160015f5114811615612fb6575b8360405215612fa057505050565b635274afe760e01b835216600482015260249150fd5b6001811516612fcc57813b15153d151616612f92565b833d5f823e3d90fd5b9092604051936323b872dd60e01b5f526001600160a01b0393848092166004521660245260445260205f60648180855af160015f5114811615613025575b836040525f60605215612fa057505050565b6001811516612fcc57813b15153d151616613013565b9392919361304883613473565b61295b578461305c576128d193945061280a565b6001600160a01b039392919380911694855f52602060018152604092835f20961695865f528152825f20825f528152612916835f20549485613561565b909291926130a681613af9565b936130b081613473565b6130f05784816001600160e01b036130cf9360e01d9116601b0b614934565b508092816130de575050509190565b6001600160a01b0361286d9316612f5c565b604051632d1671a360e11b8152600490fd5b9161312d906060613122936001600160a01b039485916040880151611fad565b515116940151611fad565b5151161461265957565b94919361337c919360c0915f6133036040928351946131558661195e565b61315d611ea8565b86526020958487820152848682015260609781868a809401528260808201528660a082015201526132b38551916131938361195e565b600683526131a28884016121cb565b8d6131ac816126ff565b9c896001600160a01b039e8f94859182865116908d5194600486528501528c840152168c82015233608082015260a081018a526131e886611f50565b526131f285611f50565b5088516131fe816118f6565b6002815289368c83013761321186611f5d565b5261321b85611f5d565b5060ff8a61327e8b8501936132688761324181613239858a51611fad565b515116613e0a565b97511688613250848951611fad565b5151168561325f858a51611fad565b51015191612dcc565b96613274828751611fad565b5151169451611fad565b51015192169093929190604051946005865260208601526040850152606084015260808301525f60a083015260c08201604052565b6132bc82611f6d565b526132c681611f6d565b506132ea8a8d8d60ff8a61327e8d8501936132688761324181613239858a51611fad565b6132f382611f7d565b526132fd81611f7d565b50613bd8565b95878a511697848b0191825191868184511693015116928a855230875285808620915101518651916133348361197a565b8683528751956133438761195e565b86528886015286850152848885015289608085015260a084015260c08301528351808098819463d04dfe2360e01b835260048301612ab8565b03915afa968715613469575f945f98613447575b50845160028110613430575081838601519501516133b66133b088611f8d565b51611f7d565b516133c18183613496565b156134285750925b6133eb8685919060405192600284526020840152604083015260608201604052565b6133f488611f6d565b526133fe87611f6d565b5082519961340b8b61195e565b8a52890152870152850152608084015260a083015260c082015290565b9050926133c9565b602490835190630fbb8e5560e21b82526004820152fd5b90975061345f9194503d805f833e612da58183611996565b939093965f613390565b50513d5f823e3d90fd5b613492905f60e01d906001600160e01b038160e01d9116601b0b614834565b1390565b90613492916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b6148b5565b6134e46001600160e01b0392838316601b0b9260e01d938160e01d9116601b0b848461402b565b90637ffffff58213613534575b906134fb91614274565b929092158061352c575b61350e57505090565b6044925060405191638eba4d0760e01b835260048301526024820152fd5b508215613505565b61353e8282614f14565b156134f157604483856040519163d556b11160e01b835260048301526024820152fd5b611a1991610bd2916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b61447a565b611a1991610bd2916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b61463e565b61360f9160808101826135d16135cb8351611f8d565b51611f8d565b526136086136026001600160a01b038094515116936135f96135f38551611f8d565b51611f50565b51169251611f8d565b51611f6d565b519161303b565b5050565b906080810191806136276135cb8551611f7d565b526001600160a01b038092515116916136436135f38551611f7d565b51166136526136028551611f7d565b5190816136ed5761366283613473565b61295b579183917f4cb6e22a3e7e651d7cf0376cff48f20f5007a54147777865be7f5f6c38c50f4a9593612601955f52602090600182526136b8604094855f20835f528452855f20855f528452855f205461358b565b945f5260018252835f20905f528152825f20915f52525f20555b51604051918291338352604060208401526040830190612a5c565b9161371e917f4cb6e22a3e7e651d7cf0376cff48f20f5007a54147777865be7f5f6c38c50f4a9593612601956128b0565b50506136d2565b60c0810151908151915f92613899575b506137da6020918281510151926001600160a01b039081818187511696015116928660a082019485518252308452604097888320898686510151015160808601518b51916137828361197a565b8683528c51936137918561197a565b8785528d51966137a08861195e565b8752898701528c86015260016060860152608085015260a084015260c08301528851808099819463d04dfe2360e01b835260048301612ab8565b03915afa94851561388f578795613871575b5084516137fd575b50505050505050565b81905101510151169051813b1561386d57918491849383613832965180978195829463012c676d60e21b845260048401612b70565b03925af1908115613864575061384d575b80808080806137f4565b613857829161194a565b6138615780613843565b80fd5b513d84823e3d90fd5b8480fd5b6138869195503d8089833e612da58183611996565b9050935f6137ec565b86513d89823e3d90fd5b6001600160a01b03602080845101510151169060a083015190823b15610182576138dc925f928360405180968195829463012c676d60e21b845260048401612b70565b03925af1801561022c5715613735576138f691925061194a565b5f905f613735565b6080810161390f6136028251611f7d565b5191821561391c57505050565b6139366135f36001600160a01b0380935151169351611f7d565b5116815f5260209160018352604092835f20835f528152835f20855f528152835f2054936001600160e01b038516613971575b505050505050565b613995955f9284845260018152828420868552815282842091845252812055613099565b5f808080613969565b81156139a8570490565b634e487b7160e01b5f52601260045260245ffd5b6040815110613a04576020810151908051603f19810190811161288a5760051c82116139f05760016020920160051b010190565b50506040516139fe8161197a565b5f815290565b506040516139fe8161197a565b805115613a2157602001515f1a90565b505f90565b905f8091602081519101845af48080613aa4575b15613a5a5750506040513d81523d5f602083013e60203d82010160405290565b15613a8157604051639996b31560e01b81526001600160a01b039091166004820152602490fd5b3d15613a92576040513d5f823e3d90fd5b60405163d6bda27560e01b8152600490fd5b503d151580613a3a5750813b1515613a3a565b60041115613ac157565b634e487b7160e01b5f52602160045260245ffd5b602090939291936001600160a01b036040820195168152613af583613ab7565b0152565b613b01615002565b6040805163b7bad1b160e01b81526001600160a01b0383166004820152909182826024815f73200e12d10bb0c5e4a17e7018f0f1161919bb93895af1928315613bcf575f925f94613b9a575b50613b5783613ab7565b600183141580613b88575b613b6c5750505090565b5163ee07877f60e01b81529182916106df919060048401613ad5565b50613b9283613ab7565b821515613b62565b90809450613bbe9293503d8511613bc8575b613bb68183611996565b81019061490a565b919091925f613b4d565b503d613bac565b513d5f823e3d90fd5b90805191613be583611a7a565b91613c00604094613bf886519586611996565b808552611a7a565b601f199460209186013686840137835183519095908015613dff576001613c569101965b6001978891010197613c4d613c388a611a7a565b99613c4586519b8c611996565b808b52611a7a565b018489016121e7565b85805f9684516002815233878201523086820152606081018652613c798b611f50565b52613c838a611f50565b505f925b613dbb575b5050508351613c9f575b50505050505090565b85809598979692980181613cb38289611fad565b52613cbe8188611fad565b505f925b613cd1575b5085969750613c96565b8451831015613db6576001600160a01b03613d4881613cf08689611fad565b51511686613cfe878a611fad565b51015187815160051b9101207f19457468657265756d205369676e6564204d6573736167653a0a3332000000005f52601c52603c5f208c613d3f888b611fad565b51015191614a60565b15613d9e57868098999a928192613d5f878a611fad565b515116613d6c8787611fad565b52019385613d7a8289611fad565b510151613d87868c611fad565b52613d92858b611fad565b50019290989796613cc2565b8951630a57f30960e31b815260048101859052602490fd5b613cc7565b9091968151881015613df6578280910197613dd68184611fad565b51613de18a8d611fad565b52613dec898c611fad565b5001919081613c87565b96829150613c8c565b50613c565f96613c24565b613e12615002565b60408051630782d7e160e01b81526001600160a01b03831660048201529091828260248173200e12d10bb0c5e4a17e7018f0f1161919bb93895afa928315613bcf575f925f94613b9a5750613b5783613ab7565b9091939284158215175f14613e805750505090505f905f90565b82810192600160fd1b8082019083011760fe1c613fb7575b5050613ea381614bd9565b93613ead81614bd9565b94613eb88682614bf9565b90918215613fa8575f9083986f0785ee10d5da46d900f436a000000000808611613f9a575b50670de0b6b3a7640000808b11613f8b575b50633b9aca00808b11613f7c575b50612710808b11613f6e575b5098805b613f5d5750819061189e989982600a0a9109960195817fcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccd0a93838211900382610100031b9203901c170291614c0c565b60019290920191600a900480613f0d565b60049a04998a930192613f09565b600991939a049901915f613efd565b601291939a049901915f613eef565b85049950602592505f613edd565b5092905061189e949550614c0c565b5f82121561400b57808413613ffd575b7f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb2841315613e985790925061189e939491614b17565b90925061189e939491614b7e565b80841215613fc75790925061189e939491614b17565b6134fb8282614274565b92909180614051576044848460405191637a97930f60e01b835260048301526024820152fd5b90919280155f1461406657505050505f905f90565b61407f9361407391614cc6565b92919490938492614cc6565b909391928461408d88614bd9565b9161409786614bd9565b947f161bcca7119915b50764b4abe86529797775a5f171951000000000000000000094604c9186881061423e575b030191600160ff1b98838a018112155f1461420b575050035b5f955f821280614202575b6141e4575b5f8112806141d2575b6141b45786820103966001600160ff1b03881490816141aa575b50806141a1575b80614198575b61417a57509061412e9291614e72565b915f8113614141575b5061189e93614c0c565b9091604c821361416f5761415891600a0a9061399e565b908115614165575f614137565b505050505f905f90565b50505050505f905f90565b876044916040519163d556b11160e01b835260048301526024820152fd5b505f851261411e565b50828414614118565b905088145f614111565b604489836040519163d556b11160e01b835260048301526024820152fd5b50806001600160ff1b030182136140f7565b95508087018613156141fc5786818703015b956140ee565b5f6141f6565b505f81136140e9565b89985090920390506001600160ff1b038190038701821361422f57018601946140de565b5050505050505050505f905f90565b7f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee80000000000000000009650604b92506140c5565b81156139a8570590565b8082601b82810b8314614469577d90e40fbeea1d3a4abc8955e946fe31cdcf66f634e10000000000000000008405614415575b8380820b0361440457507b199999999999999999999999999999999999999999999999999999987b0ccccccccccccccccccccccccccccccccccccccccccccccccccccccc840111156143b5575b838060030b03614339575b80841361431d5750506001600160e01b036001925b60e01b91161791565b8303600a0a80156139a8576001600160e01b0391071592614314565b92915f84131561438957509061434f8383614f14565b61436b57637ffffffe1901600a0a810290637fffffff926142ff565b506044916040519163d556b11160e01b835260048301526024820152fd5b637fffffff19928303906043821361416f576143a891600a0a9061426a565b91821561416557926142ff565b5f198401808060030b146143c957506142f4565b90506001600160e01b039293507b7fffffffffffffffffffffffffffffffffffffffffffffffffffffff915060e01b9260ff1d181617905f90565b600190940193600a909305926142a7565b937f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee8000000000000000000840515614456576305f5e100600894058094819201955b9150506142a7565b620186a06005940580948192019561444e565b50826142f457505050505f90600190565b919291600160ff1b84016144925761189e9350614f2d565b9061189e935f039161463e565b919291600160ff1b919080158061462c5750906144bb91614cc6565b9490929091905f868585858282138015614623575b614606575b505050508682841860ff1c94860391039081604c0381116145eb5701600a0a8082059190846145d1575b505081019182821860ff1c11156145c957826001600160ff1b03146145ab57905f600192135f1461457c57600a9004915b01925b8115811761454057509190565b80614559575b508015614551579190565b505f91508190565b919261456f9203600160ff1b01600a0a9061426a565b600160ff1b91905f614546565b600a60037fe6666666666666666666666666666666666666666666666666666666666666679201040191614530565b604490836040519163d556b11160e01b835260048301526024820152fd5b509092614533565b81076145de575b806144ff565b60ff1d600117015f6145d8565b5050509193506145f9579190565b60018160ff1d1790039190565b5f9a50909750909550600160ff1b945092509050868080806144d5565b50835f126144d0565b156146375750509190565b9350919050565b939291938415811581811761478f5750509061465991614cc6565b919490829561466a82958294614cc6565b8096929491969387868482138015614786575b61476d575b5050505050508682841860ff1c94860391039081604c0381116145eb5701600a0a808205919084614753575b505081019182821860ff1c111561474b57826001600160ff1b03146145ab57905f600192135f1461471c57600a9004915b01925b811581176146ef57509190565b806146ff57508015614551579190565b600160ff1b936147169291038401600a0a9061426a565b5f614546565b600a60037fe66666666666666666666666666666666666666666666666666666666666666792010401916146df565b5090926146e2565b8107614760575b806146ae565b60ff1d600117015f61475a565b929b5098509196509450925090505f8080808080614682565b5085841261467d565b93959390929190156147a5575050614551579190565b945092915050565b6008815110613a21576008015167ffffffffffffffff1667ff0a89c674ee78741490565b916040830192604061480b610bd2606087519401938451906001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b613e66565b9451930161481a8151866127e3565b614822575050565b909350611a19919250519251836134bd565b92915f9060018184145f871287151717176148ae575f928082136148a0575b03604c81135f82121761489457600a0a9084614872838202938461426a565b1461488757505015614883575f9190565b5f90565b9093509015611a19579190565b505015614883575f9190565b5f9560019450925090614853565b5050505f90565b93929190918083145f83125f87121883158715171717614904575f928082136148f75703604c81135f82121761489457600a0a9084614872838202938461426a565b9194600193509190614853565b50919050565b919082604091031261018257815160048110156101825760209092015160ff811681036101825790565b91925f83121561495c576044838360405191634a7d166b60e01b835260048301526024820152fd5b91928361496e57505090505f90600190565b60ff8116820191808312614a36575f8312156149a6575050604c198112614551575f03600a0a9161499f838261399e565b9283021490565b909293915f81135f14614a2c57604d8113614a0157600a0a9283156139a857835f190483116149d85750500290600190565b60405163c849483b60e01b815260048101849052602481019290925260ff166044820152606490fd5b5060405163c849483b60e01b81526004810192909252602482015260ff919091166044820152606490fd5b5050905090600190565b60405163c849483b60e01b815260048101869052602481019190915260ff82166044820152606490fd5b9091813b614a9b57614a72919261506b565b50614a7c81613ab7565b159182614a8857505090565b6001600160a01b03918216911614919050565b6020918160645f935160405192630b135d3f60e11b9788855260048501526040602485015286820190604485015e8281018201859052601f01601f191601915afa905f5114601f3d11161690565b9060ff165f03916001600160ff1b0382115f14614b0f57600a6001818404940192061590565b909190600190565b909392915f614b27918184613e66565b9490945f8483019182019412159081614b74575b8115614b6a575b50614b4c57505090565b604492506040519163d556b11160e01b835260048301526024820152fd5b905083125f614b42565b8281129150614b3b565b614b9393600160fe1b90810193920190613e66565b9081815f821215614bca575050604b1982126128d157614bb8915f03600a0a9061426a565b9081614bc2575f90565b600160ff1b90565b93600160ff1b90910192509050565b5f811215611a1957600160ff1b90808203614bf2575090565b90505f0390565b905f198183099102908180821091030391565b92939291905f8184181215614ca1576001600160ff1b039283831115614c8b57600160ff1b93838503614c4157505050509190565b90919293508514614c5b575050600a600191045f03920190565b604051630ed8062160e21b8152600481019190915260248101919091526044810182905260648101849052608490fd5b5090915050600160ff1b811461288a575f039190565b90916001600160ff1b0380841115612852578514614c5b575050600a60019104920190565b9190918015614e6857827f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee800000000000000000080830515614d76575b507f19999999999999999999999999999999999999999999999999999999999999997f0ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc830110614d67575b8313614d515791905f90565b919060018060ff1b926001600160ff1b03030190565b9290600a02905f190192614d45565b6f4b3b4ca85a86c47a098a22400000000080840515614e56575b507728c87cb5c89a2571ebfdcb54864ada834a00000000000000830515614e3f575b7b097edd871cfda3a5697758bf0e3cbb5ac5741c640000000000000000830515614e2b575b7e3899162693736ac531a5a58f1fbb4b746504382ca7e4000000000000000000830515614e1b57820515614e0c575b5f614cfa565b9290600a02905f190192614e06565b9391606402916001190193614dd7565b93916402540be40002916009190193614dd7565b9391678ac7230489e8000002916012190193614db2565b6025198301955092909202915f614d90565b505f915081908190565b90915f198383099280830292838086109503948086039584871015614ef05714614ee8579082910960018219018216809204600280826003021880830282030280830282030280830282030280830282030280830282030280920290030293600183805f03040190848311900302920304170290565b505091500490565b60648386866040519263362ced0960e11b8452600484015260248301526044820152fd5b611a1991905f811215614f28575f036150a5565b6150a5565b909291600160ff1b91828101614fbf5750808414614fb557808413918215614fad578185035b604c811115614f9c5750505f915b15614f8d57507f8000000000000000000000000000000000000000000000000000000000000001019190565b92506001600160ff1b03039190565b600a0a9081156139a8570491614f61565b848203614f53565b505090505f905f90565b93614fcc92945f0361449f565b80939180928114614fe0575b50505f039190565b915092506001600160ff1b0383146145ab57600a600191059201915f80614fd8565b73200e12d10bb0c5e4a17e7018f0f1161919bb9389803b158015615040575b6150285750565b602490604051906373e6d7b360e01b82526004820152fd5b507f1de7d717526cba131d684e312dedbf0852adef9cced9e36798ae4937f7145d41813f1415615021565b815191906041830361509b576150949250602082015190606060408401519301515f1a90615134565b9192909190565b50505f9160029190565b90637ffffff581131561512e57637ffffffe1981019060438213615127575f8212156150fb57637fffffff91505f0301600a0a7b8000000000000000000000000000000000000000000000000000000202111590565b50600a0a80156139a8577b80000000000000000000000000000000000000000000000000000001041090565b5050151590565b50505f90565b91907f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a084116151ab579160209360809260ff5f9560405194855216868401526040830152606082015282805260015afa1561022c575f516001600160a01b038116156151a157905f905f90565b505f906001905f90565b5050505f916003919056"; /// @dev What MUST already be on a network before this release can be /// broadcast there: an address, and the runtime code that belongs at it. diff --git a/src/generated/candidate/RaindexV6SubParser.sol b/src/generated/candidate/RaindexV6SubParser.sol index 950bc4f195..9833ecada1 100644 --- a/src/generated/candidate/RaindexV6SubParser.sol +++ b/src/generated/candidate/RaindexV6SubParser.sol @@ -5,19 +5,19 @@ pragma solidity ^0.8.25; // THIS FILE IS AUTOGENERATED BY THE BUILD SCRIPT. DO NOT EDIT BY HAND. /// @dev Hash of the known bytecode. -bytes32 constant BYTECODE_HASH = bytes32(0xb1b4649132a7ad03265562c1a423ea9c47c1c19d24882c98827e8f5c9b3fd439); +bytes32 constant BYTECODE_HASH = bytes32(0xfaadc632ff51c921c614024250a4da3c52780d22d85a928ec8e2f32b21a84ebd); /// @dev The deterministic deploy address of the contract when deployed via /// the Zoltu factory. -address constant DEPLOYED_ADDRESS = address(0x69776bB0d73bF514a20bbCD4B8534fE3ee90A829); +address constant DEPLOYED_ADDRESS = address(0xf6bbCa1D4fc3EBCE6992B2af8769B3ca1B1A53fd); /// @dev The creation bytecode of the contract. bytes constant CREATION_CODE = - hex"6080604052348015600e575f80fd5b506126888061001c5f395ff3fe608060405234801561000f575f80fd5b506004361061007a575f3560e01c80636f5aa28d116100585780636f5aa28d146100dd578063c6c0cbb61461010b578063ccf4477514610135578063d6d8c9a814610148575f80fd5b806301ffc9a71461007e578063336284d4146100a6578063570c7a63146100bb575b5f80fd5b61009161008c366004612343565b610150565b60405190151581526020015b60405180910390f35b6100ae6101d7565b60405161009d919061239f565b6100ce6100c93660046123c5565b610b9f565b60405161009d9392919061246f565b6040517fe43208b51e17b3d887e8f3535d75526c0744eee6a200dac603462c6b3ca46511815260200161009d565b61011e6101193660046123c5565b610ce3565b60408051921515835260208301919091520161009d565b60408051602081019091525f81526100ae565b6100ae610d1b565b5f6001600160e01b031982166391ccb1d560e01b148061018057506001600160e01b03198216636f5aa28d60e01b145b8061019b57506001600160e01b03198216631a2c8edd60e01b145b806101b657506001600160e01b03198216630cd8a13560e21b145b806101d157506301ffc9a760e01b6001600160e01b03198316145b92915050565b60605f6101e6600960016124e0565b6001600160401b038111156101fd576101fd6123b1565b60405190808252806020026020018201604052801561023057816020015b606081526020019060019003908161021b5790505b506040805160018082528183019092529192505f9190816020015b61233981526020019060019003908161024b579050509050611682815f81518110610278576102786124f3565b6001600160401b03929092166020928302919091019091015260408051600480825260a082019092525f91816020015b6123398152602001906001900390816102a85790505090506116a0815f815181106102d5576102d56124f3565b60200260200101906001600160401b031690816001600160401b0316815250506116af8160018151811061030b5761030b6124f3565b60200260200101906001600160401b031690816001600160401b0316815250506116be81600281518110610341576103416124f3565b60200260200101906001600160401b031690816001600160401b0316815250506116ce81600381518110610377576103776124f3565b6001600160401b039290921660209283029190910190910152604080516002808252606082019092525f91816020015b6123398152602001906001900390816103a75790505090506116de815f815181106103d4576103d46124f3565b60200260200101906001600160401b031690816001600160401b0316815250506116ed8160018151811061040a5761040a6124f3565b6001600160401b03929092166020928302919091019091015260408051600580825260c082019092525f91816020015b61233981526020019060019003908161043a5790505090506116fd815f81518110610467576104676124f3565b60200260200101906001600160401b031690816001600160401b03168152505061170c8160018151811061049d5761049d6124f3565b60200260200101906001600160401b031690816001600160401b03168152505061171c816002815181106104d3576104d36124f3565b60200260200101906001600160401b031690816001600160401b03168152505061172c81600381518110610509576105096124f3565b60200260200101906001600160401b031690816001600160401b03168152505061173b8160048151811061053f5761053f6124f3565b6001600160401b03929092166020928302919091019091015260408051600580825260c082019092525f91816020015b61233981526020019060019003908161056f57905050905061174b815f8151811061059c5761059c6124f3565b60200260200101906001600160401b031690816001600160401b03168152505061175a816001815181106105d2576105d26124f3565b60200260200101906001600160401b031690816001600160401b03168152505061176a81600281518110610608576106086124f3565b60200260200101906001600160401b031690816001600160401b03168152505061177a8160038151811061063e5761063e6124f3565b60200260200101906001600160401b031690816001600160401b03168152505061178a81600481518110610674576106746124f3565b6001600160401b0392909216602092830291909101909101526040805160018082528183019092525f91816020015b6123398152602001906001900390816106a3579050509050611799815f815181106106d0576106d06124f3565b6001600160401b0392909216602092830291909101909101526040805160018082528183019092525f91816020015b6123398152602001906001900390816106ff5790505090506117a8815f8151811061072c5761072c6124f3565b60200260200101906001600160401b031690816001600160401b03168152505086885f8151811061075f5761075f6124f3565b6020026020010181905250858860018151811061077e5761077e6124f3565b6020026020010181905250848860028151811061079d5761079d6124f3565b602002602001018190525083886003815181106107bc576107bc6124f3565b602002602001018190525082886004815181106107db576107db6124f3565b602002602001018190525081886008815181106107fa576107fa6124f3565b60200260200101819052508088600981518110610819576108196124f3565b602090810291909101015260408051600680825260e082019092525f91816020015b61233981526020019060019003908161083b5790505090506117da815f81518110610868576108686124f3565b60200260200101906001600160401b031690816001600160401b0316815250506117e98160018151811061089e5761089e6124f3565b60200260200101906001600160401b031690816001600160401b0316815250506117f8816002815181106108d4576108d46124f3565b60200260200101906001600160401b031690816001600160401b0316815250506118088160038151811061090a5761090a6124f3565b60200260200101906001600160401b031690816001600160401b03168152505061181881600481518110610940576109406124f3565b60200260200101906001600160401b031690816001600160401b03168152505061182881600581518110610976576109766124f3565b60200260200101906001600160401b031690816001600160401b03168152505080896005815181106109aa576109aa6124f3565b602090810291909101015260408051600780825261010082019092525f91816020015b6123398152602001906001900390816109cd579050509050611838815f815181106109fa576109fa6124f3565b60200260200101906001600160401b031690816001600160401b03168152505061184781600181518110610a3057610a306124f3565b60200260200101906001600160401b031690816001600160401b03168152505061185681600281518110610a6657610a666124f3565b60200260200101906001600160401b031690816001600160401b03168152505061186681600381518110610a9c57610a9c6124f3565b60200260200101906001600160401b031690816001600160401b03168152505061187681600481518110610ad257610ad26124f3565b60200260200101906001600160401b031690816001600160401b03168152505061188681600581518110610b0857610b086124f3565b60200260200101906001600160401b031690816001600160401b03168152505061189681600681518110610b3e57610b3e6124f3565b60200260200101906001600160401b031690816001600160401b031681525050808a600681518110610b7257610b726124f3565b602090810291909101015289610b8f610b8a826118a6565b6118bb565b9b50505050505050505050505090565b5f6060805f805f610bbf87610bb261194a565b610bba61196a565b61198a565b9250925092505f610bd582610220015160200190565b90505f8261022001515182610bea91906124e0565b90505f610c0883836f07fffffe0000000003ff200000000000611a7b565b80925081945050505f80610c2186610240015184611b17565b915091508115610cb6575f610c368783611bee565b90506123395f610c44611c1d565b90505f60028251610c55919061251b565b9050808510610c86576040516303bdd1b160e51b815260048101869052602481018290526044015b60405180910390fd5b6001850160020282015161ffff169250610c9f8c8c8686565b9e509e509e50505050505050505050505050610cdc565b5050604080515f80825281830190925260208101828152919a5090985096505050505050505b9193909250565b5f805f805f610d0b866002810151815160228084019461ffff93909316840101920160200190565b505f988998509650505050505050565b60605f610d2a600960016124e0565b6001600160401b03811115610d4157610d416123b1565b604051908082528060200260200182016040528015610d7457816020015b6060815260200190600190039081610d5f5790505b506040805160018082528183019092529192505f9190816020015b612339815260200190600190039081610d8f579050509050611c3d815f81518110610dbc57610dbc6124f3565b6001600160401b03929092166020928302919091019091015260408051600480825260a082019092525f91816020015b612339815260200190600190039081610dec579050509050611c3d815f81518110610e1957610e196124f3565b60200260200101906001600160401b031690816001600160401b031681525050611c3d81600181518110610e4f57610e4f6124f3565b60200260200101906001600160401b031690816001600160401b031681525050611c3d81600281518110610e8557610e856124f3565b60200260200101906001600160401b031690816001600160401b031681525050611c3d81600381518110610ebb57610ebb6124f3565b6001600160401b039290921660209283029190910190910152604080516002808252606082019092525f91816020015b612339815260200190600190039081610eeb579050509050611c3d815f81518110610f1857610f186124f3565b60200260200101906001600160401b031690816001600160401b031681525050611c3d81600181518110610f4e57610f4e6124f3565b6001600160401b03929092166020928302919091019091015260408051600580825260c082019092525f91816020015b612339815260200190600190039081610f7e579050509050611c3d815f81518110610fab57610fab6124f3565b60200260200101906001600160401b031690816001600160401b031681525050611c3d81600181518110610fe157610fe16124f3565b60200260200101906001600160401b031690816001600160401b031681525050611c3d81600281518110611017576110176124f3565b60200260200101906001600160401b031690816001600160401b031681525050611c3d8160038151811061104d5761104d6124f3565b60200260200101906001600160401b031690816001600160401b031681525050611c3d81600481518110611083576110836124f3565b6001600160401b03929092166020928302919091019091015260408051600580825260c082019092525f91816020015b6123398152602001906001900390816110b3579050509050611c3d815f815181106110e0576110e06124f3565b60200260200101906001600160401b031690816001600160401b031681525050611c3d81600181518110611116576111166124f3565b60200260200101906001600160401b031690816001600160401b031681525050611c3d8160028151811061114c5761114c6124f3565b60200260200101906001600160401b031690816001600160401b031681525050611c3d81600381518110611182576111826124f3565b60200260200101906001600160401b031690816001600160401b031681525050611c3d816004815181106111b8576111b86124f3565b6001600160401b0392909216602092830291909101909101526040805160018082528183019092525f91816020015b6123398152602001906001900390816111e7579050509050611c66815f81518110611214576112146124f3565b6001600160401b0392909216602092830291909101909101526040805160018082528183019092525f91816020015b612339815260200190600190039081611243579050509050611d02815f81518110611270576112706124f3565b60200260200101906001600160401b031690816001600160401b03168152505086885f815181106112a3576112a36124f3565b602002602001018190525085886001815181106112c2576112c26124f3565b602002602001018190525084886002815181106112e1576112e16124f3565b60200260200101819052508388600381518110611300576113006124f3565b6020026020010181905250828860048151811061131f5761131f6124f3565b6020026020010181905250818860088151811061133e5761133e6124f3565b6020026020010181905250808860098151811061135d5761135d6124f3565b602090810291909101015260408051600680825260e082019092525f91816020015b61233981526020019060019003908161137f579050509050611c3d815f815181106113ac576113ac6124f3565b60200260200101906001600160401b031690816001600160401b031681525050611c3d816001815181106113e2576113e26124f3565b60200260200101906001600160401b031690816001600160401b031681525050611c3d81600281518110611418576114186124f3565b60200260200101906001600160401b031690816001600160401b031681525050611c3d8160038151811061144e5761144e6124f3565b60200260200101906001600160401b031690816001600160401b031681525050611c3d81600481518110611484576114846124f3565b60200260200101906001600160401b031690816001600160401b031681525050611c3d816005815181106114ba576114ba6124f3565b60200260200101906001600160401b031690816001600160401b03168152505080896005815181106114ee576114ee6124f3565b602090810291909101015260408051600780825261010082019092525f91816020015b612339815260200190600190039081611511579050509050611c3d815f8151811061153e5761153e6124f3565b60200260200101906001600160401b031690816001600160401b031681525050611c3d81600181518110611574576115746124f3565b60200260200101906001600160401b031690816001600160401b031681525050611c3d816002815181106115aa576115aa6124f3565b60200260200101906001600160401b031690816001600160401b031681525050611c3d816003815181106115e0576115e06124f3565b60200260200101906001600160401b031690816001600160401b031681525050611c3d81600481518110611616576116166124f3565b60200260200101906001600160401b031690816001600160401b031681525050611c3d8160058151811061164c5761164c6124f3565b60200260200101906001600160401b031690816001600160401b031681525050611c3d81600681518110610b3e57610b3e6124f3565b5f6060806116915f6001611dba565b92509250925093509350939050565b5f60608061169160015f611dba565b5f606080611691600180611dba565b5f60608061169160016002611dba565b5f60608061169160016003611dba565b5f60608061169160025f611dba565b5f60608061169160026001611dba565b5f60608061169160035f611dba565b5f60608061169160036001611dba565b5f60608061169160036002611dba565b5f606080611691600380611dba565b5f60608061169160036004611dba565b5f60608061169160045f611dba565b5f60608061169160046001611dba565b5f60608061169160046002611dba565b5f60608061169160046003611dba565b5f606080611691600480611dba565b5f606080611691600885611dba565b5f60608060ff8416600885901c6117c96117c38360096124e0565b82611dba565b945094509450505093509350939050565b5f606080611691600580611dba565b5f60608061169160055f611dba565b5f60608061169160056001611dba565b5f60608061169160056002611dba565b5f60608061169160056003611dba565b5f60608061169160056004611dba565b5f606080611691600680611dba565b5f60608061169160065f611dba565b5f60608061169160066001611dba565b5f60608061169160066002611dba565b5f60608061169160066003611dba565b5f60608061169160066004611dba565b5f60608061169160066005611dba565b6060815f6118b382611e3c565b949350505050565b60605f82516002026001600160401b038111156118da576118da6123b1565b6040519080825280601f01601f191660200182016040528015611904576020820181803683370190505b50905061ffff80196020850160208651028101600285015b8183101561193e5780518351861690851617815260209092019160020161191c565b50939695505050505050565b60606040518060e0016040528060a2815260200161256660a29139905090565b606060405180606001604052806040815260200161260860409139905090565b5f80611a196040518061026001604052805f81526020015f81526020015f81526020015f81526020015f81526020015f81526020015f80191681526020015f81526020015f81526020015f81526020015f81526020015f81526020015f80191681526020016060815260200160608152602001606081526020015f815260200160608152602001606081525090565b606061ffff600288015116935060ff600388015116925061ffff600588015116600588019750808852602081018801915050611a6587878760405180602001604052805f815250611eaa565b915080826101e001819052505093509350939050565b5f808060018187870360208111611a925780611a95565b60205b915050875192505b8519600184841a1b16158183101615611abb57600182019150611a9d565b9681019660208290036008810293841c90931b92611b065760408051602081018590520160408051601f198184030181529082905263e47fe8b760e01b8252610c7d9160040161239f565b50869350909150505b935093915050565b600182810180515f928392600560ff93909316602102870192830192909101835b81831015611bdc5760018301516021909301805190935f90819060ff168180611b61838e61205b565b915091508186165f03611b83575f809b509b5050505050505050505050611be7565b5f87611b93600185038916612086565b016004028b015195505062ffffff9081169350841683039150611bc79050575060019750601c1a9550611be7945050505050565b611bd083612086565b84019350505050611b38565b5f8095509550505050505b9250929050565b6101c08201516002828102820101516101e08401515f9261ffff9092169190611c149083565b95945050505050565b606060405180606001604052806040815260200161264860409139905090565b5f81515f14611c5f576040516304f8b58160e51b815260040160405180910390fd5b505f919050565b5f8151600103611cc3575060208101516001600160e01b038116601b0b60e082901d5f611c9483838361213f565b905061ffff811115611cb957604051631e4e01d760e21b815260040160405180910390fd5b9250611cfd915050565b81515f03611ce457604051630f16066b60e41b815260040160405180910390fd5b604051630358cd2160e31b815260040160405180910390fd5b919050565b5f8151600203611d9757602082015160408301516001600160e01b038216601b0b60e083901d5f611d3483838361213f565b6001600160e01b038516601b0b935060e085901d925090505f611d5884848361213f565b905060ff821180611d69575060ff81115b15611d8757604051631e4e01d760e21b815260040160405180910390fd5b60081b179450611cfd9350505050565b600282511015611ce457604051630f16066b60e41b815260040160405180910390fd5b5f60608060ff851180611dcd575060ff84115b15611df557604051639b0f326160e01b81526004810186905260248101859052604401610c7d565b6040805160248101909152600386602383015385602283015360106021830153806020830153506004815260408051602081019091525f8152600197919650945092505050565b60605f611e4883612181565b90505f611e5682602061253a565b9050606060405190508160200181016040528281526020850160208651028101602083015b81831015611e9e57602083515102806020855101835e6020939093019201611e7b565b50919695505050505050565b611f376040518061026001604052805f81526020015f81526020015f81526020015f81526020015f81526020015f81526020015f80191681526020015f81526020015f81526020015f81526020015f81526020015f81526020015f80191681526020016060815260200160608152602001606081526020015f815260200160608152602001606081525090565b5f6040518061026001604052805f81526020015f81526020015f81526020015f81526020015f81526020015f81526020015f801b81526020015f8152602001600481526020015f81526020015f81526020015f81526020015f801b815260200184815260200185815260200160046001600160401b03811115611fbc57611fbc6123b1565b604051908082528060200260200182016040528015611fe5578160200160208202803683370190505b5081525f602080830182905260408084018b905260609384018a90528051601f01601f19168281528083018252835161ffff191681178452855290840182905283018190529082018190526080820181905260a08201819052610120820181905261014082018190526102008201529050611c14565b5f80825f528360205360215f2090506001815f1a1b915062ffffff8116611be7575060019250929050565b5f5f1982036120985750610100919050565b507f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f7f5555555555555555555555555555555555555555555555555555555555555555600183901c16909103600281901c7f3333333333333333333333333333333333333333333333333333333333333333908116911601600481901c01167f01010101010101010101010101010101010101010101010101010101010101010260f81c90565b5f805f61214d8686866121ca565b91509150806121785760405162bc8ecf60e31b81526004810187905260248101869052604401610c7d565b50949350505050565b5f60208201602083510281015b808210156121c35781515192830192808410156121b757634e487b715f5260116020526024601cfd5b5060208201915061218e565b5050919050565b5f805f8512156121f757604051634a7d166b60e01b81526004810186905260248101859052604401610c7d565b845f0361220957505f90506001611b0f565b8460ff84168501858112156122445760405163c849483b60e01b8152600481018890526024810187905260ff86166044820152606401610c7d565b5f805f83121561229057604c19831215612267575f809550955050505050611b0f565b825f03600a0a915081848161227e5761227e612507565b0495505084029091149150611b0f9050565b5f83131561232957604d8313156122cd5760405163c849483b60e01b8152600481018a90526024810189905260ff88166044820152606401610c7d565b82600a0a9150815f19816122e3576122e3612507565b048411156123175760405163c849483b60e01b8152600481018a90526024810189905260ff88166044820152606401610c7d565b5091909102925060019150611b0f9050565b8360019550955050505050611b0f565b612341612551565b565b5f60208284031215612353575f80fd5b81356001600160e01b03198116811461236a575f80fd5b9392505050565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f61236a6020830184612371565b634e487b7160e01b5f52604160045260245ffd5b5f602082840312156123d5575f80fd5b81356001600160401b03808211156123eb575f80fd5b818401915084601f8301126123fe575f80fd5b813581811115612410576124106123b1565b604051601f8201601f19908116603f01168101908382118183101715612438576124386123b1565b81604052828152876020848701011115612450575f80fd5b826020860160208301375f928101602001929092525095945050505050565b83151581525f60206060602084015261248b6060840186612371565b8381036040850152845180825260208087019201905f5b818110156124be578351835292840192918401916001016124a2565b509098975050505050505050565b634e487b7160e01b5f52601160045260245ffd5b808201808211156101d1576101d16124cc565b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52601260045260245ffd5b5f8261253557634e487b7160e01b5f52601260045260245ffd5b500490565b80820281158282048414176101d1576101d16124cc565b634e487b7160e01b5f52605160045260245ffdfe0101180010800082000100010480300038412a001810000010020004200004002038028ff54904cc66c61df3dcab0616592209895f0b14fec9301902e0920c5bfe561b21609200e959460b1974270f844db208bcd3bf1c9893761e1049db11b93430180ae9a00af82a7805c138f40d28083f0742ef2103d561fd1215a13315716a6117d260cc107b9bfc0eec7ade13cba2891a6b14a51f792bdb01e0f147165655891c3d1c3d1c3d1c3d1c3d1c3d1c3d1c3d1c3d1c3d1c3d1c3d1c3d1c3d1c3d1c3d1c3d1c3d1c3d1c3d1c3d1c3d1c3d1c3d1c3d1c3d1c3d1c3d1c3d1c3d1c661d02168216a016af16be16ce16de16ed16fd170c171c172c173b174b175a176a177a178a17da17e917f81808181818281838184718561866187618861896179917a8"; + hex"6080604052348015600e575f80fd5b506127138061001c5f395ff3fe608060405234801561000f575f80fd5b506004361061007a575f3560e01c80636f5aa28d116100585780636f5aa28d146100dd578063c6c0cbb61461010b578063ccf4477514610135578063d6d8c9a814610148575f80fd5b806301ffc9a71461007e578063336284d4146100a6578063570c7a63146100bb575b5f80fd5b61009161008c3660046123ce565b610150565b60405190151581526020015b60405180910390f35b6100ae6101d7565b60405161009d919061242a565b6100ce6100c9366004612450565b610bd4565b60405161009d939291906124fa565b6040517fe43208b51e17b3d887e8f3535d75526c0744eee6a200dac603462c6b3ca46511815260200161009d565b61011e610119366004612450565b610d18565b60408051921515835260208301919091520161009d565b60408051602081019091525f81526100ae565b6100ae610d50565b5f6001600160e01b031982166391ccb1d560e01b148061018057506001600160e01b03198216636f5aa28d60e01b145b8061019b57506001600160e01b03198216631a2c8edd60e01b145b806101b657506001600160e01b03198216630cd8a13560e21b145b806101d157506301ffc9a760e01b6001600160e01b03198316145b92915050565b60605f6101e66006600161256b565b6101f190600161256b565b6101fc90600161256b565b6001600160401b038111156102135761021361243c565b60405190808252806020026020018201604052801561024657816020015b60608152602001906001900390816102315790505b506040805160018082528183019092529192505f9190816020015b6123c48152602001906001900390816102615790505090506116ec815f8151811061028e5761028e61257e565b6001600160401b03929092166020928302919091019091015260408051600480825260a082019092525f91816020015b6123c48152602001906001900390816102be57905050905061170a815f815181106102eb576102eb61257e565b60200260200101906001600160401b031690816001600160401b031681525050611719816001815181106103215761032161257e565b60200260200101906001600160401b031690816001600160401b031681525050611728816002815181106103575761035761257e565b60200260200101906001600160401b031690816001600160401b0316815250506117388160038151811061038d5761038d61257e565b6001600160401b039290921660209283029190910190910152604080516002808252606082019092525f91816020015b6123c48152602001906001900390816103bd579050509050611748815f815181106103ea576103ea61257e565b60200260200101906001600160401b031690816001600160401b031681525050611757816001815181106104205761042061257e565b6001600160401b03929092166020928302919091019091015260408051600580825260c082019092525f91816020015b6123c4815260200190600190039081610450579050509050611767815f8151811061047d5761047d61257e565b60200260200101906001600160401b031690816001600160401b031681525050611776816001815181106104b3576104b361257e565b60200260200101906001600160401b031690816001600160401b031681525050611786816002815181106104e9576104e961257e565b60200260200101906001600160401b031690816001600160401b0316815250506117968160038151811061051f5761051f61257e565b60200260200101906001600160401b031690816001600160401b0316815250506117a5816004815181106105555761055561257e565b6001600160401b03929092166020928302919091019091015260408051600580825260c082019092525f91816020015b6123c48152602001906001900390816105855790505090506117b5815f815181106105b2576105b261257e565b60200260200101906001600160401b031690816001600160401b0316815250506117c4816001815181106105e8576105e861257e565b60200260200101906001600160401b031690816001600160401b0316815250506117d48160028151811061061e5761061e61257e565b60200260200101906001600160401b031690816001600160401b0316815250506117e4816003815181106106545761065461257e565b60200260200101906001600160401b031690816001600160401b0316815250506117f48160048151811061068a5761068a61257e565b6001600160401b0392909216602092830291909101909101526040805160018082528183019092525f91816020015b6123c48152602001906001900390816106b9579050509050611803815f815181106106e6576106e661257e565b6001600160401b0392909216602092830291909101909101526040805160018082528183019092525f91816020015b6123c481526020019060019003908161071557905050905061181c815f815181106107425761074261257e565b60200260200101906001600160401b031690816001600160401b03168152505086885f815181106107755761077561257e565b602002602001018190525085886001815181106107945761079461257e565b602002602001018190525084886002815181106107b3576107b361257e565b602002602001018190525083886003815181106107d2576107d261257e565b602002602001018190525082886004815181106107f1576107f161257e565b6020908102919091010152818861080a6006600161256b565b8151811061081a5761081a61257e565b602090810291909101015280886108336006600161256b565b61083e90600161256b565b8151811061084e5761084e61257e565b602090810291909101015260408051600680825260e082019092525f91816020015b6123c4815260200190600190039081610870579050509050611865815f8151811061089d5761089d61257e565b60200260200101906001600160401b031690816001600160401b031681525050611874816001815181106108d3576108d361257e565b60200260200101906001600160401b031690816001600160401b031681525050611883816002815181106109095761090961257e565b60200260200101906001600160401b031690816001600160401b0316815250506118938160038151811061093f5761093f61257e565b60200260200101906001600160401b031690816001600160401b0316815250506118a3816004815181106109755761097561257e565b60200260200101906001600160401b031690816001600160401b0316815250506118b3816005815181106109ab576109ab61257e565b60200260200101906001600160401b031690816001600160401b03168152505080896005815181106109df576109df61257e565b602090810291909101015260408051600780825261010082019092525f91816020015b6123c4815260200190600190039081610a025790505090506118c3815f81518110610a2f57610a2f61257e565b60200260200101906001600160401b031690816001600160401b0316815250506118d281600181518110610a6557610a6561257e565b60200260200101906001600160401b031690816001600160401b0316815250506118e181600281518110610a9b57610a9b61257e565b60200260200101906001600160401b031690816001600160401b0316815250506118f181600381518110610ad157610ad161257e565b60200260200101906001600160401b031690816001600160401b03168152505061190181600481518110610b0757610b0761257e565b60200260200101906001600160401b031690816001600160401b03168152505061191181600581518110610b3d57610b3d61257e565b60200260200101906001600160401b031690816001600160401b03168152505061192181600681518110610b7357610b7361257e565b60200260200101906001600160401b031690816001600160401b031681525050808a600681518110610ba757610ba761257e565b602090810291909101015289610bc4610bbf82611931565b611946565b9b50505050505050505050505090565b5f6060805f805f610bf487610be76119d5565b610bef6119f5565b611a15565b9250925092505f610c0a82610220015160200190565b90505f8261022001515182610c1f919061256b565b90505f610c3d83836f07fffffe0000000003ff200000000000611b06565b80925081945050505f80610c5686610240015184611ba2565b915091508115610ceb575f610c6b8783611c79565b90506123c45f610c79611ca8565b90505f60028251610c8a91906125a6565b9050808510610cbb576040516303bdd1b160e51b815260048101869052602481018290526044015b60405180910390fd5b6001850160020282015161ffff169250610cd48c8c8686565b9e509e509e50505050505050505050505050610d11565b5050604080515f80825281830190925260208101828152919a5090985096505050505050505b9193909250565b5f805f805f610d40866002810151815160228084019461ffff93909316840101920160200190565b505f988998509650505050505050565b60605f610d5f6006600161256b565b610d6a90600161256b565b610d7590600161256b565b6001600160401b03811115610d8c57610d8c61243c565b604051908082528060200260200182016040528015610dbf57816020015b6060815260200190600190039081610daa5790505b506040805160018082528183019092529192505f9190816020015b6123c4815260200190600190039081610dda579050509050611cc8815f81518110610e0757610e0761257e565b6001600160401b03929092166020928302919091019091015260408051600480825260a082019092525f91816020015b6123c4815260200190600190039081610e37579050509050611cc8815f81518110610e6457610e6461257e565b60200260200101906001600160401b031690816001600160401b031681525050611cc881600181518110610e9a57610e9a61257e565b60200260200101906001600160401b031690816001600160401b031681525050611cc881600281518110610ed057610ed061257e565b60200260200101906001600160401b031690816001600160401b031681525050611cc881600381518110610f0657610f0661257e565b6001600160401b039290921660209283029190910190910152604080516002808252606082019092525f91816020015b6123c4815260200190600190039081610f36579050509050611cc8815f81518110610f6357610f6361257e565b60200260200101906001600160401b031690816001600160401b031681525050611cc881600181518110610f9957610f9961257e565b6001600160401b03929092166020928302919091019091015260408051600580825260c082019092525f91816020015b6123c4815260200190600190039081610fc9579050509050611cc8815f81518110610ff657610ff661257e565b60200260200101906001600160401b031690816001600160401b031681525050611cc88160018151811061102c5761102c61257e565b60200260200101906001600160401b031690816001600160401b031681525050611cc8816002815181106110625761106261257e565b60200260200101906001600160401b031690816001600160401b031681525050611cc8816003815181106110985761109861257e565b60200260200101906001600160401b031690816001600160401b031681525050611cc8816004815181106110ce576110ce61257e565b6001600160401b03929092166020928302919091019091015260408051600580825260c082019092525f91816020015b6123c48152602001906001900390816110fe579050509050611cc8815f8151811061112b5761112b61257e565b60200260200101906001600160401b031690816001600160401b031681525050611cc8816001815181106111615761116161257e565b60200260200101906001600160401b031690816001600160401b031681525050611cc8816002815181106111975761119761257e565b60200260200101906001600160401b031690816001600160401b031681525050611cc8816003815181106111cd576111cd61257e565b60200260200101906001600160401b031690816001600160401b031681525050611cc8816004815181106112035761120361257e565b6001600160401b0392909216602092830291909101909101526040805160018082528183019092525f91816020015b6123c4815260200190600190039081611232579050509050611cf1815f8151811061125f5761125f61257e565b6001600160401b0392909216602092830291909101909101526040805160018082528183019092525f91816020015b6123c481526020019060019003908161128e579050509050611d8d815f815181106112bb576112bb61257e565b60200260200101906001600160401b031690816001600160401b03168152505086885f815181106112ee576112ee61257e565b6020026020010181905250858860018151811061130d5761130d61257e565b6020026020010181905250848860028151811061132c5761132c61257e565b6020026020010181905250838860038151811061134b5761134b61257e565b6020026020010181905250828860048151811061136a5761136a61257e565b602090810291909101015281886113836006600161256b565b815181106113935761139361257e565b602090810291909101015280886113ac6006600161256b565b6113b790600161256b565b815181106113c7576113c761257e565b602090810291909101015260408051600680825260e082019092525f91816020015b6123c48152602001906001900390816113e9579050509050611cc8815f815181106114165761141661257e565b60200260200101906001600160401b031690816001600160401b031681525050611cc88160018151811061144c5761144c61257e565b60200260200101906001600160401b031690816001600160401b031681525050611cc8816002815181106114825761148261257e565b60200260200101906001600160401b031690816001600160401b031681525050611cc8816003815181106114b8576114b861257e565b60200260200101906001600160401b031690816001600160401b031681525050611cc8816004815181106114ee576114ee61257e565b60200260200101906001600160401b031690816001600160401b031681525050611cc8816005815181106115245761152461257e565b60200260200101906001600160401b031690816001600160401b03168152505080896005815181106115585761155861257e565b602090810291909101015260408051600780825261010082019092525f91816020015b6123c481526020019060019003908161157b579050509050611cc8815f815181106115a8576115a861257e565b60200260200101906001600160401b031690816001600160401b031681525050611cc8816001815181106115de576115de61257e565b60200260200101906001600160401b031690816001600160401b031681525050611cc8816002815181106116145761161461257e565b60200260200101906001600160401b031690816001600160401b031681525050611cc88160038151811061164a5761164a61257e565b60200260200101906001600160401b031690816001600160401b031681525050611cc8816004815181106116805761168061257e565b60200260200101906001600160401b031690816001600160401b031681525050611cc8816005815181106116b6576116b661257e565b60200260200101906001600160401b031690816001600160401b031681525050611cc881600681518110610b7357610b7361257e565b5f6060806116fb5f6001611e45565b92509250925093509350939050565b5f6060806116fb60015f611e45565b5f6060806116fb600180611e45565b5f6060806116fb60016002611e45565b5f6060806116fb60016003611e45565b5f6060806116fb60025f611e45565b5f6060806116fb60026001611e45565b5f6060806116fb60035f611e45565b5f6060806116fb60036001611e45565b5f6060806116fb60036002611e45565b5f6060806116fb600380611e45565b5f6060806116fb60036004611e45565b5f6060806116fb60045f611e45565b5f6060806116fb60046001611e45565b5f6060806116fb60046002611e45565b5f6060806116fb60046003611e45565b5f6060806116fb600480611e45565b5f6060806116fb6118166006600161256b565b85611e45565b5f60608060ff8416600885901c611854826118396006600161256b565b61184490600161256b565b61184e919061256b565b82611e45565b945094509450505093509350939050565b5f6060806116fb600580611e45565b5f6060806116fb60055f611e45565b5f6060806116fb60056001611e45565b5f6060806116fb60056002611e45565b5f6060806116fb60056003611e45565b5f6060806116fb60056004611e45565b5f6060806116fb600680611e45565b5f6060806116fb60065f611e45565b5f6060806116fb60066001611e45565b5f6060806116fb60066002611e45565b5f6060806116fb60066003611e45565b5f6060806116fb60066004611e45565b5f6060806116fb60066005611e45565b6060815f61193e82611ec7565b949350505050565b60605f82516002026001600160401b038111156119655761196561243c565b6040519080825280601f01601f19166020018201604052801561198f576020820181803683370190505b50905061ffff80196020850160208651028101600285015b818310156119c9578051835186169085161781526020909201916002016119a7565b50939695505050505050565b60606040518060e0016040528060a2815260200161267160a29139905090565b606060405180606001604052806040815260200161263160409139905090565b5f80611aa46040518061026001604052805f81526020015f81526020015f81526020015f81526020015f81526020015f81526020015f80191681526020015f81526020015f81526020015f81526020015f81526020015f81526020015f80191681526020016060815260200160608152602001606081526020015f815260200160608152602001606081525090565b606061ffff600288015116935060ff600388015116925061ffff600588015116600588019750808852602081018801915050611af087878760405180602001604052805f815250611f35565b915080826101e001819052505093509350939050565b5f808060018187870360208111611b1d5780611b20565b60205b915050875192505b8519600184841a1b16158183101615611b4657600182019150611b28565b9681019660208290036008810293841c90931b92611b915760408051602081018590520160408051601f198184030181529082905263e47fe8b760e01b8252610cb29160040161242a565b50869350909150505b935093915050565b600182810180515f928392600560ff93909316602102870192830192909101835b81831015611c675760018301516021909301805190935f90819060ff168180611bec838e6120e6565b915091508186165f03611c0e575f809b509b5050505050505050505050611c72565b5f87611c1e600185038916612111565b016004028b015195505062ffffff9081169350841683039150611c529050575060019750601c1a9550611c72945050505050565b611c5b83612111565b84019350505050611bc3565b5f8095509550505050505b9250929050565b6101c08201516002828102820101516101e08401515f9261ffff9092169190611c9f9083565b95945050505050565b60606040518060600160405280604081526020016125f160409139905090565b5f81515f14611cea576040516304f8b58160e51b815260040160405180910390fd5b505f919050565b5f8151600103611d4e575060208101516001600160e01b038116601b0b60e082901d5f611d1f8383836121ca565b905061ffff811115611d4457604051631e4e01d760e21b815260040160405180910390fd5b9250611d88915050565b81515f03611d6f57604051630f16066b60e41b815260040160405180910390fd5b604051630358cd2160e31b815260040160405180910390fd5b919050565b5f8151600203611e2257602082015160408301516001600160e01b038216601b0b60e083901d5f611dbf8383836121ca565b6001600160e01b038516601b0b935060e085901d925090505f611de38484836121ca565b905060ff821180611df4575060ff81115b15611e1257604051631e4e01d760e21b815260040160405180910390fd5b60081b179450611d889350505050565b600282511015611d6f57604051630f16066b60e41b815260040160405180910390fd5b5f60608060ff851180611e58575060ff84115b15611e8057604051639b0f326160e01b81526004810186905260248101859052604401610cb2565b6040805160248101909152600386602383015385602283015360106021830153806020830153506004815260408051602081019091525f8152600197919650945092505050565b60605f611ed38361220c565b90505f611ee18260206125c5565b9050606060405190508160200181016040528281526020850160208651028101602083015b81831015611f2957602083515102806020855101835e6020939093019201611f06565b50919695505050505050565b611fc26040518061026001604052805f81526020015f81526020015f81526020015f81526020015f81526020015f81526020015f80191681526020015f81526020015f81526020015f81526020015f81526020015f81526020015f80191681526020016060815260200160608152602001606081526020015f815260200160608152602001606081525090565b5f6040518061026001604052805f81526020015f81526020015f81526020015f81526020015f81526020015f81526020015f801b81526020015f8152602001600481526020015f81526020015f81526020015f81526020015f801b815260200184815260200185815260200160046001600160401b038111156120475761204761243c565b604051908082528060200260200182016040528015612070578160200160208202803683370190505b5081525f602080830182905260408084018b905260609384018a90528051601f01601f19168281528083018252835161ffff191681178452855290840182905283018190529082018190526080820181905260a08201819052610120820181905261014082018190526102008201529050611c9f565b5f80825f528360205360215f2090506001815f1a1b915062ffffff8116611c72575060019250929050565b5f5f1982036121235750610100919050565b507f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f7f5555555555555555555555555555555555555555555555555555555555555555600183901c16909103600281901c7f3333333333333333333333333333333333333333333333333333333333333333908116911601600481901c01167f01010101010101010101010101010101010101010101010101010101010101010260f81c90565b5f805f6121d8868686612255565b91509150806122035760405162bc8ecf60e31b81526004810187905260248101869052604401610cb2565b50949350505050565b5f60208201602083510281015b8082101561224e57815151928301928084101561224257634e487b715f5260116020526024601cfd5b50602082019150612219565b5050919050565b5f805f85121561228257604051634a7d166b60e01b81526004810186905260248101859052604401610cb2565b845f0361229457505f90506001611b9a565b8460ff84168501858112156122cf5760405163c849483b60e01b8152600481018890526024810187905260ff86166044820152606401610cb2565b5f805f83121561231b57604c198312156122f2575f809550955050505050611b9a565b825f03600a0a915081848161230957612309612592565b0495505084029091149150611b9a9050565b5f8313156123b457604d8313156123585760405163c849483b60e01b8152600481018a90526024810189905260ff88166044820152606401610cb2565b82600a0a9150815f198161236e5761236e612592565b048411156123a25760405163c849483b60e01b8152600481018a90526024810189905260ff88166044820152606401610cb2565b5091909102925060019150611b9a9050565b8360019550955050505050611b9a565b6123cc6125dc565b565b5f602082840312156123de575f80fd5b81356001600160e01b0319811681146123f5575f80fd5b9392505050565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f6123f560208301846123fc565b634e487b7160e01b5f52604160045260245ffd5b5f60208284031215612460575f80fd5b81356001600160401b0380821115612476575f80fd5b818401915084601f830112612489575f80fd5b81358181111561249b5761249b61243c565b604051601f8201601f19908116603f011681019083821181831017156124c3576124c361243c565b816040528281528760208487010111156124db575f80fd5b826020860160208301375f928101602001929092525095945050505050565b83151581525f60206060602084015261251660608401866123fc565b8381036040850152845180825260208087019201905f5b818110156125495783518352928401929184019160010161252d565b509098975050505050505050565b634e487b7160e01b5f52601160045260245ffd5b808201808211156101d1576101d1612557565b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52601260045260245ffd5b5f826125c057634e487b7160e01b5f52601260045260245ffd5b500490565b80820281158282048414176101d1576101d1612557565b634e487b7160e01b5f52605160045260245ffdfe16ec170a17191728173817481757176717761786179617a517b517c417d417e417f4186518741883189318a318b318c318d218e118f11901191119211803181c1cc81cc81cc81cc81cc81cc81cc81cc81cc81cc81cc81cc81cc81cc81cc81cc81cc81cc81cc81cc81cc81cc81cc81cc81cc81cc81cc81cc81cc81cc81cf11d8d0101180010800082000100010480300038412a001810000010020004200004002038028ff54904cc66c61df3dcab0616592209895f0b14fec9301902e0920c5bfe561b21609200e959460b1974270f844db208bcd3bf1c9893761e1049db11b93430180ae9a00af82a7805c138f40d28083f0742ef2103d561fd1215a13315716a6117d260cc107b9bfc0eec7ade13cba2891a6b14a51f792bdb01e0f14716565589"; /// @dev The runtime bytecode of the contract. bytes constant RUNTIME_CODE = - hex"608060405234801561000f575f80fd5b506004361061007a575f3560e01c80636f5aa28d116100585780636f5aa28d146100dd578063c6c0cbb61461010b578063ccf4477514610135578063d6d8c9a814610148575f80fd5b806301ffc9a71461007e578063336284d4146100a6578063570c7a63146100bb575b5f80fd5b61009161008c366004612343565b610150565b60405190151581526020015b60405180910390f35b6100ae6101d7565b60405161009d919061239f565b6100ce6100c93660046123c5565b610b9f565b60405161009d9392919061246f565b6040517fe43208b51e17b3d887e8f3535d75526c0744eee6a200dac603462c6b3ca46511815260200161009d565b61011e6101193660046123c5565b610ce3565b60408051921515835260208301919091520161009d565b60408051602081019091525f81526100ae565b6100ae610d1b565b5f6001600160e01b031982166391ccb1d560e01b148061018057506001600160e01b03198216636f5aa28d60e01b145b8061019b57506001600160e01b03198216631a2c8edd60e01b145b806101b657506001600160e01b03198216630cd8a13560e21b145b806101d157506301ffc9a760e01b6001600160e01b03198316145b92915050565b60605f6101e6600960016124e0565b6001600160401b038111156101fd576101fd6123b1565b60405190808252806020026020018201604052801561023057816020015b606081526020019060019003908161021b5790505b506040805160018082528183019092529192505f9190816020015b61233981526020019060019003908161024b579050509050611682815f81518110610278576102786124f3565b6001600160401b03929092166020928302919091019091015260408051600480825260a082019092525f91816020015b6123398152602001906001900390816102a85790505090506116a0815f815181106102d5576102d56124f3565b60200260200101906001600160401b031690816001600160401b0316815250506116af8160018151811061030b5761030b6124f3565b60200260200101906001600160401b031690816001600160401b0316815250506116be81600281518110610341576103416124f3565b60200260200101906001600160401b031690816001600160401b0316815250506116ce81600381518110610377576103776124f3565b6001600160401b039290921660209283029190910190910152604080516002808252606082019092525f91816020015b6123398152602001906001900390816103a75790505090506116de815f815181106103d4576103d46124f3565b60200260200101906001600160401b031690816001600160401b0316815250506116ed8160018151811061040a5761040a6124f3565b6001600160401b03929092166020928302919091019091015260408051600580825260c082019092525f91816020015b61233981526020019060019003908161043a5790505090506116fd815f81518110610467576104676124f3565b60200260200101906001600160401b031690816001600160401b03168152505061170c8160018151811061049d5761049d6124f3565b60200260200101906001600160401b031690816001600160401b03168152505061171c816002815181106104d3576104d36124f3565b60200260200101906001600160401b031690816001600160401b03168152505061172c81600381518110610509576105096124f3565b60200260200101906001600160401b031690816001600160401b03168152505061173b8160048151811061053f5761053f6124f3565b6001600160401b03929092166020928302919091019091015260408051600580825260c082019092525f91816020015b61233981526020019060019003908161056f57905050905061174b815f8151811061059c5761059c6124f3565b60200260200101906001600160401b031690816001600160401b03168152505061175a816001815181106105d2576105d26124f3565b60200260200101906001600160401b031690816001600160401b03168152505061176a81600281518110610608576106086124f3565b60200260200101906001600160401b031690816001600160401b03168152505061177a8160038151811061063e5761063e6124f3565b60200260200101906001600160401b031690816001600160401b03168152505061178a81600481518110610674576106746124f3565b6001600160401b0392909216602092830291909101909101526040805160018082528183019092525f91816020015b6123398152602001906001900390816106a3579050509050611799815f815181106106d0576106d06124f3565b6001600160401b0392909216602092830291909101909101526040805160018082528183019092525f91816020015b6123398152602001906001900390816106ff5790505090506117a8815f8151811061072c5761072c6124f3565b60200260200101906001600160401b031690816001600160401b03168152505086885f8151811061075f5761075f6124f3565b6020026020010181905250858860018151811061077e5761077e6124f3565b6020026020010181905250848860028151811061079d5761079d6124f3565b602002602001018190525083886003815181106107bc576107bc6124f3565b602002602001018190525082886004815181106107db576107db6124f3565b602002602001018190525081886008815181106107fa576107fa6124f3565b60200260200101819052508088600981518110610819576108196124f3565b602090810291909101015260408051600680825260e082019092525f91816020015b61233981526020019060019003908161083b5790505090506117da815f81518110610868576108686124f3565b60200260200101906001600160401b031690816001600160401b0316815250506117e98160018151811061089e5761089e6124f3565b60200260200101906001600160401b031690816001600160401b0316815250506117f8816002815181106108d4576108d46124f3565b60200260200101906001600160401b031690816001600160401b0316815250506118088160038151811061090a5761090a6124f3565b60200260200101906001600160401b031690816001600160401b03168152505061181881600481518110610940576109406124f3565b60200260200101906001600160401b031690816001600160401b03168152505061182881600581518110610976576109766124f3565b60200260200101906001600160401b031690816001600160401b03168152505080896005815181106109aa576109aa6124f3565b602090810291909101015260408051600780825261010082019092525f91816020015b6123398152602001906001900390816109cd579050509050611838815f815181106109fa576109fa6124f3565b60200260200101906001600160401b031690816001600160401b03168152505061184781600181518110610a3057610a306124f3565b60200260200101906001600160401b031690816001600160401b03168152505061185681600281518110610a6657610a666124f3565b60200260200101906001600160401b031690816001600160401b03168152505061186681600381518110610a9c57610a9c6124f3565b60200260200101906001600160401b031690816001600160401b03168152505061187681600481518110610ad257610ad26124f3565b60200260200101906001600160401b031690816001600160401b03168152505061188681600581518110610b0857610b086124f3565b60200260200101906001600160401b031690816001600160401b03168152505061189681600681518110610b3e57610b3e6124f3565b60200260200101906001600160401b031690816001600160401b031681525050808a600681518110610b7257610b726124f3565b602090810291909101015289610b8f610b8a826118a6565b6118bb565b9b50505050505050505050505090565b5f6060805f805f610bbf87610bb261194a565b610bba61196a565b61198a565b9250925092505f610bd582610220015160200190565b90505f8261022001515182610bea91906124e0565b90505f610c0883836f07fffffe0000000003ff200000000000611a7b565b80925081945050505f80610c2186610240015184611b17565b915091508115610cb6575f610c368783611bee565b90506123395f610c44611c1d565b90505f60028251610c55919061251b565b9050808510610c86576040516303bdd1b160e51b815260048101869052602481018290526044015b60405180910390fd5b6001850160020282015161ffff169250610c9f8c8c8686565b9e509e509e50505050505050505050505050610cdc565b5050604080515f80825281830190925260208101828152919a5090985096505050505050505b9193909250565b5f805f805f610d0b866002810151815160228084019461ffff93909316840101920160200190565b505f988998509650505050505050565b60605f610d2a600960016124e0565b6001600160401b03811115610d4157610d416123b1565b604051908082528060200260200182016040528015610d7457816020015b6060815260200190600190039081610d5f5790505b506040805160018082528183019092529192505f9190816020015b612339815260200190600190039081610d8f579050509050611c3d815f81518110610dbc57610dbc6124f3565b6001600160401b03929092166020928302919091019091015260408051600480825260a082019092525f91816020015b612339815260200190600190039081610dec579050509050611c3d815f81518110610e1957610e196124f3565b60200260200101906001600160401b031690816001600160401b031681525050611c3d81600181518110610e4f57610e4f6124f3565b60200260200101906001600160401b031690816001600160401b031681525050611c3d81600281518110610e8557610e856124f3565b60200260200101906001600160401b031690816001600160401b031681525050611c3d81600381518110610ebb57610ebb6124f3565b6001600160401b039290921660209283029190910190910152604080516002808252606082019092525f91816020015b612339815260200190600190039081610eeb579050509050611c3d815f81518110610f1857610f186124f3565b60200260200101906001600160401b031690816001600160401b031681525050611c3d81600181518110610f4e57610f4e6124f3565b6001600160401b03929092166020928302919091019091015260408051600580825260c082019092525f91816020015b612339815260200190600190039081610f7e579050509050611c3d815f81518110610fab57610fab6124f3565b60200260200101906001600160401b031690816001600160401b031681525050611c3d81600181518110610fe157610fe16124f3565b60200260200101906001600160401b031690816001600160401b031681525050611c3d81600281518110611017576110176124f3565b60200260200101906001600160401b031690816001600160401b031681525050611c3d8160038151811061104d5761104d6124f3565b60200260200101906001600160401b031690816001600160401b031681525050611c3d81600481518110611083576110836124f3565b6001600160401b03929092166020928302919091019091015260408051600580825260c082019092525f91816020015b6123398152602001906001900390816110b3579050509050611c3d815f815181106110e0576110e06124f3565b60200260200101906001600160401b031690816001600160401b031681525050611c3d81600181518110611116576111166124f3565b60200260200101906001600160401b031690816001600160401b031681525050611c3d8160028151811061114c5761114c6124f3565b60200260200101906001600160401b031690816001600160401b031681525050611c3d81600381518110611182576111826124f3565b60200260200101906001600160401b031690816001600160401b031681525050611c3d816004815181106111b8576111b86124f3565b6001600160401b0392909216602092830291909101909101526040805160018082528183019092525f91816020015b6123398152602001906001900390816111e7579050509050611c66815f81518110611214576112146124f3565b6001600160401b0392909216602092830291909101909101526040805160018082528183019092525f91816020015b612339815260200190600190039081611243579050509050611d02815f81518110611270576112706124f3565b60200260200101906001600160401b031690816001600160401b03168152505086885f815181106112a3576112a36124f3565b602002602001018190525085886001815181106112c2576112c26124f3565b602002602001018190525084886002815181106112e1576112e16124f3565b60200260200101819052508388600381518110611300576113006124f3565b6020026020010181905250828860048151811061131f5761131f6124f3565b6020026020010181905250818860088151811061133e5761133e6124f3565b6020026020010181905250808860098151811061135d5761135d6124f3565b602090810291909101015260408051600680825260e082019092525f91816020015b61233981526020019060019003908161137f579050509050611c3d815f815181106113ac576113ac6124f3565b60200260200101906001600160401b031690816001600160401b031681525050611c3d816001815181106113e2576113e26124f3565b60200260200101906001600160401b031690816001600160401b031681525050611c3d81600281518110611418576114186124f3565b60200260200101906001600160401b031690816001600160401b031681525050611c3d8160038151811061144e5761144e6124f3565b60200260200101906001600160401b031690816001600160401b031681525050611c3d81600481518110611484576114846124f3565b60200260200101906001600160401b031690816001600160401b031681525050611c3d816005815181106114ba576114ba6124f3565b60200260200101906001600160401b031690816001600160401b03168152505080896005815181106114ee576114ee6124f3565b602090810291909101015260408051600780825261010082019092525f91816020015b612339815260200190600190039081611511579050509050611c3d815f8151811061153e5761153e6124f3565b60200260200101906001600160401b031690816001600160401b031681525050611c3d81600181518110611574576115746124f3565b60200260200101906001600160401b031690816001600160401b031681525050611c3d816002815181106115aa576115aa6124f3565b60200260200101906001600160401b031690816001600160401b031681525050611c3d816003815181106115e0576115e06124f3565b60200260200101906001600160401b031690816001600160401b031681525050611c3d81600481518110611616576116166124f3565b60200260200101906001600160401b031690816001600160401b031681525050611c3d8160058151811061164c5761164c6124f3565b60200260200101906001600160401b031690816001600160401b031681525050611c3d81600681518110610b3e57610b3e6124f3565b5f6060806116915f6001611dba565b92509250925093509350939050565b5f60608061169160015f611dba565b5f606080611691600180611dba565b5f60608061169160016002611dba565b5f60608061169160016003611dba565b5f60608061169160025f611dba565b5f60608061169160026001611dba565b5f60608061169160035f611dba565b5f60608061169160036001611dba565b5f60608061169160036002611dba565b5f606080611691600380611dba565b5f60608061169160036004611dba565b5f60608061169160045f611dba565b5f60608061169160046001611dba565b5f60608061169160046002611dba565b5f60608061169160046003611dba565b5f606080611691600480611dba565b5f606080611691600885611dba565b5f60608060ff8416600885901c6117c96117c38360096124e0565b82611dba565b945094509450505093509350939050565b5f606080611691600580611dba565b5f60608061169160055f611dba565b5f60608061169160056001611dba565b5f60608061169160056002611dba565b5f60608061169160056003611dba565b5f60608061169160056004611dba565b5f606080611691600680611dba565b5f60608061169160065f611dba565b5f60608061169160066001611dba565b5f60608061169160066002611dba565b5f60608061169160066003611dba565b5f60608061169160066004611dba565b5f60608061169160066005611dba565b6060815f6118b382611e3c565b949350505050565b60605f82516002026001600160401b038111156118da576118da6123b1565b6040519080825280601f01601f191660200182016040528015611904576020820181803683370190505b50905061ffff80196020850160208651028101600285015b8183101561193e5780518351861690851617815260209092019160020161191c565b50939695505050505050565b60606040518060e0016040528060a2815260200161256660a29139905090565b606060405180606001604052806040815260200161260860409139905090565b5f80611a196040518061026001604052805f81526020015f81526020015f81526020015f81526020015f81526020015f81526020015f80191681526020015f81526020015f81526020015f81526020015f81526020015f81526020015f80191681526020016060815260200160608152602001606081526020015f815260200160608152602001606081525090565b606061ffff600288015116935060ff600388015116925061ffff600588015116600588019750808852602081018801915050611a6587878760405180602001604052805f815250611eaa565b915080826101e001819052505093509350939050565b5f808060018187870360208111611a925780611a95565b60205b915050875192505b8519600184841a1b16158183101615611abb57600182019150611a9d565b9681019660208290036008810293841c90931b92611b065760408051602081018590520160408051601f198184030181529082905263e47fe8b760e01b8252610c7d9160040161239f565b50869350909150505b935093915050565b600182810180515f928392600560ff93909316602102870192830192909101835b81831015611bdc5760018301516021909301805190935f90819060ff168180611b61838e61205b565b915091508186165f03611b83575f809b509b5050505050505050505050611be7565b5f87611b93600185038916612086565b016004028b015195505062ffffff9081169350841683039150611bc79050575060019750601c1a9550611be7945050505050565b611bd083612086565b84019350505050611b38565b5f8095509550505050505b9250929050565b6101c08201516002828102820101516101e08401515f9261ffff9092169190611c149083565b95945050505050565b606060405180606001604052806040815260200161264860409139905090565b5f81515f14611c5f576040516304f8b58160e51b815260040160405180910390fd5b505f919050565b5f8151600103611cc3575060208101516001600160e01b038116601b0b60e082901d5f611c9483838361213f565b905061ffff811115611cb957604051631e4e01d760e21b815260040160405180910390fd5b9250611cfd915050565b81515f03611ce457604051630f16066b60e41b815260040160405180910390fd5b604051630358cd2160e31b815260040160405180910390fd5b919050565b5f8151600203611d9757602082015160408301516001600160e01b038216601b0b60e083901d5f611d3483838361213f565b6001600160e01b038516601b0b935060e085901d925090505f611d5884848361213f565b905060ff821180611d69575060ff81115b15611d8757604051631e4e01d760e21b815260040160405180910390fd5b60081b179450611cfd9350505050565b600282511015611ce457604051630f16066b60e41b815260040160405180910390fd5b5f60608060ff851180611dcd575060ff84115b15611df557604051639b0f326160e01b81526004810186905260248101859052604401610c7d565b6040805160248101909152600386602383015385602283015360106021830153806020830153506004815260408051602081019091525f8152600197919650945092505050565b60605f611e4883612181565b90505f611e5682602061253a565b9050606060405190508160200181016040528281526020850160208651028101602083015b81831015611e9e57602083515102806020855101835e6020939093019201611e7b565b50919695505050505050565b611f376040518061026001604052805f81526020015f81526020015f81526020015f81526020015f81526020015f81526020015f80191681526020015f81526020015f81526020015f81526020015f81526020015f81526020015f80191681526020016060815260200160608152602001606081526020015f815260200160608152602001606081525090565b5f6040518061026001604052805f81526020015f81526020015f81526020015f81526020015f81526020015f81526020015f801b81526020015f8152602001600481526020015f81526020015f81526020015f81526020015f801b815260200184815260200185815260200160046001600160401b03811115611fbc57611fbc6123b1565b604051908082528060200260200182016040528015611fe5578160200160208202803683370190505b5081525f602080830182905260408084018b905260609384018a90528051601f01601f19168281528083018252835161ffff191681178452855290840182905283018190529082018190526080820181905260a08201819052610120820181905261014082018190526102008201529050611c14565b5f80825f528360205360215f2090506001815f1a1b915062ffffff8116611be7575060019250929050565b5f5f1982036120985750610100919050565b507f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f7f5555555555555555555555555555555555555555555555555555555555555555600183901c16909103600281901c7f3333333333333333333333333333333333333333333333333333333333333333908116911601600481901c01167f01010101010101010101010101010101010101010101010101010101010101010260f81c90565b5f805f61214d8686866121ca565b91509150806121785760405162bc8ecf60e31b81526004810187905260248101869052604401610c7d565b50949350505050565b5f60208201602083510281015b808210156121c35781515192830192808410156121b757634e487b715f5260116020526024601cfd5b5060208201915061218e565b5050919050565b5f805f8512156121f757604051634a7d166b60e01b81526004810186905260248101859052604401610c7d565b845f0361220957505f90506001611b0f565b8460ff84168501858112156122445760405163c849483b60e01b8152600481018890526024810187905260ff86166044820152606401610c7d565b5f805f83121561229057604c19831215612267575f809550955050505050611b0f565b825f03600a0a915081848161227e5761227e612507565b0495505084029091149150611b0f9050565b5f83131561232957604d8313156122cd5760405163c849483b60e01b8152600481018a90526024810189905260ff88166044820152606401610c7d565b82600a0a9150815f19816122e3576122e3612507565b048411156123175760405163c849483b60e01b8152600481018a90526024810189905260ff88166044820152606401610c7d565b5091909102925060019150611b0f9050565b8360019550955050505050611b0f565b612341612551565b565b5f60208284031215612353575f80fd5b81356001600160e01b03198116811461236a575f80fd5b9392505050565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f61236a6020830184612371565b634e487b7160e01b5f52604160045260245ffd5b5f602082840312156123d5575f80fd5b81356001600160401b03808211156123eb575f80fd5b818401915084601f8301126123fe575f80fd5b813581811115612410576124106123b1565b604051601f8201601f19908116603f01168101908382118183101715612438576124386123b1565b81604052828152876020848701011115612450575f80fd5b826020860160208301375f928101602001929092525095945050505050565b83151581525f60206060602084015261248b6060840186612371565b8381036040850152845180825260208087019201905f5b818110156124be578351835292840192918401916001016124a2565b509098975050505050505050565b634e487b7160e01b5f52601160045260245ffd5b808201808211156101d1576101d16124cc565b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52601260045260245ffd5b5f8261253557634e487b7160e01b5f52601260045260245ffd5b500490565b80820281158282048414176101d1576101d16124cc565b634e487b7160e01b5f52605160045260245ffdfe0101180010800082000100010480300038412a001810000010020004200004002038028ff54904cc66c61df3dcab0616592209895f0b14fec9301902e0920c5bfe561b21609200e959460b1974270f844db208bcd3bf1c9893761e1049db11b93430180ae9a00af82a7805c138f40d28083f0742ef2103d561fd1215a13315716a6117d260cc107b9bfc0eec7ade13cba2891a6b14a51f792bdb01e0f147165655891c3d1c3d1c3d1c3d1c3d1c3d1c3d1c3d1c3d1c3d1c3d1c3d1c3d1c3d1c3d1c3d1c3d1c3d1c3d1c3d1c3d1c3d1c3d1c3d1c3d1c3d1c3d1c3d1c3d1c3d1c661d02168216a016af16be16ce16de16ed16fd170c171c172c173b174b175a176a177a178a17da17e917f81808181818281838184718561866187618861896179917a8"; + hex"608060405234801561000f575f80fd5b506004361061007a575f3560e01c80636f5aa28d116100585780636f5aa28d146100dd578063c6c0cbb61461010b578063ccf4477514610135578063d6d8c9a814610148575f80fd5b806301ffc9a71461007e578063336284d4146100a6578063570c7a63146100bb575b5f80fd5b61009161008c3660046123ce565b610150565b60405190151581526020015b60405180910390f35b6100ae6101d7565b60405161009d919061242a565b6100ce6100c9366004612450565b610bd4565b60405161009d939291906124fa565b6040517fe43208b51e17b3d887e8f3535d75526c0744eee6a200dac603462c6b3ca46511815260200161009d565b61011e610119366004612450565b610d18565b60408051921515835260208301919091520161009d565b60408051602081019091525f81526100ae565b6100ae610d50565b5f6001600160e01b031982166391ccb1d560e01b148061018057506001600160e01b03198216636f5aa28d60e01b145b8061019b57506001600160e01b03198216631a2c8edd60e01b145b806101b657506001600160e01b03198216630cd8a13560e21b145b806101d157506301ffc9a760e01b6001600160e01b03198316145b92915050565b60605f6101e66006600161256b565b6101f190600161256b565b6101fc90600161256b565b6001600160401b038111156102135761021361243c565b60405190808252806020026020018201604052801561024657816020015b60608152602001906001900390816102315790505b506040805160018082528183019092529192505f9190816020015b6123c48152602001906001900390816102615790505090506116ec815f8151811061028e5761028e61257e565b6001600160401b03929092166020928302919091019091015260408051600480825260a082019092525f91816020015b6123c48152602001906001900390816102be57905050905061170a815f815181106102eb576102eb61257e565b60200260200101906001600160401b031690816001600160401b031681525050611719816001815181106103215761032161257e565b60200260200101906001600160401b031690816001600160401b031681525050611728816002815181106103575761035761257e565b60200260200101906001600160401b031690816001600160401b0316815250506117388160038151811061038d5761038d61257e565b6001600160401b039290921660209283029190910190910152604080516002808252606082019092525f91816020015b6123c48152602001906001900390816103bd579050509050611748815f815181106103ea576103ea61257e565b60200260200101906001600160401b031690816001600160401b031681525050611757816001815181106104205761042061257e565b6001600160401b03929092166020928302919091019091015260408051600580825260c082019092525f91816020015b6123c4815260200190600190039081610450579050509050611767815f8151811061047d5761047d61257e565b60200260200101906001600160401b031690816001600160401b031681525050611776816001815181106104b3576104b361257e565b60200260200101906001600160401b031690816001600160401b031681525050611786816002815181106104e9576104e961257e565b60200260200101906001600160401b031690816001600160401b0316815250506117968160038151811061051f5761051f61257e565b60200260200101906001600160401b031690816001600160401b0316815250506117a5816004815181106105555761055561257e565b6001600160401b03929092166020928302919091019091015260408051600580825260c082019092525f91816020015b6123c48152602001906001900390816105855790505090506117b5815f815181106105b2576105b261257e565b60200260200101906001600160401b031690816001600160401b0316815250506117c4816001815181106105e8576105e861257e565b60200260200101906001600160401b031690816001600160401b0316815250506117d48160028151811061061e5761061e61257e565b60200260200101906001600160401b031690816001600160401b0316815250506117e4816003815181106106545761065461257e565b60200260200101906001600160401b031690816001600160401b0316815250506117f48160048151811061068a5761068a61257e565b6001600160401b0392909216602092830291909101909101526040805160018082528183019092525f91816020015b6123c48152602001906001900390816106b9579050509050611803815f815181106106e6576106e661257e565b6001600160401b0392909216602092830291909101909101526040805160018082528183019092525f91816020015b6123c481526020019060019003908161071557905050905061181c815f815181106107425761074261257e565b60200260200101906001600160401b031690816001600160401b03168152505086885f815181106107755761077561257e565b602002602001018190525085886001815181106107945761079461257e565b602002602001018190525084886002815181106107b3576107b361257e565b602002602001018190525083886003815181106107d2576107d261257e565b602002602001018190525082886004815181106107f1576107f161257e565b6020908102919091010152818861080a6006600161256b565b8151811061081a5761081a61257e565b602090810291909101015280886108336006600161256b565b61083e90600161256b565b8151811061084e5761084e61257e565b602090810291909101015260408051600680825260e082019092525f91816020015b6123c4815260200190600190039081610870579050509050611865815f8151811061089d5761089d61257e565b60200260200101906001600160401b031690816001600160401b031681525050611874816001815181106108d3576108d361257e565b60200260200101906001600160401b031690816001600160401b031681525050611883816002815181106109095761090961257e565b60200260200101906001600160401b031690816001600160401b0316815250506118938160038151811061093f5761093f61257e565b60200260200101906001600160401b031690816001600160401b0316815250506118a3816004815181106109755761097561257e565b60200260200101906001600160401b031690816001600160401b0316815250506118b3816005815181106109ab576109ab61257e565b60200260200101906001600160401b031690816001600160401b03168152505080896005815181106109df576109df61257e565b602090810291909101015260408051600780825261010082019092525f91816020015b6123c4815260200190600190039081610a025790505090506118c3815f81518110610a2f57610a2f61257e565b60200260200101906001600160401b031690816001600160401b0316815250506118d281600181518110610a6557610a6561257e565b60200260200101906001600160401b031690816001600160401b0316815250506118e181600281518110610a9b57610a9b61257e565b60200260200101906001600160401b031690816001600160401b0316815250506118f181600381518110610ad157610ad161257e565b60200260200101906001600160401b031690816001600160401b03168152505061190181600481518110610b0757610b0761257e565b60200260200101906001600160401b031690816001600160401b03168152505061191181600581518110610b3d57610b3d61257e565b60200260200101906001600160401b031690816001600160401b03168152505061192181600681518110610b7357610b7361257e565b60200260200101906001600160401b031690816001600160401b031681525050808a600681518110610ba757610ba761257e565b602090810291909101015289610bc4610bbf82611931565b611946565b9b50505050505050505050505090565b5f6060805f805f610bf487610be76119d5565b610bef6119f5565b611a15565b9250925092505f610c0a82610220015160200190565b90505f8261022001515182610c1f919061256b565b90505f610c3d83836f07fffffe0000000003ff200000000000611b06565b80925081945050505f80610c5686610240015184611ba2565b915091508115610ceb575f610c6b8783611c79565b90506123c45f610c79611ca8565b90505f60028251610c8a91906125a6565b9050808510610cbb576040516303bdd1b160e51b815260048101869052602481018290526044015b60405180910390fd5b6001850160020282015161ffff169250610cd48c8c8686565b9e509e509e50505050505050505050505050610d11565b5050604080515f80825281830190925260208101828152919a5090985096505050505050505b9193909250565b5f805f805f610d40866002810151815160228084019461ffff93909316840101920160200190565b505f988998509650505050505050565b60605f610d5f6006600161256b565b610d6a90600161256b565b610d7590600161256b565b6001600160401b03811115610d8c57610d8c61243c565b604051908082528060200260200182016040528015610dbf57816020015b6060815260200190600190039081610daa5790505b506040805160018082528183019092529192505f9190816020015b6123c4815260200190600190039081610dda579050509050611cc8815f81518110610e0757610e0761257e565b6001600160401b03929092166020928302919091019091015260408051600480825260a082019092525f91816020015b6123c4815260200190600190039081610e37579050509050611cc8815f81518110610e6457610e6461257e565b60200260200101906001600160401b031690816001600160401b031681525050611cc881600181518110610e9a57610e9a61257e565b60200260200101906001600160401b031690816001600160401b031681525050611cc881600281518110610ed057610ed061257e565b60200260200101906001600160401b031690816001600160401b031681525050611cc881600381518110610f0657610f0661257e565b6001600160401b039290921660209283029190910190910152604080516002808252606082019092525f91816020015b6123c4815260200190600190039081610f36579050509050611cc8815f81518110610f6357610f6361257e565b60200260200101906001600160401b031690816001600160401b031681525050611cc881600181518110610f9957610f9961257e565b6001600160401b03929092166020928302919091019091015260408051600580825260c082019092525f91816020015b6123c4815260200190600190039081610fc9579050509050611cc8815f81518110610ff657610ff661257e565b60200260200101906001600160401b031690816001600160401b031681525050611cc88160018151811061102c5761102c61257e565b60200260200101906001600160401b031690816001600160401b031681525050611cc8816002815181106110625761106261257e565b60200260200101906001600160401b031690816001600160401b031681525050611cc8816003815181106110985761109861257e565b60200260200101906001600160401b031690816001600160401b031681525050611cc8816004815181106110ce576110ce61257e565b6001600160401b03929092166020928302919091019091015260408051600580825260c082019092525f91816020015b6123c48152602001906001900390816110fe579050509050611cc8815f8151811061112b5761112b61257e565b60200260200101906001600160401b031690816001600160401b031681525050611cc8816001815181106111615761116161257e565b60200260200101906001600160401b031690816001600160401b031681525050611cc8816002815181106111975761119761257e565b60200260200101906001600160401b031690816001600160401b031681525050611cc8816003815181106111cd576111cd61257e565b60200260200101906001600160401b031690816001600160401b031681525050611cc8816004815181106112035761120361257e565b6001600160401b0392909216602092830291909101909101526040805160018082528183019092525f91816020015b6123c4815260200190600190039081611232579050509050611cf1815f8151811061125f5761125f61257e565b6001600160401b0392909216602092830291909101909101526040805160018082528183019092525f91816020015b6123c481526020019060019003908161128e579050509050611d8d815f815181106112bb576112bb61257e565b60200260200101906001600160401b031690816001600160401b03168152505086885f815181106112ee576112ee61257e565b6020026020010181905250858860018151811061130d5761130d61257e565b6020026020010181905250848860028151811061132c5761132c61257e565b6020026020010181905250838860038151811061134b5761134b61257e565b6020026020010181905250828860048151811061136a5761136a61257e565b602090810291909101015281886113836006600161256b565b815181106113935761139361257e565b602090810291909101015280886113ac6006600161256b565b6113b790600161256b565b815181106113c7576113c761257e565b602090810291909101015260408051600680825260e082019092525f91816020015b6123c48152602001906001900390816113e9579050509050611cc8815f815181106114165761141661257e565b60200260200101906001600160401b031690816001600160401b031681525050611cc88160018151811061144c5761144c61257e565b60200260200101906001600160401b031690816001600160401b031681525050611cc8816002815181106114825761148261257e565b60200260200101906001600160401b031690816001600160401b031681525050611cc8816003815181106114b8576114b861257e565b60200260200101906001600160401b031690816001600160401b031681525050611cc8816004815181106114ee576114ee61257e565b60200260200101906001600160401b031690816001600160401b031681525050611cc8816005815181106115245761152461257e565b60200260200101906001600160401b031690816001600160401b03168152505080896005815181106115585761155861257e565b602090810291909101015260408051600780825261010082019092525f91816020015b6123c481526020019060019003908161157b579050509050611cc8815f815181106115a8576115a861257e565b60200260200101906001600160401b031690816001600160401b031681525050611cc8816001815181106115de576115de61257e565b60200260200101906001600160401b031690816001600160401b031681525050611cc8816002815181106116145761161461257e565b60200260200101906001600160401b031690816001600160401b031681525050611cc88160038151811061164a5761164a61257e565b60200260200101906001600160401b031690816001600160401b031681525050611cc8816004815181106116805761168061257e565b60200260200101906001600160401b031690816001600160401b031681525050611cc8816005815181106116b6576116b661257e565b60200260200101906001600160401b031690816001600160401b031681525050611cc881600681518110610b7357610b7361257e565b5f6060806116fb5f6001611e45565b92509250925093509350939050565b5f6060806116fb60015f611e45565b5f6060806116fb600180611e45565b5f6060806116fb60016002611e45565b5f6060806116fb60016003611e45565b5f6060806116fb60025f611e45565b5f6060806116fb60026001611e45565b5f6060806116fb60035f611e45565b5f6060806116fb60036001611e45565b5f6060806116fb60036002611e45565b5f6060806116fb600380611e45565b5f6060806116fb60036004611e45565b5f6060806116fb60045f611e45565b5f6060806116fb60046001611e45565b5f6060806116fb60046002611e45565b5f6060806116fb60046003611e45565b5f6060806116fb600480611e45565b5f6060806116fb6118166006600161256b565b85611e45565b5f60608060ff8416600885901c611854826118396006600161256b565b61184490600161256b565b61184e919061256b565b82611e45565b945094509450505093509350939050565b5f6060806116fb600580611e45565b5f6060806116fb60055f611e45565b5f6060806116fb60056001611e45565b5f6060806116fb60056002611e45565b5f6060806116fb60056003611e45565b5f6060806116fb60056004611e45565b5f6060806116fb600680611e45565b5f6060806116fb60065f611e45565b5f6060806116fb60066001611e45565b5f6060806116fb60066002611e45565b5f6060806116fb60066003611e45565b5f6060806116fb60066004611e45565b5f6060806116fb60066005611e45565b6060815f61193e82611ec7565b949350505050565b60605f82516002026001600160401b038111156119655761196561243c565b6040519080825280601f01601f19166020018201604052801561198f576020820181803683370190505b50905061ffff80196020850160208651028101600285015b818310156119c9578051835186169085161781526020909201916002016119a7565b50939695505050505050565b60606040518060e0016040528060a2815260200161267160a29139905090565b606060405180606001604052806040815260200161263160409139905090565b5f80611aa46040518061026001604052805f81526020015f81526020015f81526020015f81526020015f81526020015f81526020015f80191681526020015f81526020015f81526020015f81526020015f81526020015f81526020015f80191681526020016060815260200160608152602001606081526020015f815260200160608152602001606081525090565b606061ffff600288015116935060ff600388015116925061ffff600588015116600588019750808852602081018801915050611af087878760405180602001604052805f815250611f35565b915080826101e001819052505093509350939050565b5f808060018187870360208111611b1d5780611b20565b60205b915050875192505b8519600184841a1b16158183101615611b4657600182019150611b28565b9681019660208290036008810293841c90931b92611b915760408051602081018590520160408051601f198184030181529082905263e47fe8b760e01b8252610cb29160040161242a565b50869350909150505b935093915050565b600182810180515f928392600560ff93909316602102870192830192909101835b81831015611c675760018301516021909301805190935f90819060ff168180611bec838e6120e6565b915091508186165f03611c0e575f809b509b5050505050505050505050611c72565b5f87611c1e600185038916612111565b016004028b015195505062ffffff9081169350841683039150611c529050575060019750601c1a9550611c72945050505050565b611c5b83612111565b84019350505050611bc3565b5f8095509550505050505b9250929050565b6101c08201516002828102820101516101e08401515f9261ffff9092169190611c9f9083565b95945050505050565b60606040518060600160405280604081526020016125f160409139905090565b5f81515f14611cea576040516304f8b58160e51b815260040160405180910390fd5b505f919050565b5f8151600103611d4e575060208101516001600160e01b038116601b0b60e082901d5f611d1f8383836121ca565b905061ffff811115611d4457604051631e4e01d760e21b815260040160405180910390fd5b9250611d88915050565b81515f03611d6f57604051630f16066b60e41b815260040160405180910390fd5b604051630358cd2160e31b815260040160405180910390fd5b919050565b5f8151600203611e2257602082015160408301516001600160e01b038216601b0b60e083901d5f611dbf8383836121ca565b6001600160e01b038516601b0b935060e085901d925090505f611de38484836121ca565b905060ff821180611df4575060ff81115b15611e1257604051631e4e01d760e21b815260040160405180910390fd5b60081b179450611d889350505050565b600282511015611d6f57604051630f16066b60e41b815260040160405180910390fd5b5f60608060ff851180611e58575060ff84115b15611e8057604051639b0f326160e01b81526004810186905260248101859052604401610cb2565b6040805160248101909152600386602383015385602283015360106021830153806020830153506004815260408051602081019091525f8152600197919650945092505050565b60605f611ed38361220c565b90505f611ee18260206125c5565b9050606060405190508160200181016040528281526020850160208651028101602083015b81831015611f2957602083515102806020855101835e6020939093019201611f06565b50919695505050505050565b611fc26040518061026001604052805f81526020015f81526020015f81526020015f81526020015f81526020015f81526020015f80191681526020015f81526020015f81526020015f81526020015f81526020015f81526020015f80191681526020016060815260200160608152602001606081526020015f815260200160608152602001606081525090565b5f6040518061026001604052805f81526020015f81526020015f81526020015f81526020015f81526020015f81526020015f801b81526020015f8152602001600481526020015f81526020015f81526020015f81526020015f801b815260200184815260200185815260200160046001600160401b038111156120475761204761243c565b604051908082528060200260200182016040528015612070578160200160208202803683370190505b5081525f602080830182905260408084018b905260609384018a90528051601f01601f19168281528083018252835161ffff191681178452855290840182905283018190529082018190526080820181905260a08201819052610120820181905261014082018190526102008201529050611c9f565b5f80825f528360205360215f2090506001815f1a1b915062ffffff8116611c72575060019250929050565b5f5f1982036121235750610100919050565b507f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f7f5555555555555555555555555555555555555555555555555555555555555555600183901c16909103600281901c7f3333333333333333333333333333333333333333333333333333333333333333908116911601600481901c01167f01010101010101010101010101010101010101010101010101010101010101010260f81c90565b5f805f6121d8868686612255565b91509150806122035760405162bc8ecf60e31b81526004810187905260248101869052604401610cb2565b50949350505050565b5f60208201602083510281015b8082101561224e57815151928301928084101561224257634e487b715f5260116020526024601cfd5b50602082019150612219565b5050919050565b5f805f85121561228257604051634a7d166b60e01b81526004810186905260248101859052604401610cb2565b845f0361229457505f90506001611b9a565b8460ff84168501858112156122cf5760405163c849483b60e01b8152600481018890526024810187905260ff86166044820152606401610cb2565b5f805f83121561231b57604c198312156122f2575f809550955050505050611b9a565b825f03600a0a915081848161230957612309612592565b0495505084029091149150611b9a9050565b5f8313156123b457604d8313156123585760405163c849483b60e01b8152600481018a90526024810189905260ff88166044820152606401610cb2565b82600a0a9150815f198161236e5761236e612592565b048411156123a25760405163c849483b60e01b8152600481018a90526024810189905260ff88166044820152606401610cb2565b5091909102925060019150611b9a9050565b8360019550955050505050611b9a565b6123cc6125dc565b565b5f602082840312156123de575f80fd5b81356001600160e01b0319811681146123f5575f80fd5b9392505050565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f6123f560208301846123fc565b634e487b7160e01b5f52604160045260245ffd5b5f60208284031215612460575f80fd5b81356001600160401b0380821115612476575f80fd5b818401915084601f830112612489575f80fd5b81358181111561249b5761249b61243c565b604051601f8201601f19908116603f011681019083821181831017156124c3576124c361243c565b816040528281528760208487010111156124db575f80fd5b826020860160208301375f928101602001929092525095945050505050565b83151581525f60206060602084015261251660608401866123fc565b8381036040850152845180825260208087019201905f5b818110156125495783518352928401929184019160010161252d565b509098975050505050505050565b634e487b7160e01b5f52601160045260245ffd5b808201808211156101d1576101d1612557565b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52601260045260245ffd5b5f826125c057634e487b7160e01b5f52601260045260245ffd5b500490565b80820281158282048414176101d1576101d1612557565b634e487b7160e01b5f52605160045260245ffdfe16ec170a17191728173817481757176717761786179617a517b517c417d417e417f4186518741883189318a318b318c318d218e118f11901191119211803181c1cc81cc81cc81cc81cc81cc81cc81cc81cc81cc81cc81cc81cc81cc81cc81cc81cc81cc81cc81cc81cc81cc81cc81cc81cc81cc81cc81cc81cc81cc81cf11d8d0101180010800082000100010480300038412a001810000010020004200004002038028ff54904cc66c61df3dcab0616592209895f0b14fec9301902e0920c5bfe561b21609200e959460b1974270f844db208bcd3bf1c9893761e1049db11b93430180ae9a00af82a7805c138f40d28083f0742ef2103d561fd1215a13315716a6117d260cc107b9bfc0eec7ade13cba2891a6b14a51f792bdb01e0f14716565589"; /// @dev What MUST already be on a network before this release can be /// broadcast there: an address, and the runtime code that belongs at it. diff --git a/src/generated/candidate/RouteProcessorRaindexV6ArbOrderTaker.sol b/src/generated/candidate/RouteProcessorRaindexV6ArbOrderTaker.sol index f29d3cb348..7156083249 100644 --- a/src/generated/candidate/RouteProcessorRaindexV6ArbOrderTaker.sol +++ b/src/generated/candidate/RouteProcessorRaindexV6ArbOrderTaker.sol @@ -5,23 +5,23 @@ pragma solidity ^0.8.25; // THIS FILE IS AUTOGENERATED BY THE BUILD SCRIPT. DO NOT EDIT BY HAND. /// @dev Hash of the known bytecode. -bytes32 constant BYTECODE_HASH = bytes32(0x67f26347476927b6421ea3d607576378e8dfeef95e97dc55d2b2f26a651e549b); +bytes32 constant BYTECODE_HASH = bytes32(0xfa694e394514244f6ad90309223345fbeaf51aaeb868a670abae9c493760bf53); /// @dev The deterministic deploy address of the contract when deployed via /// the Zoltu factory. -address constant DEPLOYED_ADDRESS = address(0xDdA34c91B801e60C434339551b1528f24324B2e7); +address constant DEPLOYED_ADDRESS = address(0x30F422d0d7a43694814F7E825b507A4ED1B66732); /// @dev The creation bytecode of the contract. bytes constant CREATION_CODE = - hex"6080604052348015600e575f80fd5b5060017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055612585806100405f395ff3fe608060405260043610610034575f3560e01c806301ffc9a71461003d578063691f9ed714610070578063b17c83c11461008f57005b3661003b57005b005b348015610048575f80fd5b5061005c61005736600461180e565b6100a2565b604051901515815260200160405180910390f35b34801561007b575f80fd5b5061003b61008a366004611849565b6100f3565b61003b61009d3660046118eb565b61020e565b5f6001600160e01b0319821663691f9ed760e01b14806100d257506001600160e01b0319821663b17c83c160e01b145b806100ed57506301ffc9a760e01b6001600160e01b03198316145b92915050565b6101018686868686866104d0565b736e2d0e71d900474b262e545bc4c98b71ab368d2161012b6001600160a01b038816825f1961053d565b5f61013883850185611a66565b90505f61014d876101488b6105b7565b61063b565b5090505f8061015f886101488c6105b7565b9150915080610176578161017281611aac565b9250505b604051632646478b60e01b81526001600160a01b03861690632646478b906101ac908e9087908f90889030908c90600401611af2565b6020604051808303815f875af11580156101c8573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906101ec9190611b3d565b506102016001600160a01b038c16865f61053d565b5050505050505050505050565b610216610668565b61022561022282611cc0565b50565b6102326080830183611d7c565b90505f0361025357604051639c95219f60e01b815260040160405180910390fd5b6001600160a01b03831673522a6b8d2cd1e44d53475516fd3c55bc29a0e865146102a05760405163516e822d60e01b81526001600160a01b03841660048201526024015b60405180910390fd5b5f6102ae6080840184611d7c565b5f8181106102be576102be611dc2565b90506020028101906102d09190611dd6565b6102da9080611df4565b6102e8906040810190611e08565b6102f56080860186611d7c565b5f81811061030557610305611dc2565b90506020028101906103179190611dd6565b6020013581811061032a5761032a611dc2565b6103409260206040909202019081019150611e4e565b90505f6103506080850185611d7c565b5f81811061036057610360611dc2565b90506020028101906103729190611dd6565b61037c9080611df4565b61038a906060810190611e08565b6103976080870187611d7c565b5f8181106103a7576103a7611dc2565b90506020028101906103b99190611dd6565b604001358181106103cc576103cc611dc2565b6103e29260206040909202019081019150611e4e565b90506103f96001600160a01b038316865f1961053d565b6040516334e3942b60e11b81526001600160a01b038616906369c72856906104259087906004016120b2565b60408051808303815f875af1158015610440573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061046491906122b2565b5061047b90506001600160a01b038316865f61053d565b6104a061048784611cc0565b83610491856105b7565b8461049b866105b7565b610696565b50506104cb60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b505050565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0054600214801561051557503373522a6b8d2cd1e44d53475516fd3c55bc29a0e86514155b156105355760405163f6688adf60e01b8152336004820152602401610297565b505050505050565b6105498383835f6108e7565b6104cb5761055a83835f60016108e7565b61058257604051635274afe760e01b81526001600160a01b0384166004820152602401610297565b61058f83838360016108e7565b6104cb57604051635274afe760e01b81526001600160a01b0384166004820152602401610297565b5f6105c0610949565b6040516354636d2b60e01b81526001600160a01b038316600482015273200e12d10bb0c5e4a17e7018f0f1161919bb9389906354636d2b906024016020604051808303815f875af1158015610617573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906100ed91906122d4565b5f806001600160e01b038416601b0b60e085901d61065a8282876109d6565b9350935050505b9250929050565b610670610b48565b60027f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b604080516003808252608082019092525f9160208201606080368337019050506040516370a0823160e01b81523060048201529091505f906001600160a01b038716906370a0823190602401602060405180830381865afa1580156106fd573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107219190611b3d565b9050801561073d5761073d6001600160a01b0387163383610b8a565b5f6107488287610b97565b50905080835f8151811061075e5761075e611dc2565b602090810291909101015250506040516370a0823160e01b81523060048201525f906001600160a01b038516906370a0823190602401602060405180830381865afa1580156107af573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107d39190611b3d565b905080156107ef576107ef6001600160a01b0385163383610b8a565b5f6107fa8285610b97565b509050808360018151811061081157610811611dc2565b6020908102919091010152504790508015610830576108303382610bd7565b5f61083c826012610b97565b509050808360028151811061085357610853611dc2565b602090810291909101015250506040805160018082528183019092525f91816020015b6040805160a0810182525f918101828152606080830193909352608082018390528152602081019190915281526020019060019003908161087657905050905086815f815181106108c9576108c9611dc2565b60200260200101819052506108de8282610c4e565b50505050505050565b60405163095ea7b360e01b5f8181526001600160a01b038616600452602485905291602083604481808b5af1925060015f5114831661093d578383151615610931573d5f823e3d81fd5b5f873b113d1516831692505b60405250949350505050565b73200e12d10bb0c5e4a17e7018f0f1161919bb93893b15806109a0575073200e12d10bb0c5e4a17e7018f0f1161919bb93893f7f1de7d717526cba131d684e312dedbf0852adef9cced9e36798ae4937f7145d4114155b156109d4576040516373e6d7b360e01b815273200e12d10bb0c5e4a17e7018f0f1161919bb93896004820152602401610297565b565b5f805f851215610a0357604051634a7d166b60e01b81526004810186905260248101859052604401610297565b845f03610a1557505f90506001610b40565b8460ff8416850185811215610a505760405163c849483b60e01b8152600481018890526024810187905260ff86166044820152606401610297565b5f805f831215610a9c57604c19831215610a73575f809550955050505050610b40565b825f03600a0a9150818481610a8a57610a8a6122f4565b0495505084029091149150610b409050565b5f831315610b3557604d831315610ad95760405163c849483b60e01b8152600481018a90526024810189905260ff88166044820152606401610297565b82600a0a9150815f1981610aef57610aef6122f4565b04841115610b235760405163c849483b60e01b8152600481018a90526024810189905260ff88166044820152606401610297565b5091909102925060019150610b409050565b509193506001925050505b935093915050565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00546002036109d457604051633ee5aeb560e01b815260040160405180910390fd5b61058f8383836001610c63565b5f805f805f610ba68787610cad565b9250925092505f80610bb88585610d09565b9150915081838015610bc75750815b9650965050505050509250929050565b80471015610c015760405163cf47918160e01b815247600482015260248101829052604401610297565b610c1a828260405180602001604052805f815250610f52565b15610c23575050565b3d15610c3557610c31610f67565b5050565b60405163d6bda27560e01b815260040160405180910390fd5b610c31610c5c600784610f72565b825f610fd4565b60405163a9059cbb60e01b5f8181526001600160a01b038616600452602485905291602083604481808b5af1925060015f5114831661093d578383151615610931573d5f823e3d81fd5b5f808060ff841681037f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff861115610cf857600a860460018201600a88065f1493509350935050610d02565b8593509150600190505b9250925092565b5f808383601b82900b821480610e3f577d90e40fbeea1d3a4abc8955e946fe31cdcf66f634e1000000000000000000870515610d8a577f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee8000000000000000000870515610d7b576305f5e10087059650600886019550610d8a565b620186a0870596506005860195505b8687601b0b14610da557600a87059650856001019550610d8a565b7b0ccccccccccccccccccccccccccccccccccccccccccccccccccccccc7b1999999999999999999999999999999999999999999999999999999888820111610e39575f600188039050808160030b03610e375760e01b6001600160e01b037b7fffffffffffffffffffffffffffffffffffffffffffffffffffffff60ff8b901d18161795505f94506106619350505050565b505b50610e56565b865f03610e5657505f935060019250610661915050565b858660030b14610f0d575f821315610eb557610e728383611288565b15610e9a5760405163d556b11160e01b81526004810184905260248101839052604401610297565b637ffffffe19909501600a0a82029550637fffffff94610f0d565b637fffffff198690036043811315610ed757505f945084935061066192505050565b80600a0a8881610ee957610ee96122f4565b059750875f03610f0357505f945084935061066192505050565b50637fffffff1995505b818613610f1d5760019350610f36565b818603600a0a8381610f3157610f316122f4565b071593505b5050506001600160e01b03841660e084901b1791509250929050565b5f805f83516020850186885af1949350505050565b6040513d5f823e3d81fd5b60408051600780825261010082019092526060915f9190816020015b6060815260200190600190039081610f8e5790505090508281610fb2600187612308565b81518110610fc257610fc2611dc2565b60209081029190910101529392505050565b60408051600780825261010082019092525f91816020015b6060815260200190600190039081610fec5790505090505f5b845181101561104d5784818151811061102057611020611dc2565b602002602001015182828151811061103a5761103a611dc2565b6020908102919091010152600101611005565b50335f8181523060209081526040808320815160a0810183528083018581526060808301879052608083018190529082528185015282518581529384018581528484019093529093909291905b885181101561127c578881815181106110b5576110b5611dc2565b602002602001015193505f845f015160400151511115611274575f6110de8886602001516112aa565b90508861115157611133815f815181106110fa576110fa611dc2565b60200260200101515f8151811061111357611113611dc2565b602002602001015160408051600181526020810192909252818101905290565b815f8151811061114557611145611dc2565b60200260200101819052505b8451516040805160e08101825287516020908101516001600160a01b0390811683529082018a90528851830151828401525f606083018190526080830186905260a0830189905260c08301889052925163d04dfe2360e01b81529293169163d04dfe23916111c1916004016123a2565b5f60405180830381865afa1580156111db573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261120291908101906124a3565b9150505f815111156112715785516020015160405163012c676d60e21b81526001600160a01b03909116906304b19db490611243908b908590600401612559565b5f604051808303815f87803b15801561125a575f80fd5b505af115801561126c573d5f803e3d5ffd5b505050505b50505b60010161109a565b50505050505050505050565b5f6112a35f8412611299578361129d565b835f035b8361158c565b9392505050565b60605f825167ffffffffffffffff8111156112c7576112c7611969565b6040519080825280602002602001820160405280156112f0578160200160208202803683370190505b5090505f80845111611302575f611308565b83516001015b85516001010190505f8167ffffffffffffffff81111561132a5761132a611969565b60405190808252806020026020018201604052801561135d57816020015b60608152602001906001900390816113485790505b5090505f611381604080516002815233602082015230818301526060810190915290565b82828151811061139357611393611dc2565b60200260200101819052505f5b87518110156113f05781806001019250508781815181106113c3576113c3611dc2565b60200260200101518383815181106113dd576113dd611dc2565b60209081029190910101526001016113a0565b508551156115825780806001019150508382828151811061141357611413611dc2565b60200260200101819052505f5b8651811015611580576114cf87828151811061143e5761143e611dc2565b60200260200101515f01516114ac61147a8a858151811061146157611461611dc2565b6020026020010151602001518051602090810291012090565b7f19457468657265756d205369676e6564204d6573736167653a0a3332000000005f908152601c91909152603c902090565b8984815181106114be576114be611dc2565b60200260200101516040015161162a565b6114ef57604051630a57f30960e31b815260048101829052602401610297565b86818151811061150157611501611dc2565b60200260200101515f01516001600160a01b03165f1b85828151811061152957611529611dc2565b602002602001018181525050818060010192505086818151811061154f5761154f611dc2565b60200260200101516020015183838151811061156d5761156d611dc2565b6020908102919091010152600101611420565b505b5095945050505050565b5f637ffffff5821361159f57505f6100ed565b637ffffffe19820160438113156115ba5750508115156100ed565b5f81126115fa5780600a0a7b80000000000000000000000000000000000000000000000000000001816115ef576115ef6122f4565b0484119150506100ed565b805f03600a0a7b800000000000000000000000000000000000000000000000000000020284101591505092915050565b5f836001600160a01b03163b5f03611688575f80611648858561169b565b5090925090505f81600381111561166157611661612571565b14801561167f5750856001600160a01b0316826001600160a01b0316145b925050506112a3565b6116938484846116e1565b949350505050565b5f805f83516041036116d2576020840151604085015160608601515f1a6116c488828585611746565b955095509550505050610d02565b505081515f9150600290610d02565b805160408051630b135d3f60e11b8082526004820186905260248201929092525f92906020820185604483015e5f82606483010152601f820160051c60051b915060205f60648401838a5afa9050825f5114601f3d1116811693505050509392505050565b5f80807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a084111561177f57505f91506003905082611804565b604080515f808252602082018084528a905260ff891692820192909252606081018790526080810186905260019060a0016020604051602081039080840390855afa1580156117d0573d5f803e3d5ffd5b5050604051601f1901519150506001600160a01b0381166117fb57505f925060019150829050611804565b92505f91508190505b9450945094915050565b5f6020828403121561181e575f80fd5b81356001600160e01b0319811681146112a3575f80fd5b6001600160a01b0381168114610222575f80fd5b5f805f805f8060a0878903121561185e575f80fd5b863561186981611835565b9550602087013561187981611835565b94506040870135935060608701359250608087013567ffffffffffffffff808211156118a3575f80fd5b818901915089601f8301126118b6575f80fd5b8135818111156118c4575f80fd5b8a60208285010111156118d5575f80fd5b6020830194508093505050509295509295509295565b5f805f606084860312156118fd575f80fd5b833561190881611835565b9250602084013567ffffffffffffffff80821115611924575f80fd5b9085019060c08288031215611937575f80fd5b9092506040850135908082111561194c575f80fd5b5084016040818703121561195e575f80fd5b809150509250925092565b634e487b7160e01b5f52604160045260245ffd5b6040516060810167ffffffffffffffff811182821017156119a0576119a0611969565b60405290565b6040805190810167ffffffffffffffff811182821017156119a0576119a0611969565b604051601f8201601f1916810167ffffffffffffffff811182821017156119f2576119f2611969565b604052919050565b5f82601f830112611a09575f80fd5b813567ffffffffffffffff811115611a2357611a23611969565b611a36601f8201601f19166020016119c9565b818152846020838601011115611a4a575f80fd5b816020850160208301375f918101602001919091529392505050565b5f60208284031215611a76575f80fd5b813567ffffffffffffffff811115611a8c575f80fd5b611693848285016119fa565b634e487b7160e01b5f52601160045260245ffd5b5f60018201611abd57611abd611a98565b5060010190565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b5f6001600160a01b038089168352876020840152808716604084015285606084015280851660808401525060c060a0830152611b3160c0830184611ac4565b98975050505050505050565b5f60208284031215611b4d575f80fd5b5051919050565b5f67ffffffffffffffff821115611b6d57611b6d611969565b5060051b60200190565b5f82601f830112611b86575f80fd5b81356020611b9b611b9683611b54565b6119c9565b82815260059290921b84018101918181019086841115611bb9575f80fd5b8286015b84811015611cb557803567ffffffffffffffff80821115611bdc575f80fd5b908801906060828b03601f19011215611bf3575f80fd5b611bfb61197d565b86830135611c0881611835565b815260408381013583811115611c1c575f80fd5b8401603f81018d13611c2c575f80fd5b88810135611c3c611b9682611b54565b81815260059190911b82018301908a8101908f831115611c5a575f80fd5b928401925b82841015611c785783358252928b0192908b0190611c5f565b858c0152505050606084013583811115611c90575f80fd5b611c9e8d8a838801016119fa565b918301919091525085525050918301918301611bbd565b509695505050505050565b5f60408236031215611cd0575f80fd5b611cd86119a6565b823567ffffffffffffffff80821115611cef575f80fd5b818501915060608236031215611d03575f80fd5b611d0b61197d565b8235611d1681611835565b81526020830135611d2681611835565b6020820152604083013582811115611d3c575f80fd5b611d48368286016119fa565b60408301525083526020850135915080821115611d63575f80fd5b50611d7036828601611b77565b60208301525092915050565b5f808335601e19843603018112611d91575f80fd5b83018035915067ffffffffffffffff821115611dab575f80fd5b6020019150600581901b3603821315610661575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235607e19833603018112611dea575f80fd5b9190910192915050565b5f8235609e19833603018112611dea575f80fd5b5f808335601e19843603018112611e1d575f80fd5b83018035915067ffffffffffffffff821115611e37575f80fd5b6020019150600681901b3603821315610661575f80fd5b5f60208284031215611e5e575f80fd5b81356112a381611835565b5f808335601e19843603018112611e7e575f80fd5b830160208101925035905067ffffffffffffffff811115611e9d575f80fd5b8060051b3603821315610661575f80fd5b5f8235605e19833603018112611ec2575f80fd5b90910192915050565b5f808335601e19843603018112611ee0575f80fd5b830160208101925035905067ffffffffffffffff811115611eff575f80fd5b803603821315610661575f80fd5b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b5f808335601e19843603018112611f4a575f80fd5b830160208101925035905067ffffffffffffffff811115611f69575f80fd5b8060061b3603821315610661575f80fd5b8183525f60208085019450825f5b85811015611fc0578135611f9b81611835565b6001600160a01b03168752818301358388015260409687019690910190600101611f88565b509495945050505050565b8183526020808401935f91600585811b8301820185855b888110156120a457858303601f19018a52611ffd8289611eae565b6060813561200a81611835565b6001600160a01b0316855261202182880183611e69565b82898801528083880152608092507f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81111561205b575f80fd5b871b80828885013786019050604061207584820185611ecb565b945083888403018289015261208d8484018683611f0d565b9e8a019e9750505093870193505050600101611fe2565b509098975050505050505050565b5f602080835260e083018435828501526040828601358186015260608187013581870152808701358015158082146120e8575f80fd5b80608089015250506120fd6080880188611e69565b60c060a08901529384905261010093848801600582901b89018601835f5b84811015612279578b830360ff19018452813536879003607e19018112612140575f80fd5b8601803536829003609e19018112612156575f80fd5b608085528101803561216781611835565b6001600160a01b0380821660808801526121838e840184611eae565b915060a080880152813561219681611835565b8116610120880152818e01356121ab81611835565b166101408701526121be818c0182611ecb565b91508a6101608801526121d661018088018383611f0d565b9150506121e58b830183611f35565b607f19808985030160c08a01526121fd848385611f7a565b935061220b8d860186611f35565b93509150808985030160e08a015250612225838383611f7a565b9250505060808201358c8701528c8301358d8701528a8301358b87015261224e8a840184611e69565b935091508581038a870152612264818484611fcb565b968d019695505050918a01915060010161211b565b505061228860a08c018c611ecb565b8b8303601f190160c08d0152985096506122a3818989611f0d565b9b9a5050505050505050505050565b5f80604083850312156122c3575f80fd5b505080516020909101519092909150565b5f602082840312156122e4575f80fd5b815160ff811681146112a3575f80fd5b634e487b7160e01b5f52601260045260245ffd5b818103818111156100ed576100ed611a98565b5f815180845260208085019450602084015f5b83811015611fc05781518752958201959082019060010161232e565b5f8282518085526020808601955060208260051b840101602086015f5b8481101561239557601f1986840301895261238383835161231b565b98840198925090830190600101612367565b5090979650505050505050565b602081526001600160a01b038251166020820152602082015160408201525f604083015160e060608401526123db610100840182611ac4565b9050606084015160808401526080840151601f19808584030160a0860152612403838361234a565b925060a08601519150808584030160c0860152612420838361231b565b925060c08601519150808584030160e08601525061243e828261231b565b95945050505050565b5f82601f830112612456575f80fd5b81516020612466611b9683611b54565b8083825260208201915060208460051b870101935086841115612487575f80fd5b602086015b84811015611cb5578051835291830191830161248c565b5f80604083850312156124b4575f80fd5b825167ffffffffffffffff808211156124cb575f80fd5b818501915085601f8301126124de575f80fd5b815160206124ee611b9683611b54565b82815260059290921b8401810191818101908984111561250c575f80fd5b948201945b8386101561252a57855182529482019490820190612511565b91880151919650909350505080821115612542575f80fd5b5061254f85828601612447565b9150509250929050565b828152604060208201525f611693604083018461231b565b634e487b7160e01b5f52602160045260245ffd"; + hex"6080604052348015600e575f80fd5b5060017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00556124d5806100405f395ff3fe608060405260043610610034575f3560e01c806301ffc9a71461003d578063691f9ed714610070578063b17c83c11461008f57005b3661003b57005b005b348015610048575f80fd5b5061005c610057366004611779565b6100a2565b604051901515815260200160405180910390f35b34801561007b575f80fd5b5061003b61008a3660046117b4565b6100f3565b61003b61009d366004611856565b61020e565b5f6001600160e01b0319821663691f9ed760e01b14806100d257506001600160e01b0319821663b17c83c160e01b145b806100ed57506301ffc9a760e01b6001600160e01b03198316145b92915050565b6101018686868686866104d0565b736e2d0e71d900474b262e545bc4c98b71ab368d2161012b6001600160a01b038816825f1961053d565b5f610138838501856119d1565b90505f61014d876101488b6105b7565b61063b565b5090505f8061015f886101488c6105b7565b9150915080610176578161017281611a03565b9250505b604051632646478b60e01b81526001600160a01b03861690632646478b906101ac908e9087908f90889030908c90600401611a55565b6020604051808303815f875af11580156101c8573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906101ec9190611aa0565b506102016001600160a01b038c16865f61053d565b5050505050505050505050565b610216610668565b61022561022282611c23565b50565b6102326080830183611cdf565b90505f0361025357604051639c95219f60e01b815260040160405180910390fd5b6001600160a01b0383167350ad4ff129155d8f584deda447b11b4f5138840d146102a05760405163516e822d60e01b81526001600160a01b03841660048201526024015b60405180910390fd5b5f6102ae6080840184611cdf565b5f8181106102be576102be611d25565b90506020028101906102d09190611d39565b6102da9080611d57565b6102e8906040810190611d6b565b6102f56080860186611cdf565b5f81811061030557610305611d25565b90506020028101906103179190611d39565b6020013581811061032a5761032a611d25565b6103409260206040909202019081019150611db1565b90505f6103506080850185611cdf565b5f81811061036057610360611d25565b90506020028101906103729190611d39565b61037c9080611d57565b61038a906060810190611d6b565b6103976080870187611cdf565b5f8181106103a7576103a7611d25565b90506020028101906103b99190611d39565b604001358181106103cc576103cc611d25565b6103e29260206040909202019081019150611db1565b90506103f96001600160a01b038316865f1961053d565b6040516334e3942b60e11b81526001600160a01b038616906369c7285690610425908790600401612015565b60408051808303815f875af1158015610440573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104649190612215565b5061047b90506001600160a01b038316865f61053d565b6104a061048784611c23565b83610491856105b7565b8461049b866105b7565b610696565b50506104cb60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b505050565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f005460021480156105155750337350ad4ff129155d8f584deda447b11b4f5138840d14155b156105355760405163f6688adf60e01b8152336004820152602401610297565b505050505050565b6105498383835f610935565b6104cb5761055a83835f6001610935565b61058257604051635274afe760e01b81526001600160a01b0384166004820152602401610297565b61058f8383836001610935565b6104cb57604051635274afe760e01b81526001600160a01b0384166004820152602401610297565b5f6105c0610997565b6040516354636d2b60e01b81526001600160a01b038316600482015273200e12d10bb0c5e4a17e7018f0f1161919bb9389906354636d2b906024016020604051808303815f875af1158015610617573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906100ed9190612237565b5f806001600160e01b038416601b0b60e085901d61065a828287610a24565b9350935050505b9250929050565b610670610b96565b60027f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b6040805160018082528183019092525f91816020015b60608152602001906001900390816106ac575050604080516003808252608082019092529192505f919060208201606080368337019050506040516370a0823160e01b81523060048201529091505f906001600160a01b038816906370a0823190602401602060405180830381865afa15801561072b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061074f9190611aa0565b9050801561076b5761076b6001600160a01b0388163383610bd8565b5f6107768288610be5565b50905080835f8151811061078c5761078c611d25565b602090810291909101015250506040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa1580156107dd573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108019190611aa0565b9050801561081d5761081d6001600160a01b0386163383610bd8565b5f6108288286610be5565b509050808360018151811061083f5761083f611d25565b602090810291909101015250479050801561085e5761085e3382610c25565b5f61086a826012610be5565b509050808360028151811061088157610881611d25565b602002602001018181525050505080825f815181106108a2576108a2611d25565b60209081029190910101526040805160018082528183019092525f91816020015b6040805160a0810182525f91810182815260608083019390935260808201839052815260208101919091528152602001906001900390816108c357905050905087815f8151811061091657610916611d25565b602002602001018190525061092b8382610c9c565b5050505050505050565b60405163095ea7b360e01b5f8181526001600160a01b038616600452602485905291602083604481808b5af1925060015f5114831661098b57838315161561097f573d5f823e3d81fd5b5f873b113d1516831692505b60405250949350505050565b73200e12d10bb0c5e4a17e7018f0f1161919bb93893b15806109ee575073200e12d10bb0c5e4a17e7018f0f1161919bb93893f7f1de7d717526cba131d684e312dedbf0852adef9cced9e36798ae4937f7145d4114155b15610a22576040516373e6d7b360e01b815273200e12d10bb0c5e4a17e7018f0f1161919bb93896004820152602401610297565b565b5f805f851215610a5157604051634a7d166b60e01b81526004810186905260248101859052604401610297565b845f03610a6357505f90506001610b8e565b8460ff8416850185811215610a9e5760405163c849483b60e01b8152600481018890526024810187905260ff86166044820152606401610297565b5f805f831215610aea57604c19831215610ac1575f809550955050505050610b8e565b825f03600a0a9150818481610ad857610ad8612257565b0495505084029091149150610b8e9050565b5f831315610b8357604d831315610b275760405163c849483b60e01b8152600481018a90526024810189905260ff88166044820152606401610297565b82600a0a9150815f1981610b3d57610b3d612257565b04841115610b715760405163c849483b60e01b8152600481018a90526024810189905260ff88166044820152606401610297565b5091909102925060019150610b8e9050565b509193506001925050505b935093915050565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0054600203610a2257604051633ee5aeb560e01b815260040160405180910390fd5b61058f8383836001610ee4565b5f805f805f610bf48787610f2e565b9250925092505f80610c068585610f8a565b9150915081838015610c155750815b9650965050505050509250929050565b80471015610c4f5760405163cf47918160e01b815247600482015260248101829052604401610297565b610c68828260405180602001604052805f8152506111d3565b15610c71575050565b3d15610c8357610c7f6111e8565b5050565b60405163d6bda27560e01b815260040160405180910390fd5b60408051600680825260e082019092525f91816020015b6060815260200190600190039081610cb35790505090505f5b8351811015610d1457838181518110610ce757610ce7611d25565b6020026020010151828281518110610d0157610d01611d25565b6020908102919091010152600101610ccc565b50335f8181523060209081526040808320815160a0810183528083018581526060808301879052608083018190529082528185015282518581529384018581528484019093529093909291905b8751811015610ed957878181518110610d7c57610d7c611d25565b602002602001015193505f845f015160400151511115610ed1575f845f01515f01516001600160a01b031663d04dfe236040518060e00160405280885f0151602001516001600160a01b03168152602001898152602001885f01516040015181526020015f8152602001610df48c8a602001516111f3565b8152602001878152602001868152506040518263ffffffff1660e01b8152600401610e1f91906122f2565b5f60405180830381865afa158015610e39573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610e6091908101906123f3565b9150505f81511115610ecf5784516020015160405163012c676d60e21b81526001600160a01b03909116906304b19db490610ea1908a9085906004016124a9565b5f604051808303815f87803b158015610eb8575f80fd5b505af1158015610eca573d5f803e3d5ffd5b505050505b505b600101610d61565b505050505050505050565b60405163a9059cbb60e01b5f8181526001600160a01b038616600452602485905291602083604481808b5af1925060015f5114831661098b57838315161561097f573d5f823e3d81fd5b5f808060ff841681037f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff861115610f7957600a860460018201600a88065f1493509350935050610f83565b8593509150600190505b9250925092565b5f808383601b82900b8214806110c0577d90e40fbeea1d3a4abc8955e946fe31cdcf66f634e100000000000000000087051561100b577f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee8000000000000000000870515610ffc576305f5e1008705965060088601955061100b565b620186a0870596506005860195505b8687601b0b1461102657600a8705965085600101955061100b565b7b0ccccccccccccccccccccccccccccccccccccccccccccccccccccccc7b19999999999999999999999999999999999999999999999999999998888201116110ba575f600188039050808160030b036110b85760e01b6001600160e01b037b7fffffffffffffffffffffffffffffffffffffffffffffffffffffff60ff8b901d18161795505f94506106619350505050565b505b506110d7565b865f036110d757505f935060019250610661915050565b858660030b1461118e575f821315611136576110f383836114d5565b1561111b5760405163d556b11160e01b81526004810184905260248101839052604401610297565b637ffffffe19909501600a0a82029550637fffffff9461118e565b637fffffff19869003604381131561115857505f945084935061066192505050565b80600a0a888161116a5761116a612257565b059750875f0361118457505f945084935061066192505050565b50637fffffff1995505b81861361119e57600193506111b7565b818603600a0a83816111b2576111b2612257565b071593505b5050506001600160e01b03841660e084901b1791509250929050565b5f805f83516020850186885af1949350505050565b6040513d5f823e3d81fd5b60605f825167ffffffffffffffff811115611210576112106118d4565b604051908082528060200260200182016040528015611239578160200160208202803683370190505b5090505f8084511161124b575f611251565b83516001015b85516001010190505f8167ffffffffffffffff811115611273576112736118d4565b6040519080825280602002602001820160405280156112a657816020015b60608152602001906001900390816112915790505b5090505f6112ca604080516002815233602082015230818301526060810190915290565b8282815181106112dc576112dc611d25565b60200260200101819052505f5b875181101561133957818060010192505087818151811061130c5761130c611d25565b602002602001015183838151811061132657611326611d25565b60209081029190910101526001016112e9565b508551156114cb5780806001019150508382828151811061135c5761135c611d25565b60200260200101819052505f5b86518110156114c95761141887828151811061138757611387611d25565b60200260200101515f01516113f56113c38a85815181106113aa576113aa611d25565b6020026020010151602001518051602090810291012090565b7f19457468657265756d205369676e6564204d6573736167653a0a3332000000005f908152601c91909152603c902090565b89848151811061140757611407611d25565b6020026020010151604001516114f7565b61143857604051630a57f30960e31b815260048101829052602401610297565b86818151811061144a5761144a611d25565b60200260200101515f01516001600160a01b03165f1b85828151811061147257611472611d25565b602002602001018181525050818060010192505086818151811061149857611498611d25565b6020026020010151602001518383815181106114b6576114b6611d25565b6020908102919091010152600101611369565b505b5095945050505050565b5f6114f05f84126114e657836114ea565b835f035b83611568565b9392505050565b5f836001600160a01b03163b5f03611555575f806115158585611606565b5090925090505f81600381111561152e5761152e6124c1565b14801561154c5750856001600160a01b0316826001600160a01b0316145b925050506114f0565b61156084848461164c565b949350505050565b5f637ffffff5821361157b57505f6100ed565b637ffffffe19820160438113156115965750508115156100ed565b5f81126115d65780600a0a7b80000000000000000000000000000000000000000000000000000001816115cb576115cb612257565b0484119150506100ed565b805f03600a0a7b800000000000000000000000000000000000000000000000000000020284101591505092915050565b5f805f835160410361163d576020840151604085015160608601515f1a61162f888285856116b1565b955095509550505050610f83565b505081515f9150600290610f83565b805160408051630b135d3f60e11b8082526004820186905260248201929092525f92906020820185604483015e5f82606483010152601f820160051c60051b915060205f60648401838a5afa9050825f5114601f3d1116811693505050509392505050565b5f80807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08411156116ea57505f9150600390508261176f565b604080515f808252602082018084528a905260ff891692820192909252606081018790526080810186905260019060a0016020604051602081039080840390855afa15801561173b573d5f803e3d5ffd5b5050604051601f1901519150506001600160a01b03811661176657505f92506001915082905061176f565b92505f91508190505b9450945094915050565b5f60208284031215611789575f80fd5b81356001600160e01b0319811681146114f0575f80fd5b6001600160a01b0381168114610222575f80fd5b5f805f805f8060a087890312156117c9575f80fd5b86356117d4816117a0565b955060208701356117e4816117a0565b94506040870135935060608701359250608087013567ffffffffffffffff8082111561180e575f80fd5b818901915089601f830112611821575f80fd5b81358181111561182f575f80fd5b8a6020828501011115611840575f80fd5b6020830194508093505050509295509295509295565b5f805f60608486031215611868575f80fd5b8335611873816117a0565b9250602084013567ffffffffffffffff8082111561188f575f80fd5b9085019060c082880312156118a2575f80fd5b909250604085013590808211156118b7575f80fd5b508401604081870312156118c9575f80fd5b809150509250925092565b634e487b7160e01b5f52604160045260245ffd5b6040516060810167ffffffffffffffff8111828210171561190b5761190b6118d4565b60405290565b6040805190810167ffffffffffffffff8111828210171561190b5761190b6118d4565b604051601f8201601f1916810167ffffffffffffffff8111828210171561195d5761195d6118d4565b604052919050565b5f82601f830112611974575f80fd5b813567ffffffffffffffff81111561198e5761198e6118d4565b6119a1601f8201601f1916602001611934565b8181528460208386010111156119b5575f80fd5b816020850160208301375f918101602001919091529392505050565b5f602082840312156119e1575f80fd5b813567ffffffffffffffff8111156119f7575f80fd5b61156084828501611965565b5f60018201611a2057634e487b7160e01b5f52601160045260245ffd5b5060010190565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b5f6001600160a01b038089168352876020840152808716604084015285606084015280851660808401525060c060a0830152611a9460c0830184611a27565b98975050505050505050565b5f60208284031215611ab0575f80fd5b5051919050565b5f67ffffffffffffffff821115611ad057611ad06118d4565b5060051b60200190565b5f82601f830112611ae9575f80fd5b81356020611afe611af983611ab7565b611934565b82815260059290921b84018101918181019086841115611b1c575f80fd5b8286015b84811015611c1857803567ffffffffffffffff80821115611b3f575f80fd5b908801906060828b03601f19011215611b56575f80fd5b611b5e6118e8565b86830135611b6b816117a0565b815260408381013583811115611b7f575f80fd5b8401603f81018d13611b8f575f80fd5b88810135611b9f611af982611ab7565b81815260059190911b82018301908a8101908f831115611bbd575f80fd5b928401925b82841015611bdb5783358252928b0192908b0190611bc2565b858c0152505050606084013583811115611bf3575f80fd5b611c018d8a83880101611965565b918301919091525085525050918301918301611b20565b509695505050505050565b5f60408236031215611c33575f80fd5b611c3b611911565b823567ffffffffffffffff80821115611c52575f80fd5b818501915060608236031215611c66575f80fd5b611c6e6118e8565b8235611c79816117a0565b81526020830135611c89816117a0565b6020820152604083013582811115611c9f575f80fd5b611cab36828601611965565b60408301525083526020850135915080821115611cc6575f80fd5b50611cd336828601611ada565b60208301525092915050565b5f808335601e19843603018112611cf4575f80fd5b83018035915067ffffffffffffffff821115611d0e575f80fd5b6020019150600581901b3603821315610661575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235607e19833603018112611d4d575f80fd5b9190910192915050565b5f8235609e19833603018112611d4d575f80fd5b5f808335601e19843603018112611d80575f80fd5b83018035915067ffffffffffffffff821115611d9a575f80fd5b6020019150600681901b3603821315610661575f80fd5b5f60208284031215611dc1575f80fd5b81356114f0816117a0565b5f808335601e19843603018112611de1575f80fd5b830160208101925035905067ffffffffffffffff811115611e00575f80fd5b8060051b3603821315610661575f80fd5b5f8235605e19833603018112611e25575f80fd5b90910192915050565b5f808335601e19843603018112611e43575f80fd5b830160208101925035905067ffffffffffffffff811115611e62575f80fd5b803603821315610661575f80fd5b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b5f808335601e19843603018112611ead575f80fd5b830160208101925035905067ffffffffffffffff811115611ecc575f80fd5b8060061b3603821315610661575f80fd5b8183525f60208085019450825f5b85811015611f23578135611efe816117a0565b6001600160a01b03168752818301358388015260409687019690910190600101611eeb565b509495945050505050565b8183526020808401935f91600585811b8301820185855b8881101561200757858303601f19018a52611f608289611e11565b60608135611f6d816117a0565b6001600160a01b03168552611f8482880183611dcc565b82898801528083880152608092507f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811115611fbe575f80fd5b871b808288850137860190506040611fd884820185611e2e565b9450838884030182890152611ff08484018683611e70565b9e8a019e9750505093870193505050600101611f45565b509098975050505050505050565b5f602080835260e0830184358285015260408286013581860152606081870135818701528087013580151580821461204b575f80fd5b80608089015250506120606080880188611dcc565b60c060a08901529384905261010093848801600582901b89018601835f5b848110156121dc578b830360ff19018452813536879003607e190181126120a3575f80fd5b8601803536829003609e190181126120b9575f80fd5b60808552810180356120ca816117a0565b6001600160a01b0380821660808801526120e68e840184611e11565b915060a08088015281356120f9816117a0565b8116610120880152818e013561210e816117a0565b16610140870152612121818c0182611e2e565b91508a61016088015261213961018088018383611e70565b9150506121488b830183611e98565b607f19808985030160c08a0152612160848385611edd565b935061216e8d860186611e98565b93509150808985030160e08a015250612188838383611edd565b9250505060808201358c8701528c8301358d8701528a8301358b8701526121b18a840184611dcc565b935091508581038a8701526121c7818484611f2e565b968d019695505050918a01915060010161207e565b50506121eb60a08c018c611e2e565b8b8303601f190160c08d015298509650612206818989611e70565b9b9a5050505050505050505050565b5f8060408385031215612226575f80fd5b505080516020909101519092909150565b5f60208284031215612247575f80fd5b815160ff811681146114f0575f80fd5b634e487b7160e01b5f52601260045260245ffd5b5f815180845260208085019450602084015f5b83811015611f235781518752958201959082019060010161227e565b5f8282518085526020808601955060208260051b840101602086015f5b848110156122e557601f198684030189526122d383835161226b565b988401989250908301906001016122b7565b5090979650505050505050565b602081526001600160a01b038251166020820152602082015160408201525f604083015160e0606084015261232b610100840182611a27565b9050606084015160808401526080840151601f19808584030160a0860152612353838361229a565b925060a08601519150808584030160c0860152612370838361226b565b925060c08601519150808584030160e08601525061238e828261226b565b95945050505050565b5f82601f8301126123a6575f80fd5b815160206123b6611af983611ab7565b8083825260208201915060208460051b8701019350868411156123d7575f80fd5b602086015b84811015611c1857805183529183019183016123dc565b5f8060408385031215612404575f80fd5b825167ffffffffffffffff8082111561241b575f80fd5b818501915085601f83011261242e575f80fd5b8151602061243e611af983611ab7565b82815260059290921b8401810191818101908984111561245c575f80fd5b948201945b8386101561247a57855182529482019490820190612461565b91880151919650909350505080821115612492575f80fd5b5061249f85828601612397565b9150509250929050565b828152604060208201525f611560604083018461226b565b634e487b7160e01b5f52602160045260245ffd"; /// @dev The runtime bytecode of the contract. bytes constant RUNTIME_CODE = - hex"608060405260043610610034575f3560e01c806301ffc9a71461003d578063691f9ed714610070578063b17c83c11461008f57005b3661003b57005b005b348015610048575f80fd5b5061005c61005736600461180e565b6100a2565b604051901515815260200160405180910390f35b34801561007b575f80fd5b5061003b61008a366004611849565b6100f3565b61003b61009d3660046118eb565b61020e565b5f6001600160e01b0319821663691f9ed760e01b14806100d257506001600160e01b0319821663b17c83c160e01b145b806100ed57506301ffc9a760e01b6001600160e01b03198316145b92915050565b6101018686868686866104d0565b736e2d0e71d900474b262e545bc4c98b71ab368d2161012b6001600160a01b038816825f1961053d565b5f61013883850185611a66565b90505f61014d876101488b6105b7565b61063b565b5090505f8061015f886101488c6105b7565b9150915080610176578161017281611aac565b9250505b604051632646478b60e01b81526001600160a01b03861690632646478b906101ac908e9087908f90889030908c90600401611af2565b6020604051808303815f875af11580156101c8573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906101ec9190611b3d565b506102016001600160a01b038c16865f61053d565b5050505050505050505050565b610216610668565b61022561022282611cc0565b50565b6102326080830183611d7c565b90505f0361025357604051639c95219f60e01b815260040160405180910390fd5b6001600160a01b03831673522a6b8d2cd1e44d53475516fd3c55bc29a0e865146102a05760405163516e822d60e01b81526001600160a01b03841660048201526024015b60405180910390fd5b5f6102ae6080840184611d7c565b5f8181106102be576102be611dc2565b90506020028101906102d09190611dd6565b6102da9080611df4565b6102e8906040810190611e08565b6102f56080860186611d7c565b5f81811061030557610305611dc2565b90506020028101906103179190611dd6565b6020013581811061032a5761032a611dc2565b6103409260206040909202019081019150611e4e565b90505f6103506080850185611d7c565b5f81811061036057610360611dc2565b90506020028101906103729190611dd6565b61037c9080611df4565b61038a906060810190611e08565b6103976080870187611d7c565b5f8181106103a7576103a7611dc2565b90506020028101906103b99190611dd6565b604001358181106103cc576103cc611dc2565b6103e29260206040909202019081019150611e4e565b90506103f96001600160a01b038316865f1961053d565b6040516334e3942b60e11b81526001600160a01b038616906369c72856906104259087906004016120b2565b60408051808303815f875af1158015610440573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061046491906122b2565b5061047b90506001600160a01b038316865f61053d565b6104a061048784611cc0565b83610491856105b7565b8461049b866105b7565b610696565b50506104cb60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b505050565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0054600214801561051557503373522a6b8d2cd1e44d53475516fd3c55bc29a0e86514155b156105355760405163f6688adf60e01b8152336004820152602401610297565b505050505050565b6105498383835f6108e7565b6104cb5761055a83835f60016108e7565b61058257604051635274afe760e01b81526001600160a01b0384166004820152602401610297565b61058f83838360016108e7565b6104cb57604051635274afe760e01b81526001600160a01b0384166004820152602401610297565b5f6105c0610949565b6040516354636d2b60e01b81526001600160a01b038316600482015273200e12d10bb0c5e4a17e7018f0f1161919bb9389906354636d2b906024016020604051808303815f875af1158015610617573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906100ed91906122d4565b5f806001600160e01b038416601b0b60e085901d61065a8282876109d6565b9350935050505b9250929050565b610670610b48565b60027f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b604080516003808252608082019092525f9160208201606080368337019050506040516370a0823160e01b81523060048201529091505f906001600160a01b038716906370a0823190602401602060405180830381865afa1580156106fd573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107219190611b3d565b9050801561073d5761073d6001600160a01b0387163383610b8a565b5f6107488287610b97565b50905080835f8151811061075e5761075e611dc2565b602090810291909101015250506040516370a0823160e01b81523060048201525f906001600160a01b038516906370a0823190602401602060405180830381865afa1580156107af573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107d39190611b3d565b905080156107ef576107ef6001600160a01b0385163383610b8a565b5f6107fa8285610b97565b509050808360018151811061081157610811611dc2565b6020908102919091010152504790508015610830576108303382610bd7565b5f61083c826012610b97565b509050808360028151811061085357610853611dc2565b602090810291909101015250506040805160018082528183019092525f91816020015b6040805160a0810182525f918101828152606080830193909352608082018390528152602081019190915281526020019060019003908161087657905050905086815f815181106108c9576108c9611dc2565b60200260200101819052506108de8282610c4e565b50505050505050565b60405163095ea7b360e01b5f8181526001600160a01b038616600452602485905291602083604481808b5af1925060015f5114831661093d578383151615610931573d5f823e3d81fd5b5f873b113d1516831692505b60405250949350505050565b73200e12d10bb0c5e4a17e7018f0f1161919bb93893b15806109a0575073200e12d10bb0c5e4a17e7018f0f1161919bb93893f7f1de7d717526cba131d684e312dedbf0852adef9cced9e36798ae4937f7145d4114155b156109d4576040516373e6d7b360e01b815273200e12d10bb0c5e4a17e7018f0f1161919bb93896004820152602401610297565b565b5f805f851215610a0357604051634a7d166b60e01b81526004810186905260248101859052604401610297565b845f03610a1557505f90506001610b40565b8460ff8416850185811215610a505760405163c849483b60e01b8152600481018890526024810187905260ff86166044820152606401610297565b5f805f831215610a9c57604c19831215610a73575f809550955050505050610b40565b825f03600a0a9150818481610a8a57610a8a6122f4565b0495505084029091149150610b409050565b5f831315610b3557604d831315610ad95760405163c849483b60e01b8152600481018a90526024810189905260ff88166044820152606401610297565b82600a0a9150815f1981610aef57610aef6122f4565b04841115610b235760405163c849483b60e01b8152600481018a90526024810189905260ff88166044820152606401610297565b5091909102925060019150610b409050565b509193506001925050505b935093915050565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00546002036109d457604051633ee5aeb560e01b815260040160405180910390fd5b61058f8383836001610c63565b5f805f805f610ba68787610cad565b9250925092505f80610bb88585610d09565b9150915081838015610bc75750815b9650965050505050509250929050565b80471015610c015760405163cf47918160e01b815247600482015260248101829052604401610297565b610c1a828260405180602001604052805f815250610f52565b15610c23575050565b3d15610c3557610c31610f67565b5050565b60405163d6bda27560e01b815260040160405180910390fd5b610c31610c5c600784610f72565b825f610fd4565b60405163a9059cbb60e01b5f8181526001600160a01b038616600452602485905291602083604481808b5af1925060015f5114831661093d578383151615610931573d5f823e3d81fd5b5f808060ff841681037f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff861115610cf857600a860460018201600a88065f1493509350935050610d02565b8593509150600190505b9250925092565b5f808383601b82900b821480610e3f577d90e40fbeea1d3a4abc8955e946fe31cdcf66f634e1000000000000000000870515610d8a577f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee8000000000000000000870515610d7b576305f5e10087059650600886019550610d8a565b620186a0870596506005860195505b8687601b0b14610da557600a87059650856001019550610d8a565b7b0ccccccccccccccccccccccccccccccccccccccccccccccccccccccc7b1999999999999999999999999999999999999999999999999999999888820111610e39575f600188039050808160030b03610e375760e01b6001600160e01b037b7fffffffffffffffffffffffffffffffffffffffffffffffffffffff60ff8b901d18161795505f94506106619350505050565b505b50610e56565b865f03610e5657505f935060019250610661915050565b858660030b14610f0d575f821315610eb557610e728383611288565b15610e9a5760405163d556b11160e01b81526004810184905260248101839052604401610297565b637ffffffe19909501600a0a82029550637fffffff94610f0d565b637fffffff198690036043811315610ed757505f945084935061066192505050565b80600a0a8881610ee957610ee96122f4565b059750875f03610f0357505f945084935061066192505050565b50637fffffff1995505b818613610f1d5760019350610f36565b818603600a0a8381610f3157610f316122f4565b071593505b5050506001600160e01b03841660e084901b1791509250929050565b5f805f83516020850186885af1949350505050565b6040513d5f823e3d81fd5b60408051600780825261010082019092526060915f9190816020015b6060815260200190600190039081610f8e5790505090508281610fb2600187612308565b81518110610fc257610fc2611dc2565b60209081029190910101529392505050565b60408051600780825261010082019092525f91816020015b6060815260200190600190039081610fec5790505090505f5b845181101561104d5784818151811061102057611020611dc2565b602002602001015182828151811061103a5761103a611dc2565b6020908102919091010152600101611005565b50335f8181523060209081526040808320815160a0810183528083018581526060808301879052608083018190529082528185015282518581529384018581528484019093529093909291905b885181101561127c578881815181106110b5576110b5611dc2565b602002602001015193505f845f015160400151511115611274575f6110de8886602001516112aa565b90508861115157611133815f815181106110fa576110fa611dc2565b60200260200101515f8151811061111357611113611dc2565b602002602001015160408051600181526020810192909252818101905290565b815f8151811061114557611145611dc2565b60200260200101819052505b8451516040805160e08101825287516020908101516001600160a01b0390811683529082018a90528851830151828401525f606083018190526080830186905260a0830189905260c08301889052925163d04dfe2360e01b81529293169163d04dfe23916111c1916004016123a2565b5f60405180830381865afa1580156111db573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261120291908101906124a3565b9150505f815111156112715785516020015160405163012c676d60e21b81526001600160a01b03909116906304b19db490611243908b908590600401612559565b5f604051808303815f87803b15801561125a575f80fd5b505af115801561126c573d5f803e3d5ffd5b505050505b50505b60010161109a565b50505050505050505050565b5f6112a35f8412611299578361129d565b835f035b8361158c565b9392505050565b60605f825167ffffffffffffffff8111156112c7576112c7611969565b6040519080825280602002602001820160405280156112f0578160200160208202803683370190505b5090505f80845111611302575f611308565b83516001015b85516001010190505f8167ffffffffffffffff81111561132a5761132a611969565b60405190808252806020026020018201604052801561135d57816020015b60608152602001906001900390816113485790505b5090505f611381604080516002815233602082015230818301526060810190915290565b82828151811061139357611393611dc2565b60200260200101819052505f5b87518110156113f05781806001019250508781815181106113c3576113c3611dc2565b60200260200101518383815181106113dd576113dd611dc2565b60209081029190910101526001016113a0565b508551156115825780806001019150508382828151811061141357611413611dc2565b60200260200101819052505f5b8651811015611580576114cf87828151811061143e5761143e611dc2565b60200260200101515f01516114ac61147a8a858151811061146157611461611dc2565b6020026020010151602001518051602090810291012090565b7f19457468657265756d205369676e6564204d6573736167653a0a3332000000005f908152601c91909152603c902090565b8984815181106114be576114be611dc2565b60200260200101516040015161162a565b6114ef57604051630a57f30960e31b815260048101829052602401610297565b86818151811061150157611501611dc2565b60200260200101515f01516001600160a01b03165f1b85828151811061152957611529611dc2565b602002602001018181525050818060010192505086818151811061154f5761154f611dc2565b60200260200101516020015183838151811061156d5761156d611dc2565b6020908102919091010152600101611420565b505b5095945050505050565b5f637ffffff5821361159f57505f6100ed565b637ffffffe19820160438113156115ba5750508115156100ed565b5f81126115fa5780600a0a7b80000000000000000000000000000000000000000000000000000001816115ef576115ef6122f4565b0484119150506100ed565b805f03600a0a7b800000000000000000000000000000000000000000000000000000020284101591505092915050565b5f836001600160a01b03163b5f03611688575f80611648858561169b565b5090925090505f81600381111561166157611661612571565b14801561167f5750856001600160a01b0316826001600160a01b0316145b925050506112a3565b6116938484846116e1565b949350505050565b5f805f83516041036116d2576020840151604085015160608601515f1a6116c488828585611746565b955095509550505050610d02565b505081515f9150600290610d02565b805160408051630b135d3f60e11b8082526004820186905260248201929092525f92906020820185604483015e5f82606483010152601f820160051c60051b915060205f60648401838a5afa9050825f5114601f3d1116811693505050509392505050565b5f80807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a084111561177f57505f91506003905082611804565b604080515f808252602082018084528a905260ff891692820192909252606081018790526080810186905260019060a0016020604051602081039080840390855afa1580156117d0573d5f803e3d5ffd5b5050604051601f1901519150506001600160a01b0381166117fb57505f925060019150829050611804565b92505f91508190505b9450945094915050565b5f6020828403121561181e575f80fd5b81356001600160e01b0319811681146112a3575f80fd5b6001600160a01b0381168114610222575f80fd5b5f805f805f8060a0878903121561185e575f80fd5b863561186981611835565b9550602087013561187981611835565b94506040870135935060608701359250608087013567ffffffffffffffff808211156118a3575f80fd5b818901915089601f8301126118b6575f80fd5b8135818111156118c4575f80fd5b8a60208285010111156118d5575f80fd5b6020830194508093505050509295509295509295565b5f805f606084860312156118fd575f80fd5b833561190881611835565b9250602084013567ffffffffffffffff80821115611924575f80fd5b9085019060c08288031215611937575f80fd5b9092506040850135908082111561194c575f80fd5b5084016040818703121561195e575f80fd5b809150509250925092565b634e487b7160e01b5f52604160045260245ffd5b6040516060810167ffffffffffffffff811182821017156119a0576119a0611969565b60405290565b6040805190810167ffffffffffffffff811182821017156119a0576119a0611969565b604051601f8201601f1916810167ffffffffffffffff811182821017156119f2576119f2611969565b604052919050565b5f82601f830112611a09575f80fd5b813567ffffffffffffffff811115611a2357611a23611969565b611a36601f8201601f19166020016119c9565b818152846020838601011115611a4a575f80fd5b816020850160208301375f918101602001919091529392505050565b5f60208284031215611a76575f80fd5b813567ffffffffffffffff811115611a8c575f80fd5b611693848285016119fa565b634e487b7160e01b5f52601160045260245ffd5b5f60018201611abd57611abd611a98565b5060010190565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b5f6001600160a01b038089168352876020840152808716604084015285606084015280851660808401525060c060a0830152611b3160c0830184611ac4565b98975050505050505050565b5f60208284031215611b4d575f80fd5b5051919050565b5f67ffffffffffffffff821115611b6d57611b6d611969565b5060051b60200190565b5f82601f830112611b86575f80fd5b81356020611b9b611b9683611b54565b6119c9565b82815260059290921b84018101918181019086841115611bb9575f80fd5b8286015b84811015611cb557803567ffffffffffffffff80821115611bdc575f80fd5b908801906060828b03601f19011215611bf3575f80fd5b611bfb61197d565b86830135611c0881611835565b815260408381013583811115611c1c575f80fd5b8401603f81018d13611c2c575f80fd5b88810135611c3c611b9682611b54565b81815260059190911b82018301908a8101908f831115611c5a575f80fd5b928401925b82841015611c785783358252928b0192908b0190611c5f565b858c0152505050606084013583811115611c90575f80fd5b611c9e8d8a838801016119fa565b918301919091525085525050918301918301611bbd565b509695505050505050565b5f60408236031215611cd0575f80fd5b611cd86119a6565b823567ffffffffffffffff80821115611cef575f80fd5b818501915060608236031215611d03575f80fd5b611d0b61197d565b8235611d1681611835565b81526020830135611d2681611835565b6020820152604083013582811115611d3c575f80fd5b611d48368286016119fa565b60408301525083526020850135915080821115611d63575f80fd5b50611d7036828601611b77565b60208301525092915050565b5f808335601e19843603018112611d91575f80fd5b83018035915067ffffffffffffffff821115611dab575f80fd5b6020019150600581901b3603821315610661575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235607e19833603018112611dea575f80fd5b9190910192915050565b5f8235609e19833603018112611dea575f80fd5b5f808335601e19843603018112611e1d575f80fd5b83018035915067ffffffffffffffff821115611e37575f80fd5b6020019150600681901b3603821315610661575f80fd5b5f60208284031215611e5e575f80fd5b81356112a381611835565b5f808335601e19843603018112611e7e575f80fd5b830160208101925035905067ffffffffffffffff811115611e9d575f80fd5b8060051b3603821315610661575f80fd5b5f8235605e19833603018112611ec2575f80fd5b90910192915050565b5f808335601e19843603018112611ee0575f80fd5b830160208101925035905067ffffffffffffffff811115611eff575f80fd5b803603821315610661575f80fd5b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b5f808335601e19843603018112611f4a575f80fd5b830160208101925035905067ffffffffffffffff811115611f69575f80fd5b8060061b3603821315610661575f80fd5b8183525f60208085019450825f5b85811015611fc0578135611f9b81611835565b6001600160a01b03168752818301358388015260409687019690910190600101611f88565b509495945050505050565b8183526020808401935f91600585811b8301820185855b888110156120a457858303601f19018a52611ffd8289611eae565b6060813561200a81611835565b6001600160a01b0316855261202182880183611e69565b82898801528083880152608092507f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81111561205b575f80fd5b871b80828885013786019050604061207584820185611ecb565b945083888403018289015261208d8484018683611f0d565b9e8a019e9750505093870193505050600101611fe2565b509098975050505050505050565b5f602080835260e083018435828501526040828601358186015260608187013581870152808701358015158082146120e8575f80fd5b80608089015250506120fd6080880188611e69565b60c060a08901529384905261010093848801600582901b89018601835f5b84811015612279578b830360ff19018452813536879003607e19018112612140575f80fd5b8601803536829003609e19018112612156575f80fd5b608085528101803561216781611835565b6001600160a01b0380821660808801526121838e840184611eae565b915060a080880152813561219681611835565b8116610120880152818e01356121ab81611835565b166101408701526121be818c0182611ecb565b91508a6101608801526121d661018088018383611f0d565b9150506121e58b830183611f35565b607f19808985030160c08a01526121fd848385611f7a565b935061220b8d860186611f35565b93509150808985030160e08a015250612225838383611f7a565b9250505060808201358c8701528c8301358d8701528a8301358b87015261224e8a840184611e69565b935091508581038a870152612264818484611fcb565b968d019695505050918a01915060010161211b565b505061228860a08c018c611ecb565b8b8303601f190160c08d0152985096506122a3818989611f0d565b9b9a5050505050505050505050565b5f80604083850312156122c3575f80fd5b505080516020909101519092909150565b5f602082840312156122e4575f80fd5b815160ff811681146112a3575f80fd5b634e487b7160e01b5f52601260045260245ffd5b818103818111156100ed576100ed611a98565b5f815180845260208085019450602084015f5b83811015611fc05781518752958201959082019060010161232e565b5f8282518085526020808601955060208260051b840101602086015f5b8481101561239557601f1986840301895261238383835161231b565b98840198925090830190600101612367565b5090979650505050505050565b602081526001600160a01b038251166020820152602082015160408201525f604083015160e060608401526123db610100840182611ac4565b9050606084015160808401526080840151601f19808584030160a0860152612403838361234a565b925060a08601519150808584030160c0860152612420838361231b565b925060c08601519150808584030160e08601525061243e828261231b565b95945050505050565b5f82601f830112612456575f80fd5b81516020612466611b9683611b54565b8083825260208201915060208460051b870101935086841115612487575f80fd5b602086015b84811015611cb5578051835291830191830161248c565b5f80604083850312156124b4575f80fd5b825167ffffffffffffffff808211156124cb575f80fd5b818501915085601f8301126124de575f80fd5b815160206124ee611b9683611b54565b82815260059290921b8401810191818101908984111561250c575f80fd5b948201945b8386101561252a57855182529482019490820190612511565b91880151919650909350505080821115612542575f80fd5b5061254f85828601612447565b9150509250929050565b828152604060208201525f611693604083018461231b565b634e487b7160e01b5f52602160045260245ffd"; + hex"608060405260043610610034575f3560e01c806301ffc9a71461003d578063691f9ed714610070578063b17c83c11461008f57005b3661003b57005b005b348015610048575f80fd5b5061005c610057366004611779565b6100a2565b604051901515815260200160405180910390f35b34801561007b575f80fd5b5061003b61008a3660046117b4565b6100f3565b61003b61009d366004611856565b61020e565b5f6001600160e01b0319821663691f9ed760e01b14806100d257506001600160e01b0319821663b17c83c160e01b145b806100ed57506301ffc9a760e01b6001600160e01b03198316145b92915050565b6101018686868686866104d0565b736e2d0e71d900474b262e545bc4c98b71ab368d2161012b6001600160a01b038816825f1961053d565b5f610138838501856119d1565b90505f61014d876101488b6105b7565b61063b565b5090505f8061015f886101488c6105b7565b9150915080610176578161017281611a03565b9250505b604051632646478b60e01b81526001600160a01b03861690632646478b906101ac908e9087908f90889030908c90600401611a55565b6020604051808303815f875af11580156101c8573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906101ec9190611aa0565b506102016001600160a01b038c16865f61053d565b5050505050505050505050565b610216610668565b61022561022282611c23565b50565b6102326080830183611cdf565b90505f0361025357604051639c95219f60e01b815260040160405180910390fd5b6001600160a01b0383167350ad4ff129155d8f584deda447b11b4f5138840d146102a05760405163516e822d60e01b81526001600160a01b03841660048201526024015b60405180910390fd5b5f6102ae6080840184611cdf565b5f8181106102be576102be611d25565b90506020028101906102d09190611d39565b6102da9080611d57565b6102e8906040810190611d6b565b6102f56080860186611cdf565b5f81811061030557610305611d25565b90506020028101906103179190611d39565b6020013581811061032a5761032a611d25565b6103409260206040909202019081019150611db1565b90505f6103506080850185611cdf565b5f81811061036057610360611d25565b90506020028101906103729190611d39565b61037c9080611d57565b61038a906060810190611d6b565b6103976080870187611cdf565b5f8181106103a7576103a7611d25565b90506020028101906103b99190611d39565b604001358181106103cc576103cc611d25565b6103e29260206040909202019081019150611db1565b90506103f96001600160a01b038316865f1961053d565b6040516334e3942b60e11b81526001600160a01b038616906369c7285690610425908790600401612015565b60408051808303815f875af1158015610440573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104649190612215565b5061047b90506001600160a01b038316865f61053d565b6104a061048784611c23565b83610491856105b7565b8461049b866105b7565b610696565b50506104cb60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b505050565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f005460021480156105155750337350ad4ff129155d8f584deda447b11b4f5138840d14155b156105355760405163f6688adf60e01b8152336004820152602401610297565b505050505050565b6105498383835f610935565b6104cb5761055a83835f6001610935565b61058257604051635274afe760e01b81526001600160a01b0384166004820152602401610297565b61058f8383836001610935565b6104cb57604051635274afe760e01b81526001600160a01b0384166004820152602401610297565b5f6105c0610997565b6040516354636d2b60e01b81526001600160a01b038316600482015273200e12d10bb0c5e4a17e7018f0f1161919bb9389906354636d2b906024016020604051808303815f875af1158015610617573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906100ed9190612237565b5f806001600160e01b038416601b0b60e085901d61065a828287610a24565b9350935050505b9250929050565b610670610b96565b60027f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b6040805160018082528183019092525f91816020015b60608152602001906001900390816106ac575050604080516003808252608082019092529192505f919060208201606080368337019050506040516370a0823160e01b81523060048201529091505f906001600160a01b038816906370a0823190602401602060405180830381865afa15801561072b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061074f9190611aa0565b9050801561076b5761076b6001600160a01b0388163383610bd8565b5f6107768288610be5565b50905080835f8151811061078c5761078c611d25565b602090810291909101015250506040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa1580156107dd573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108019190611aa0565b9050801561081d5761081d6001600160a01b0386163383610bd8565b5f6108288286610be5565b509050808360018151811061083f5761083f611d25565b602090810291909101015250479050801561085e5761085e3382610c25565b5f61086a826012610be5565b509050808360028151811061088157610881611d25565b602002602001018181525050505080825f815181106108a2576108a2611d25565b60209081029190910101526040805160018082528183019092525f91816020015b6040805160a0810182525f91810182815260608083019390935260808201839052815260208101919091528152602001906001900390816108c357905050905087815f8151811061091657610916611d25565b602002602001018190525061092b8382610c9c565b5050505050505050565b60405163095ea7b360e01b5f8181526001600160a01b038616600452602485905291602083604481808b5af1925060015f5114831661098b57838315161561097f573d5f823e3d81fd5b5f873b113d1516831692505b60405250949350505050565b73200e12d10bb0c5e4a17e7018f0f1161919bb93893b15806109ee575073200e12d10bb0c5e4a17e7018f0f1161919bb93893f7f1de7d717526cba131d684e312dedbf0852adef9cced9e36798ae4937f7145d4114155b15610a22576040516373e6d7b360e01b815273200e12d10bb0c5e4a17e7018f0f1161919bb93896004820152602401610297565b565b5f805f851215610a5157604051634a7d166b60e01b81526004810186905260248101859052604401610297565b845f03610a6357505f90506001610b8e565b8460ff8416850185811215610a9e5760405163c849483b60e01b8152600481018890526024810187905260ff86166044820152606401610297565b5f805f831215610aea57604c19831215610ac1575f809550955050505050610b8e565b825f03600a0a9150818481610ad857610ad8612257565b0495505084029091149150610b8e9050565b5f831315610b8357604d831315610b275760405163c849483b60e01b8152600481018a90526024810189905260ff88166044820152606401610297565b82600a0a9150815f1981610b3d57610b3d612257565b04841115610b715760405163c849483b60e01b8152600481018a90526024810189905260ff88166044820152606401610297565b5091909102925060019150610b8e9050565b509193506001925050505b935093915050565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0054600203610a2257604051633ee5aeb560e01b815260040160405180910390fd5b61058f8383836001610ee4565b5f805f805f610bf48787610f2e565b9250925092505f80610c068585610f8a565b9150915081838015610c155750815b9650965050505050509250929050565b80471015610c4f5760405163cf47918160e01b815247600482015260248101829052604401610297565b610c68828260405180602001604052805f8152506111d3565b15610c71575050565b3d15610c8357610c7f6111e8565b5050565b60405163d6bda27560e01b815260040160405180910390fd5b60408051600680825260e082019092525f91816020015b6060815260200190600190039081610cb35790505090505f5b8351811015610d1457838181518110610ce757610ce7611d25565b6020026020010151828281518110610d0157610d01611d25565b6020908102919091010152600101610ccc565b50335f8181523060209081526040808320815160a0810183528083018581526060808301879052608083018190529082528185015282518581529384018581528484019093529093909291905b8751811015610ed957878181518110610d7c57610d7c611d25565b602002602001015193505f845f015160400151511115610ed1575f845f01515f01516001600160a01b031663d04dfe236040518060e00160405280885f0151602001516001600160a01b03168152602001898152602001885f01516040015181526020015f8152602001610df48c8a602001516111f3565b8152602001878152602001868152506040518263ffffffff1660e01b8152600401610e1f91906122f2565b5f60405180830381865afa158015610e39573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610e6091908101906123f3565b9150505f81511115610ecf5784516020015160405163012c676d60e21b81526001600160a01b03909116906304b19db490610ea1908a9085906004016124a9565b5f604051808303815f87803b158015610eb8575f80fd5b505af1158015610eca573d5f803e3d5ffd5b505050505b505b600101610d61565b505050505050505050565b60405163a9059cbb60e01b5f8181526001600160a01b038616600452602485905291602083604481808b5af1925060015f5114831661098b57838315161561097f573d5f823e3d81fd5b5f808060ff841681037f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff861115610f7957600a860460018201600a88065f1493509350935050610f83565b8593509150600190505b9250925092565b5f808383601b82900b8214806110c0577d90e40fbeea1d3a4abc8955e946fe31cdcf66f634e100000000000000000087051561100b577f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee8000000000000000000870515610ffc576305f5e1008705965060088601955061100b565b620186a0870596506005860195505b8687601b0b1461102657600a8705965085600101955061100b565b7b0ccccccccccccccccccccccccccccccccccccccccccccccccccccccc7b19999999999999999999999999999999999999999999999999999998888201116110ba575f600188039050808160030b036110b85760e01b6001600160e01b037b7fffffffffffffffffffffffffffffffffffffffffffffffffffffff60ff8b901d18161795505f94506106619350505050565b505b506110d7565b865f036110d757505f935060019250610661915050565b858660030b1461118e575f821315611136576110f383836114d5565b1561111b5760405163d556b11160e01b81526004810184905260248101839052604401610297565b637ffffffe19909501600a0a82029550637fffffff9461118e565b637fffffff19869003604381131561115857505f945084935061066192505050565b80600a0a888161116a5761116a612257565b059750875f0361118457505f945084935061066192505050565b50637fffffff1995505b81861361119e57600193506111b7565b818603600a0a83816111b2576111b2612257565b071593505b5050506001600160e01b03841660e084901b1791509250929050565b5f805f83516020850186885af1949350505050565b6040513d5f823e3d81fd5b60605f825167ffffffffffffffff811115611210576112106118d4565b604051908082528060200260200182016040528015611239578160200160208202803683370190505b5090505f8084511161124b575f611251565b83516001015b85516001010190505f8167ffffffffffffffff811115611273576112736118d4565b6040519080825280602002602001820160405280156112a657816020015b60608152602001906001900390816112915790505b5090505f6112ca604080516002815233602082015230818301526060810190915290565b8282815181106112dc576112dc611d25565b60200260200101819052505f5b875181101561133957818060010192505087818151811061130c5761130c611d25565b602002602001015183838151811061132657611326611d25565b60209081029190910101526001016112e9565b508551156114cb5780806001019150508382828151811061135c5761135c611d25565b60200260200101819052505f5b86518110156114c95761141887828151811061138757611387611d25565b60200260200101515f01516113f56113c38a85815181106113aa576113aa611d25565b6020026020010151602001518051602090810291012090565b7f19457468657265756d205369676e6564204d6573736167653a0a3332000000005f908152601c91909152603c902090565b89848151811061140757611407611d25565b6020026020010151604001516114f7565b61143857604051630a57f30960e31b815260048101829052602401610297565b86818151811061144a5761144a611d25565b60200260200101515f01516001600160a01b03165f1b85828151811061147257611472611d25565b602002602001018181525050818060010192505086818151811061149857611498611d25565b6020026020010151602001518383815181106114b6576114b6611d25565b6020908102919091010152600101611369565b505b5095945050505050565b5f6114f05f84126114e657836114ea565b835f035b83611568565b9392505050565b5f836001600160a01b03163b5f03611555575f806115158585611606565b5090925090505f81600381111561152e5761152e6124c1565b14801561154c5750856001600160a01b0316826001600160a01b0316145b925050506114f0565b61156084848461164c565b949350505050565b5f637ffffff5821361157b57505f6100ed565b637ffffffe19820160438113156115965750508115156100ed565b5f81126115d65780600a0a7b80000000000000000000000000000000000000000000000000000001816115cb576115cb612257565b0484119150506100ed565b805f03600a0a7b800000000000000000000000000000000000000000000000000000020284101591505092915050565b5f805f835160410361163d576020840151604085015160608601515f1a61162f888285856116b1565b955095509550505050610f83565b505081515f9150600290610f83565b805160408051630b135d3f60e11b8082526004820186905260248201929092525f92906020820185604483015e5f82606483010152601f820160051c60051b915060205f60648401838a5afa9050825f5114601f3d1116811693505050509392505050565b5f80807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08411156116ea57505f9150600390508261176f565b604080515f808252602082018084528a905260ff891692820192909252606081018790526080810186905260019060a0016020604051602081039080840390855afa15801561173b573d5f803e3d5ffd5b5050604051601f1901519150506001600160a01b03811661176657505f92506001915082905061176f565b92505f91508190505b9450945094915050565b5f60208284031215611789575f80fd5b81356001600160e01b0319811681146114f0575f80fd5b6001600160a01b0381168114610222575f80fd5b5f805f805f8060a087890312156117c9575f80fd5b86356117d4816117a0565b955060208701356117e4816117a0565b94506040870135935060608701359250608087013567ffffffffffffffff8082111561180e575f80fd5b818901915089601f830112611821575f80fd5b81358181111561182f575f80fd5b8a6020828501011115611840575f80fd5b6020830194508093505050509295509295509295565b5f805f60608486031215611868575f80fd5b8335611873816117a0565b9250602084013567ffffffffffffffff8082111561188f575f80fd5b9085019060c082880312156118a2575f80fd5b909250604085013590808211156118b7575f80fd5b508401604081870312156118c9575f80fd5b809150509250925092565b634e487b7160e01b5f52604160045260245ffd5b6040516060810167ffffffffffffffff8111828210171561190b5761190b6118d4565b60405290565b6040805190810167ffffffffffffffff8111828210171561190b5761190b6118d4565b604051601f8201601f1916810167ffffffffffffffff8111828210171561195d5761195d6118d4565b604052919050565b5f82601f830112611974575f80fd5b813567ffffffffffffffff81111561198e5761198e6118d4565b6119a1601f8201601f1916602001611934565b8181528460208386010111156119b5575f80fd5b816020850160208301375f918101602001919091529392505050565b5f602082840312156119e1575f80fd5b813567ffffffffffffffff8111156119f7575f80fd5b61156084828501611965565b5f60018201611a2057634e487b7160e01b5f52601160045260245ffd5b5060010190565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b5f6001600160a01b038089168352876020840152808716604084015285606084015280851660808401525060c060a0830152611a9460c0830184611a27565b98975050505050505050565b5f60208284031215611ab0575f80fd5b5051919050565b5f67ffffffffffffffff821115611ad057611ad06118d4565b5060051b60200190565b5f82601f830112611ae9575f80fd5b81356020611afe611af983611ab7565b611934565b82815260059290921b84018101918181019086841115611b1c575f80fd5b8286015b84811015611c1857803567ffffffffffffffff80821115611b3f575f80fd5b908801906060828b03601f19011215611b56575f80fd5b611b5e6118e8565b86830135611b6b816117a0565b815260408381013583811115611b7f575f80fd5b8401603f81018d13611b8f575f80fd5b88810135611b9f611af982611ab7565b81815260059190911b82018301908a8101908f831115611bbd575f80fd5b928401925b82841015611bdb5783358252928b0192908b0190611bc2565b858c0152505050606084013583811115611bf3575f80fd5b611c018d8a83880101611965565b918301919091525085525050918301918301611b20565b509695505050505050565b5f60408236031215611c33575f80fd5b611c3b611911565b823567ffffffffffffffff80821115611c52575f80fd5b818501915060608236031215611c66575f80fd5b611c6e6118e8565b8235611c79816117a0565b81526020830135611c89816117a0565b6020820152604083013582811115611c9f575f80fd5b611cab36828601611965565b60408301525083526020850135915080821115611cc6575f80fd5b50611cd336828601611ada565b60208301525092915050565b5f808335601e19843603018112611cf4575f80fd5b83018035915067ffffffffffffffff821115611d0e575f80fd5b6020019150600581901b3603821315610661575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235607e19833603018112611d4d575f80fd5b9190910192915050565b5f8235609e19833603018112611d4d575f80fd5b5f808335601e19843603018112611d80575f80fd5b83018035915067ffffffffffffffff821115611d9a575f80fd5b6020019150600681901b3603821315610661575f80fd5b5f60208284031215611dc1575f80fd5b81356114f0816117a0565b5f808335601e19843603018112611de1575f80fd5b830160208101925035905067ffffffffffffffff811115611e00575f80fd5b8060051b3603821315610661575f80fd5b5f8235605e19833603018112611e25575f80fd5b90910192915050565b5f808335601e19843603018112611e43575f80fd5b830160208101925035905067ffffffffffffffff811115611e62575f80fd5b803603821315610661575f80fd5b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b5f808335601e19843603018112611ead575f80fd5b830160208101925035905067ffffffffffffffff811115611ecc575f80fd5b8060061b3603821315610661575f80fd5b8183525f60208085019450825f5b85811015611f23578135611efe816117a0565b6001600160a01b03168752818301358388015260409687019690910190600101611eeb565b509495945050505050565b8183526020808401935f91600585811b8301820185855b8881101561200757858303601f19018a52611f608289611e11565b60608135611f6d816117a0565b6001600160a01b03168552611f8482880183611dcc565b82898801528083880152608092507f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811115611fbe575f80fd5b871b808288850137860190506040611fd884820185611e2e565b9450838884030182890152611ff08484018683611e70565b9e8a019e9750505093870193505050600101611f45565b509098975050505050505050565b5f602080835260e0830184358285015260408286013581860152606081870135818701528087013580151580821461204b575f80fd5b80608089015250506120606080880188611dcc565b60c060a08901529384905261010093848801600582901b89018601835f5b848110156121dc578b830360ff19018452813536879003607e190181126120a3575f80fd5b8601803536829003609e190181126120b9575f80fd5b60808552810180356120ca816117a0565b6001600160a01b0380821660808801526120e68e840184611e11565b915060a08088015281356120f9816117a0565b8116610120880152818e013561210e816117a0565b16610140870152612121818c0182611e2e565b91508a61016088015261213961018088018383611e70565b9150506121488b830183611e98565b607f19808985030160c08a0152612160848385611edd565b935061216e8d860186611e98565b93509150808985030160e08a015250612188838383611edd565b9250505060808201358c8701528c8301358d8701528a8301358b8701526121b18a840184611dcc565b935091508581038a8701526121c7818484611f2e565b968d019695505050918a01915060010161207e565b50506121eb60a08c018c611e2e565b8b8303601f190160c08d015298509650612206818989611e70565b9b9a5050505050505050505050565b5f8060408385031215612226575f80fd5b505080516020909101519092909150565b5f60208284031215612247575f80fd5b815160ff811681146114f0575f80fd5b634e487b7160e01b5f52601260045260245ffd5b5f815180845260208085019450602084015f5b83811015611f235781518752958201959082019060010161227e565b5f8282518085526020808601955060208260051b840101602086015f5b848110156122e557601f198684030189526122d383835161226b565b988401989250908301906001016122b7565b5090979650505050505050565b602081526001600160a01b038251166020820152602082015160408201525f604083015160e0606084015261232b610100840182611a27565b9050606084015160808401526080840151601f19808584030160a0860152612353838361229a565b925060a08601519150808584030160c0860152612370838361226b565b925060c08601519150808584030160e08601525061238e828261226b565b95945050505050565b5f82601f8301126123a6575f80fd5b815160206123b6611af983611ab7565b8083825260208201915060208460051b8701019350868411156123d7575f80fd5b602086015b84811015611c1857805183529183019183016123dc565b5f8060408385031215612404575f80fd5b825167ffffffffffffffff8082111561241b575f80fd5b818501915085601f83011261242e575f80fd5b8151602061243e611af983611ab7565b82815260059290921b8401810191818101908984111561245c575f80fd5b948201945b8386101561247a57855182529482019490820190612461565b91880151919650909350505080821115612492575f80fd5b5061249f85828601612397565b9150509250929050565b828152604060208201525f611560604083018461226b565b634e487b7160e01b5f52602160045260245ffd"; /// @dev What MUST already be on a network before this release can be /// broadcast there: an address, and the runtime code that belongs at it. /// `abi.encode`d as a `DeployDependency[]` because Solidity has no /// file-scope constant of dynamic array type. bytes constant DEPENDENCIES = - hex"00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000052a00000000000000000000000000000000000000000000000000000000000005760000000000000000000000000522a6b8d2cd1e44d53475516fd3c55bc29a0e865000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000051c26080806040526004361015610012575f80fd5b5f3560e01c90816301ffc9a714611792575080631f69cb751461155c5780632cb77e9f146115305780632fbc4ba0146113ce57806341d1514f146113975780635cffe9de1461123b578063607461191461109f578063613255ab1461101c57806369c728561461072b578063709fb8a5146104375780639235084d146103e3578063ac9650d814610295578063d7e442ec14610237578063d9d98ce4146101865763fa501182146100c1575f80fd5b34610182576101403660031901126101825767ffffffffffffffff600435818111610182576100f4903690600401611b44565b6024358281116101825761010c903690600401611b44565b60c0366043190112610182576101043583811161018257610131903690600401611cea565b90610124359384116101825761014e61015c943690600401611cea565b926101576126da565b612220565b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055005b5f80fd5b34610182576040366003190112610182576001600160a01b036101a7611816565b166040516370a0823160e01b8152306004820152602081602481855afa90811561022c575f916101fa575b50156101e25760206040515f8152f35b60249060405190633c5bf76960e21b82526004820152fd5b90506020813d602011610224575b81610215602093836119b3565b810103126101825751826101d2565b3d9150610208565b6040513d5f823e3d90fd5b346101825760203660031901126101825760043567ffffffffffffffff81116101825761028f61026e61015c9236906004016117e5565b91906102786126da565b6040519261028584611997565b5f84523691611dbe565b90612991565b34610182576020806003193601126101825760043567ffffffffffffffff8111610182576102c79036906004016117e5565b9190604051926102d684611997565b5f84528284016102e582611a97565b946102f360405196876119b3565b8286526102ff83611a97565b9361031186880195601f190186612204565b5f5b84811061037557604080518881528951818a018190525f92600582901b83018101918a918c9085015b8287106103495785850386f35b909192938280610365600193603f198a820301865288516118a2565b960192019601959291909261033c565b806103c4886103be61039160019560059d9c9d1b8701876120e4565b929089846040519586938585013782018381015f81528b519283915e015f838201520380845201826119b3565b30613a32565b6103ce828a611fca565b526103d98189611fca565b5001969596610313565b3461018257600319602036820112610182576004359067ffffffffffffffff82116101825760809082360301126101825761042260609160040161212c565b90604051921515835260208301526040820152f35b34610182576003196040368201126101825760043567ffffffffffffffff8082116101825760c08260040193833603011261018257602435908111610182576104849036906004016117e5565b61048f9291926126da565b6104c06104bb6104b66104af6104a58880612117565b60408101906120e4565b36916119d5565b6139c8565b613a1d565b801561071957600110156107075760248201926104dd8486611f27565b9050156106f55760448301936104f38587611f27565b9050156106e3576105596105219561054d6105186105118a80612117565b948a611f27565b9890928a611f27565b91909261053e60405196610534886118c6565b3388523690611a39565b9960209a8b8801523691611aaf565b60408501523691611aaf565b6060820152606484013560808201526105718161271c565b90815f525f865260405f209485541595866105b5575b878760017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055604051908152f35b6001905560a46001600160a01b03917f87491344dfbcf91f6cbbc610cbbeedc85313d37a02df0c93527f7ea5f8db717f83855116604051908152868b82015260606040820152806106096060820188612032565b0390a10191610618838a6120e4565b905061063b575b50505061062e9394955061274d565b8190838080808080610587565b6106486104af848b6120e4565b610651816147b9565b156106bc57509761068f7fd46c2c56b35c8210e9e712ec3f02242d5fc90187c0ac8ed80cc33626846ec369936106af9361062e999a9b5116926120e4565b92906040519384938452868c850152606060408501526060840191611d19565b0390a1859493878061061f565b886106df604051928392630c89984b60e31b8452600484015260248301906118a2565b0390fd5b60405163540e5f0b60e01b8152600490fd5b604051636c44ef8f60e01b8152600490fd5b604051633c8270bd60e21b8152600490fd5b604051632cff108b60e21b8152600490fd5b34610182576003196020368201126101825767ffffffffffffffff600435116101825760c09060043536030112610182576107646126da565b5f808061077960048035608481019101611e70565b90501561100a576024600435013592610791846127dd565b15610ff8576060806040516107a58161192e565b6107ad611ec5565b81525f60208201525f604082015201526107c5611ec5565b506108256108206107ff6107f56107ef6107e9608460043501600435600401611e70565b90611ef7565b80611f12565b6040810190611f27565b60206108186107e9608460043501600435600401611e70565b013591611f5d565b611d05565b936001600160a01b0361087461082061085b6108516107ef6107e9608460043501600435600401611e70565b6060810190611f27565b60406108186107e9608460043501600435600401611e70565b8160405197610882896118f6565b16875216602086015260408501526108a4608460043501600435600401611e70565b9490506001604051955f87520160051b85016040525f905f5b6108d1608460043501600435600401611e70565b9050811080610fe5575b15610e32576108f4608460043501600435600401611e70565b821015610e1e578160051b810135607e198236030181121561018257608081830136031261018257604051916109298361192e565b8181013567ffffffffffffffff81116101825761094b90369084840101611b44565b835280820160208181013590850152604080820135908501526060013567ffffffffffffffff8111610182576109849236920101611cea565b606082015280516001600160a01b036109a66040830151602085015190611fca565b5151166001600160a01b0385511614801590610dea575b610dd8576109d5602083015160408401519083612ed1565b6109de8161271c565b91825f525f60205260405f2054155f14610a42575051604080513381526001600160a01b039092166020830152810191909152600191907fb70c12fa453793fa6818ec07c91e74363a47aa6a6829dcd9533937fdf30314f390606090a15b016108bd565b9190610a73602084979597015160408501519060608601519060405192610a6884611997565b5f8452339186613102565b925f93610a8b60608201516044600435013590612800565b15610af257505051604080513381526001600160a01b03909216602083015281019190915260019291907fe3151dc8cb7a54ffc4baabd28c1f241c94d510b5e5b502491ac3cad6c16316d590606090a15b8115610aea575b5092610a3c565b905088610ae3565b610aff60408201516127dd565b158015610dc5575b15610b5c57505051604080513381526001600160a01b03909216602083015281019190915260019291907f500b713857325f9e6dcb52ae832eca9109d107ed1aae9cb4928b4c1e13f051aa90606090a1610adc565b9250925050600196959691610b75606460043501611fde565b15610d325796610be597610bf560408401516040880151610b968183613461565b15610d2a5750925b610bef848592610bd8610bd260608a01516001600160e01b03601b918660e01d92828816810b928260e01d9216900b613e72565b9061402d565b9d8e9260408d015161352c565b60408c0152613556565b99613556565b98610c008484613580565b610c0a84826135de565b60405192338452608060208501526060610c308451608080880152610100870190612032565b93602081015160a0870152604081015160c0870152015192607f198582030160e0860152835180825260208201906020808260051b8501019601925f5b828110610ccc57505050505092806001979695937f194f1feb3b4d7076a2c272e774e792e0c48bb8c7aa1a9a3671c1cd6da9e6b4c193610cc796604084015260608301520390a180858c5101808d5260051b8c0152613731565b610adc565b9091929396602080610d1d600193601f198782030189528b51906001600160a01b0382511681526040610d0c8584015160608785015260608401906120b1565b9201519060408184039101526118a2565b9901950193929101610c6d565b905092610b9e565b610be590610bf56060840151610bef610d70610bd260408801516001600160e01b0394601b90868360e01d9316820b91878260e01d9216900b613e72565b60408a0151610d7f8183613461565b15610dbd5750915b829c8d916060890151908116155f14610dae575060408801515b96879460408d015161352c565b610db89085613488565b610da1565b905091610d87565b50610dd3606082015161343e565b610b07565b60405163936bb5ad60e01b8152600490fd5b506001600160a01b03610e066060830151604085015190611fca565b5151166001600160a01b0360208601511614156109bd565b634e487b7160e01b5f52603260045260245ffd5b50919390610e44606460043501611fde565b15610fdf57835b6004356004013590610e5d8282613461565b610fc15750508490610e7d856001600160a01b0360208701511633612e68565b505060a46004350190610e95826004356004016120e4565b905015159081610fb9575b50610f18575b506001600160a01b03610ebc9293511633612827565b50505b8351811015610ee45780610ede610ed860019387611fca565b5161390a565b01610ebf565b5060409160017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f005582519182526020820152f35b90506001600160a01b03602084015116610f426001600160a01b03855116926004356004016120e4565b929091333b1561018257610f8a5f93604051958694859463691f9ed760e01b8652600486015260248501528960448501528a606485015260a0608485015260a4840191611d19565b038183335af190811561022c57859115610ea6579050610faa915061194a565b5f836001600160a01b03610ea6565b905088610ea0565b604492506040519163573b6f4160e01b835260048301526024820152fd5b84610e4b565b50610ff360408301516127dd565b6108db565b60405163315f9e2360e21b8152600490fd5b604051639c95219f60e01b8152600490fd5b3461018257602080600319360112610182576024816001600160a01b03611041611816565b16604051928380926370a0823160e01b82523060048301525afa90811561022c575f91611072575b50604051908152f35b90508181813d8311611098575b61108981836119b3565b81010312610182575182611069565b503d61107f565b34610182576110ad36611856565b6110b56126da565b6110c08486336127a9565b6110c9836127dd565b1561120e576110d9848633612b9b565b6110e38185613461565b15611208575082935b6110f885828833612e0a565b9690947f8045c25080b0868951141ed0a91720bcad09a8364a2b3109ee1fd49c1f0bc8b860c0611129898533612e68565b94906001600160a01b0360405192338452169a8b6020840152876040840152856060840152608083015260a0820152a1836111845760017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055005b6111fb9761028f9660ff946040519960078b5260208b015260408a01526060890152608088015260a08701521660c08501523360e0850152610100840193846040526111cf8561197a565b600785526111e061012082016121e8565b6111e985611fba565b526111f384611fba565b503691611dbe565b808080808080808061015c565b936110ec565b604051623a3a4d60e21b81523360048201526001600160a01b038616602482015260448101859052606490fd5b34610182576080366003190112610182576004356001600160a01b03908181168091036101825761126a61182c565b6044359167ffffffffffffffff916064358381116101825736602382011215610182578060040135938411610182573660248583010111610182576112f79560209216936112b9868587612d2b565b60405196879283926323e30c8b60e01b84523360048501528760248501528860448501525f606485015260a06084850152602460a485019201611d19565b03815f855af193841561022c575f94611363575b507f439148f0bbc682ca079e46d6e2c2f0c1e3b820f1a291b069d8882abf8cf18dd9840361134a5761133f93503091612da4565b602060405160018152f35b604051630b6c58a960e31b815260048101859052602490fd5b9093506020813d60201161138f575b8161137f602093836119b3565b810103126101825751928461130b565b3d9150611372565b346101825760603660031901126101825760206113c66113b5611816565b6113bd61182c565b60443591612b9b565b604051908152f35b34610182576113dc36611856565b839493926113e86126da565b6113f38486336127a9565b6113fc816127dd565b15611502578061141061145f928733612827565b9590967f7f9dfa19cf1cc2f806f2f860fbc9c056b601fb1afc0e9b843dfe5c63616268e660806040513381526001600160a01b0384169a8b60208301528560408301526060820152a1336128cd565b9590938261148d5760017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055005b6114f69661028f9560ff936040519860068a5260208a01526040890152606088015260808701521660a08501523360c085015260e0840193846040526114d28561197a565b600785526114e361010082016121e8565b6114ec85611faa565b526111f384611faa565b8080808080808061015c565b6040516306dde9c360e41b81523360048201526001600160a01b038616602482015260448101859052606490fd5b34610182576020366003190112610182576004355f525f6020526020600160405f205414604051908152f35b3461018257600319604036820112610182576004359067ffffffffffffffff808311610182578260040160a08436039384011261018257602435828111610182576115ab9036906004016117e5565b906115b46126da565b5f946001600160a01b0394856115c986611d05565b163303611770576115e26115dd3687611b44565b61271c565b91825f525f60205260405f2096600188541461162a575b60208960017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00556040519015158152f35b9091929394959697505f6001985560405191338352846020840152606060408401528161165689611842565b16606084015260248a013590606219018112156101825789019060a060808401528061168460048401611842565b1661010084015261169760248301611842565b1661012083015260448101356022198236030181121561018257019560246004880135970192871161018257863603831361018257602098608461175384936117127f09d18501db0080ca2d6cd7c17fa7255daff4b2d503ea93b76ff68b6752ea8e63976117639c6060610140890152610160880191611d19565b6117446117396117256044880185611d39565b605f198a8603810160a08c01529491611d6e565b926064870190611d39565b918784030160c0880152611d6e565b91013560e08301520390a161274d565b82808080808080806115f9565b60248661177c87611d05565b6040516335252be360e01b815291166004820152fd5b34610182576020366003190112610182576004359063ffffffff60e01b82168092036101825760209163e414309160e01b81149081156117d4575b5015158152f35b6301ffc9a760e01b149050836117cd565b9181601f840112156101825782359167ffffffffffffffff8311610182576020808501948460051b01011161018257565b600435906001600160a01b038216820361018257565b602435906001600160a01b038216820361018257565b35906001600160a01b038216820361018257565b906080600319830112610182576004356001600160a01b0381168103610182579160243591604435916064359067ffffffffffffffff82116101825761189e916004016117e5565b9091565b805180835260209291819084018484015e5f828201840152601f01601f1916010190565b60a0810190811067ffffffffffffffff8211176118e257604052565b634e487b7160e01b5f52604160045260245ffd5b6060810190811067ffffffffffffffff8211176118e257604052565b6040810190811067ffffffffffffffff8211176118e257604052565b6080810190811067ffffffffffffffff8211176118e257604052565b67ffffffffffffffff81116118e257604052565b60e0810190811067ffffffffffffffff8211176118e257604052565b610100810190811067ffffffffffffffff8211176118e257604052565b6020810190811067ffffffffffffffff8211176118e257604052565b90601f8019910116810190811067ffffffffffffffff8211176118e257604052565b92919267ffffffffffffffff82116118e257604051916119ff601f8201601f1916602001846119b3565b829481845281830111610182578281602093845f960137010152565b9080601f8301121561018257816020611a36933591016119d5565b90565b91906060838203126101825760405190611a52826118f6565b8193611a5d81611842565b8352611a6b60208201611842565b602084015260408101359167ffffffffffffffff831161018257604092611a929201611a1b565b910152565b67ffffffffffffffff81116118e25760051b60200190565b929192611abb82611a97565b604092611acb60405192836119b3565b819581835260208093019160061b84019381851161018257915b848310611af457505050505050565b8583830312610182578386918251611b0b81611912565b611b1486611842565b81528286013583820152815201920191611ae5565b9080601f8301121561018257816020611a3693359101611aaf565b91909160a0818403126101825760405190611b5e826118c6565b8193611b6982611842565b835267ffffffffffffffff9160208101358381116101825782611b8d918301611a39565b602085015260408101358381116101825782611baa918301611b29565b6040850152606081013592831161018257611bcb6080939284938301611b29565b60608501520135910152565b909291611be384611a97565b916040611bf360405194856119b3565b839580855260208095019160059160051b8401948086116101825784935b868510611c22575050505050505050565b67ffffffffffffffff90853582811161018257870190606082850312610182578451611c4d816118f6565b611c5683611842565b81528a83013584811161018257830185601f8201121561018257803590611c7c82611a97565b91611c89895193846119b3565b8083528d808401918b1b83010191888311610182578e809101915b838310611cda57509150508201528583013593841161018257611ccb858c95869501611a1b565b86820152815201940193611c11565b82358152918101918f9101611ca4565b9080601f8301121561018257816020611a3693359101611bd7565b356001600160a01b03811681036101825790565b908060209392818452848401375f828201840152601f01601f1916010190565b9035601e198236030181121561018257016020813591019167ffffffffffffffff8211610182578160061b3603831361018257565b9190808252602080920192915f905b828210611d8b575050505090565b909192936001906001600160a01b03611da387611842565b16815285830135838201526040908101950193920190611d7d565b90929192611dcb81611a97565b91604091611ddc60405194856119b3565b839581855260208095019160051b8301938185116101825783925b858410611e075750505050505050565b67ffffffffffffffff908435828111610182578601908382860312610182578351611e3181611912565b82358481116101825786611e46918501611a39565b81528983013593841161018257611e61868b95869501611cea565b83820152815201930192611df7565b903590601e1981360301821215610182570180359067ffffffffffffffff821161018257602001918160051b3603831361018257565b60405190611eb3826118f6565b60606040835f81525f60208201520152565b60405190611ed2826118c6565b5f608083828152611ee1611ea6565b6020820152606060408201526060808201520152565b9015610e1e57803590607e1981360301821215610182570190565b903590609e1981360301821215610182570190565b903590601e1981360301821215610182570180359067ffffffffffffffff821161018257602001918160061b3603831361018257565b9190811015610e1e5760061b0190565b805115610e1e5760200190565b805160011015610e1e5760400190565b805160021015610e1e5760600190565b805160031015610e1e5760800190565b805160041015610e1e5760a00190565b805160051015610e1e5760c00190565b8051821015610e1e5760209160051b010190565b3580151581036101825790565b9081518082526020808093019301915f5b82811061200a575050505090565b835180516001600160a01b031686528201518583015260409094019392810192600101611ffc565b906080806120a861209661208460406001600160a01b0380895116885260208901519060a060208a01528082511660a08a015260208201511660c08901520151606060e08801526101008701906118a2565b60408701518682036040880152611feb565b60608601518582036060870152611feb565b93015191015290565b9081518082526020808093019301915f5b8281106120d0575050505090565b8351855293810193928101926001016120c2565b903590601e1981360301821215610182570180359067ffffffffffffffff82116101825760200191813603831361018257565b903590605e1981360301821215610182570190565b6121436115dd61213c8380611f12565b3690611b44565b5f525f602052600160405f2054036121df5780612163816121cf93611f12565b6121c76121826121876020850135938460408701359384923690611b44565b612ed1565b61219f6121948580611f12565b946060810190611e70565b92906121bf604051966121b188611997565b5f88525f3681373690611b44565b933691611bd7565b923392613102565b6040810151606090910151600192565b505f905f905f90565b5f5b60e081106121f6575050565b6060828201526020016121ea565b5f5b82811061221257505050565b606082820152602001612206565b926001600160a01b038451166001600160a01b03835116146126c8576001600160a01b03612255606086015160643590611fca565b515116906040830151916001600160a01b036122746084358095611fca565b51511614801590612688575b610dd8576040850151906001600160a01b0361229f6044358094611fca565b5151166001600160a01b036122ba60643560608a0151611fca565b51511614612676576122cb8661271c565b805f525f60205260405f20541561262357506122e68461271c565b805f525f60205260405f2054156125cf57506123c992916123a3917f6fa7f4c28634b0a9d6831401c45ae468195fb63aed07308935c35374ff5d9e396040518061234e61234061012033845280602085015283018d612032565b82810360408401528a612032565b85606083015260643560808301528760a083015260a43560c083015260c43560e083015260e4356101008301520390a16001600160a01b038651166040519261239684611997565b5f8452606435908a613102565b936001600160a01b03865116604051926123bc84611997565b5f845260a4359086613102565b916123d760408201516127dd565b1580156125bb575b80156125a8575b8015612595575b61258357604051916123fe8361192e565b5f83525f60208401525f60408401525f606084015261241d84836147dd565b8452604084015261244361243183866147dd565b6020860152806060860152845161352c565b94612457602085015160408601519061352c565b936124618761343e565b8015612574575b6125625761252961255b957fd9fa84dd790c969daa5c33d8050dc06b4a9b59d5b42e2be5f5e8ae20447f618d9461250b6125609a60a0966124aa8a8851613580565b6124b88c6020890151613580565b6124c68a60408901516135de565b6124d48c60608901516135de565b6124dd8a61390a565b6124e68c61390a565b6001600160a01b0361250260c435926060606435910151611fca565b515116336128cd565b50506001600160a01b0361250260e43592606060a435910151611fca565b5050606060405191338352805160208401526020810151604084015260408101518284015201516080820152a1613731565b613731565b565b604051630d86822160e01b8152600490fd5b5061257e8561343e565b612468565b6040516321badf1f60e01b8152600490fd5b506125a3606084015161343e565b6123ed565b506125b6606082015161343e565b6123e6565b506125c960408401516127dd565b156123df565b9351604080513381526001600160a01b039092166020830152810194909452507fb70c12fa453793fa6818ec07c91e74363a47aa6a6829dcd9533937fdf30314f3945091925082915050606081015b0390a1565b9551604080513381526001600160a01b039092166020830152810196909652507fb70c12fa453793fa6818ec07c91e74363a47aa6a6829dcd9533937fdf30314f39493508392505060608201905061261e565b604051631cd2f1c760e21b8152600490fd5b506001600160a01b036126a2606085015160a43590611fca565b5151166001600160a01b036126be604088015160443590611fca565b5151161415612280565b604051630a98f1f360e21b8152600490fd5b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00600281541461270a5760029055565b604051633ee5aeb560e01b8152600490fd5b604051612747816127396020820194602086526040830190612032565b03601f1981018352826119b3565b51902090565b612560929161277861028f923390919060405192600284526020840152604083015260608201604052565b92604051936127868561197a565b60078552612796602086016121e8565b61279f85611f6d565b526111f384611f6d565b9091156127b4575050565b6040516305dbdfd960e41b81526001600160a01b03918216600482015291166024820152604490fd5b6127fc905f60e01d906001600160e01b038160e01d9116601b0b614840565b1290565b906127fc916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b6148c1565b92919261283382613b05565b9361283d8161343e565b6128bb5784816001600160e01b0361285c9360e01d9116601b0b614940565b9290809315612892575b50829081612876575b5050509190565b61288a926001600160a01b03309216612da4565b5f818161286f565b9092505f1981146128a757600101915f612866565b634e487b7160e01b5f52601160045260245ffd5b604051632eaefac360e21b8152600490fd5b939291936128da8361343e565b61297857846128f6576128ee939450612e68565b50505f905f90565b6001600160a01b039392919380911694855f52602060018152604092835f20961695865f528152825f20825f528152612933835f20549485613556565b9561293d8761343e565b612960575f97885260018252838820908852815282872091875252909320829055565b835163c5e12af560e01b815260048101889052602490fd5b60405163793a8f5560e01b815260048101849052602490fd5b6040805192936129a08461197a565b6007845260206129b18186016121e8565b5f5b84518110156129e657806129c960019287611fca565b516129d48289611fca565b526129df8188611fca565b50016129b3565b50925092939093335f52308352845f2092855191612a0383611912565b612a0b611ea6565b835260608281940152865193612a2085611997565b5f8552875190612a2f82611997565b5f82525f3681375f5b8151811015612b8f57612a4b8183611fca565b51908a8251015151612a62575b6001915001612a38565b8a89875f612a73828701518a613c40565b938651946001600160a01b0394828680895116968901511697015190835197612a9b8961195e565b88528d88015282870152828d87015260808601528c60a08601528860c086015251809263d04dfe2360e01b82528180612ad860049889830161304a565b03915afa948515612b855789915f96612b5f575b508551612afd575b50505050612a58565b5101511692833b1561018257612b2b935f92838f5180978195829463012c676d60e21b8452339084016136f0565b03925af1918215612b5557600192612b46575b808781612af4565b612b4f9061194a565b5f612b3e565b8b513d5f823e3d90fd5b612b7c9196503d805f833e612b7481836119b3565b810190612f06565b9050945f612aec565b8e513d5f823e3d90fd5b50505050505050509050565b8215612bd0576001600160a01b038091165f52600160205260405f2091165f5260205260405f20905f5260205260405f205490565b909150612bdc82613be4565b6001600160a01b03809316906040918251946370a0823160e01b86528416938460048701526020928387602481865afa968715612cf2575f97612cfc575b5083612c33612c2c83612c639a614a6c565b5090614280565b508651636eb1769f60e11b81526001600160a01b0390941660048501523060248501529297889081906044820190565b0381865afa968715612cf2575f97612cc1575b50612c2c612c8791611a3698614a6c565b50612c928183613461565b15612cb95750935b5f5260018252825f20905f528152815f20905f8052525f205490613556565b905093612c9a565b96508387813d8311612ceb575b612cd881836119b3565b8101031261018257955195612c2c612c76565b503d612cce565b85513d5f823e3d90fd5b96508387813d8311612d24575b612d1381836119b3565b810103126101825795519583612c1a565b503d612d09565b6040519263a9059cbb60e01b5f526001600160a01b0380931660045260245260205f60448180855af160015f5114811615612d85575b8360405215612d6f57505050565b635274afe760e01b835216600482015260249150fd5b6001811516612d9b57813b15153d151616612d61565b833d5f823e3d90fd5b9092604051936323b872dd60e01b5f526001600160a01b0393848092166004521660245260445260205f60648180855af160015f5114811615612df4575b836040525f60605215612d6f57505050565b6001811516612d9b57813b15153d151616612de2565b93929193612e178361343e565b6129785784612e2b576128ee939450612827565b6001600160a01b039392919380911694855f52602060018152604092835f20961695865f528152825f20825f528152612933835f2054948561352c565b90929192612e7581613b05565b93612e7f8161343e565b612ebf5784816001600160e01b03612e9e9360e01d9116601b0b614940565b50809281612ead575050509190565b6001600160a01b0361288a9316612d2b565b604051632d1671a360e11b8152600490fd5b91612efc906060612ef1936001600160a01b039485916040880151611fca565b515116940151611fca565b5151161461267657565b919060408382031261018257825167ffffffffffffffff908181116101825784019082601f83011215610182578151602092612f4182611a97565b91612f4f60405193846119b3565b808352848084019160051b830101918683116101825785809101915b838310612fde5750505050948281015191821161018257019180601f84011215610182578251612f9a81611a97565b93612fa860405195866119b3565b818552838086019260051b820101928311610182578301905b828210612fcf575050505090565b81518152908301908301612fc1565b8251815291810191869101612f6b565b90808251908181526020809101926020808460051b8301019501935f915b84831061301c5750505050505090565b909192939495848061303a600193601f198682030187528a516120b1565b980193019301919493929061300c565b91906020928381526001600160a01b0382511684820152838201516040820152613084604083015160e060608401526101008301906118a2565b90606083015160808201526130ab608084015192601f1993848483030160a0850152612fee565b9260a081015193838382030160c08401528680865192838152019501905f5b8181106130ee57505050611a3694955060c060e091015192828503019101526120b1565b8251875295880195918801916001016130ca565b949193613347919360c0915f6132ce6040928351946131208661195e565b613128611ec5565b86526020958487820152848682015260609781868a809401528260808201528660a0820152015261327e85519161315e8361197a565b6007835261316d8884016121e8565b8d6131778161271c565b9c896001600160a01b039e8f94859182865116908d5194600486528501528c840152168c82015233608082015260a081018a526131b386611f6d565b526131bd85611f6d565b5088516131c9816118f6565b6002815289368c8301376131dc86611f7a565b526131e685611f7a565b5060ff8a6132498b8501936132338761320c81613204858a51611fca565b515116613be4565b9751168861321b848951611fca565b5151168561322a858a51611fca565b51015191612b9b565b9661323f828751611fca565b5151169451611fca565b51015192169093929190604051946005865260208601526040850152606084015260808301525f60a083015260c08201604052565b61328782611f8a565b5261329181611f8a565b506132b58a8d8d60ff8a6132498d8501936132338761320c81613204858a51611fca565b6132be82611f9a565b526132c881611f9a565b50613c40565b95878a511697848b0191825191868184511693015116928a855230875285808620915101518651916132ff83611997565b86835287519561330e8761195e565b86528886015286850152848885015289608085015260a084015260c08301528351808098819463d04dfe2360e01b83526004830161304a565b03915afa968715613434575f945f98613412575b508451600281106133fb5750818386015195015161338161337b88611faa565b51611f9a565b5161338c8183613461565b156133f35750925b6133b68685919060405192600284526020840152604083015260608201604052565b6133bf88611f8a565b526133c987611f8a565b508251996133d68b61195e565b8a52890152870152850152608084015260a083015260c082015290565b905092613394565b602490835190630fbb8e5560e21b82526004820152fd5b90975061342a9194503d805f833e612b7481836119b3565b939093965f61335b565b50513d5f823e3d90fd5b61345d905f60e01d906001600160e01b038160e01d9116601b0b614840565b1390565b9061345d916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b6148c1565b6134af6001600160e01b0392838316601b0b9260e01d938160e01d9116601b0b8484614037565b90637ffffff582136134ff575b906134c691614280565b92909215806134f7575b6134d957505090565b6044925060405191638eba4d0760e01b835260048301526024820152fd5b5082156134d0565b6135098282614f20565b156134bc57604483856040519163d556b11160e01b835260048301526024820152fd5b611a3691610bd2916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b614486565b611a3691610bd2916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b61464a565b6135da91608081018261359c6135968351611faa565b51611faa565b526135d36135cd6001600160a01b038094515116936135c46135be8551611faa565b51611f6d565b51169251611faa565b51611f8a565b5191612e0a565b5050565b906080810191806135f26135968551611f9a565b526001600160a01b0380925151169161360e6135be8551611f9a565b511661361d6135cd8551611f9a565b5190816136b85761362d8361343e565b612978579183917f4cb6e22a3e7e651d7cf0376cff48f20f5007a54147777865be7f5f6c38c50f4a959361261e955f5260209060018252613683604094855f20835f528452855f20855f528452855f2054613556565b945f5260018252835f20905f528152825f20915f52525f20555b51604051918291338352604060208401526040830190612fee565b916136e9917f4cb6e22a3e7e651d7cf0376cff48f20f5007a54147777865be7f5f6c38c50f4a959361261e956128cd565b505061369d565b90604082019082526020606081936040838201528551809452019301915f5b82811061371d575050505090565b83518552938101939281019260010161370f565b60c0810151908151915f926138a5575b506137e66020918281510151926001600160a01b039081818187511696015116928660a082019485518252308452604097888320898686510151015160808601518b519161378e83611997565b8683528c519361379d85611997565b8785528d51966137ac8861195e565b8752898701528c86015260016060860152608085015260a084015260c08301528851808099819463d04dfe2360e01b83526004830161304a565b03915afa94851561389b57879561387d575b508451613809575b50505050505050565b81905101510151169051813b156138795791849184938361383e965180978195829463012c676d60e21b8452600484016136f0565b03925af19081156138705750613859575b8080808080613800565b613863829161194a565b61386d578061384f565b80fd5b513d84823e3d90fd5b8480fd5b6138929195503d8089833e612b7481836119b3565b9050935f6137f8565b86513d89823e3d90fd5b6001600160a01b03602080845101510151169060a083015190823b15610182576138e8925f928360405180968195829463012c676d60e21b8452600484016136f0565b03925af1801561022c57156137415761390291925061194a565b5f905f613741565b6080810161391b6135cd8251611f9a565b5191821561392857505050565b6139426135be6001600160a01b0380935151169351611f9a565b5116815f5260209160018352604092835f20835f528152835f20855f528152835f2054936001600160e01b03851661397d575b505050505050565b6139a1955f9284845260018152828420868552815282842091845252812055612e68565b5f808080613975565b81156139b4570490565b634e487b7160e01b5f52601260045260245ffd5b6040815110613a10576020810151908051603f1981019081116128a75760051c82116139fc5760016020920160051b010190565b5050604051613a0a81611997565b5f815290565b50604051613a0a81611997565b805115613a2d57602001515f1a90565b505f90565b905f8091602081519101845af48080613ab0575b15613a665750506040513d81523d5f602083013e60203d82010160405290565b15613a8d57604051639996b31560e01b81526001600160a01b039091166004820152602490fd5b3d15613a9e576040513d5f823e3d90fd5b60405163d6bda27560e01b8152600490fd5b503d151580613a465750813b1515613a46565b60041115613acd57565b634e487b7160e01b5f52602160045260245ffd5b602090939291936001600160a01b036040820195168152613b0183613ac3565b0152565b613b0d61500e565b6040805163b7bad1b160e01b81526001600160a01b0383166004820152909182826024815f73200e12d10bb0c5e4a17e7018f0f1161919bb93895af1928315613bdb575f925f94613ba6575b50613b6383613ac3565b600183141580613b94575b613b785750505090565b5163ee07877f60e01b81529182916106df919060048401613ae1565b50613b9e83613ac3565b821515613b6e565b90809450613bca9293503d8511613bd4575b613bc281836119b3565b810190614916565b919091925f613b59565b503d613bb8565b513d5f823e3d90fd5b613bec61500e565b60408051630782d7e160e01b81526001600160a01b03831660048201529091828260248173200e12d10bb0c5e4a17e7018f0f1161919bb93895afa928315613bdb575f925f94613ba65750613b6383613ac3565b90805191613c4d83611a97565b91613c68604094613c60865195866119b3565b808552611a97565b601f199460209186013686840137835183519095908015613e67576001613cbe9101965b6001978891010197613cb5613ca08a611a97565b99613cad86519b8c6119b3565b808b52611a97565b01848901612204565b85805f9684516002815233878201523086820152606081018652613ce18b611f6d565b52613ceb8a611f6d565b505f925b613e23575b5050508351613d07575b50505050505090565b85809598979692980181613d1b8289611fca565b52613d268188611fca565b505f925b613d39575b5085969750613cfe565b8451831015613e1e576001600160a01b03613db081613d588689611fca565b51511686613d66878a611fca565b51015187815160051b9101207f19457468657265756d205369676e6564204d6573736167653a0a3332000000005f52601c52603c5f208c613da7888b611fca565b51015191614a9a565b15613e0657868098999a928192613dc7878a611fca565b515116613dd48787611fca565b52019385613de28289611fca565b510151613def868c611fca565b52613dfa858b611fca565b50019290989796613d2a565b8951630a57f30960e31b815260048101859052602490fd5b613d2f565b9091968151881015613e5e578280910197613e3e8184611fca565b51613e498a8d611fca565b52613e54898c611fca565b5001919081613cef565b96829150613cf4565b50613cbe5f96613c8c565b9091939284158215175f14613e8c5750505090505f905f90565b82810192600160fd1b8082019083011760fe1c613fc3575b5050613eaf81614be5565b93613eb981614be5565b94613ec48682614c05565b90918215613fb4575f9083986f0785ee10d5da46d900f436a000000000808611613fa6575b50670de0b6b3a7640000808b11613f97575b50633b9aca00808b11613f88575b50612710808b11613f7a575b5098805b613f695750819061189e989982600a0a9109960195817fcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccd0a93838211900382610100031b9203901c170291614c18565b60019290920191600a900480613f19565b60049a04998a930192613f15565b600991939a049901915f613f09565b601291939a049901915f613efb565b85049950602592505f613ee9565b5092905061189e949550614c18565b5f82121561401757808413614009575b7f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb2841315613ea45790925061189e939491614b23565b90925061189e939491614b8a565b80841215613fd35790925061189e939491614b23565b6134c68282614280565b9290918061405d576044848460405191637a97930f60e01b835260048301526024820152fd5b90919280155f1461407257505050505f905f90565b61408b9361407f91614cd2565b92919490938492614cd2565b909391928461409988614be5565b916140a386614be5565b947f161bcca7119915b50764b4abe86529797775a5f171951000000000000000000094604c9186881061424a575b030191600160ff1b98838a018112155f14614217575050035b5f955f82128061420e575b6141f0575b5f8112806141de575b6141c05786820103966001600160ff1b03881490816141b6575b50806141ad575b806141a4575b61418657509061413a9291614e7e565b915f811361414d575b5061189e93614c18565b9091604c821361417b5761416491600a0a906139aa565b908115614171575f614143565b505050505f905f90565b50505050505f905f90565b876044916040519163d556b11160e01b835260048301526024820152fd5b505f851261412a565b50828414614124565b905088145f61411d565b604489836040519163d556b11160e01b835260048301526024820152fd5b50806001600160ff1b03018213614103565b95508087018613156142085786818703015b956140fa565b5f614202565b505f81136140f5565b89985090920390506001600160ff1b038190038701821361423b57018601946140ea565b5050505050505050505f905f90565b7f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee80000000000000000009650604b92506140d1565b81156139b4570590565b8082601b82810b8314614475577d90e40fbeea1d3a4abc8955e946fe31cdcf66f634e10000000000000000008405614421575b8380820b0361441057507b199999999999999999999999999999999999999999999999999999987b0ccccccccccccccccccccccccccccccccccccccccccccccccccccccc840111156143c1575b838060030b03614345575b8084136143295750506001600160e01b036001925b60e01b91161791565b8303600a0a80156139b4576001600160e01b0391071592614320565b92915f84131561439557509061435b8383614f20565b61437757637ffffffe1901600a0a810290637fffffff9261430b565b506044916040519163d556b11160e01b835260048301526024820152fd5b637fffffff19928303906043821361417b576143b491600a0a90614276565b918215614171579261430b565b5f198401808060030b146143d55750614300565b90506001600160e01b039293507b7fffffffffffffffffffffffffffffffffffffffffffffffffffffff915060e01b9260ff1d181617905f90565b600190940193600a909305926142b3565b937f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee8000000000000000000840515614462576305f5e100600894058094819201955b9150506142b3565b620186a06005940580948192019561445a565b508261430057505050505f90600190565b919291600160ff1b840161449e5761189e9350614f39565b9061189e935f039161464a565b919291600160ff1b91908015806146385750906144c791614cd2565b9490929091905f86858585828213801561462f575b614612575b505050508682841860ff1c94860391039081604c0381116145f75701600a0a8082059190846145dd575b505081019182821860ff1c11156145d557826001600160ff1b03146145b757905f600192135f1461458857600a9004915b01925b8115811761454c57509190565b80614565575b50801561455d579190565b505f91508190565b919261457b9203600160ff1b01600a0a90614276565b600160ff1b91905f614552565b600a60037fe666666666666666666666666666666666666666666666666666666666666667920104019161453c565b604490836040519163d556b11160e01b835260048301526024820152fd5b50909261453f565b81076145ea575b8061450b565b60ff1d600117015f6145e4565b505050919350614605579190565b60018160ff1d1790039190565b5f9a50909750909550600160ff1b945092509050868080806144e1565b50835f126144dc565b156146435750509190565b9350919050565b939291938415811581811761479b5750509061466591614cd2565b919490829561467682958294614cd2565b8096929491969387868482138015614792575b614779575b5050505050508682841860ff1c94860391039081604c0381116145f75701600a0a80820591908461475f575b505081019182821860ff1c111561475757826001600160ff1b03146145b757905f600192135f1461472857600a9004915b01925b811581176146fb57509190565b8061470b5750801561455d579190565b600160ff1b936147229291038401600a0a90614276565b5f614552565b600a60037fe66666666666666666666666666666666666666666666666666666666666666792010401916146eb565b5090926146ee565b810761476c575b806146ba565b60ff1d600117015f614766565b929b5098509196509450925090505f808080808061468e565b50858412614689565b93959390929190156147b157505061455d579190565b945092915050565b6008815110613a2d576008015167ffffffffffffffff1667ff0a89c674ee78741490565b9160408301926040614817610bd2606087519401938451906001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b613e72565b94519301614826815186612800565b61482e575050565b909350611a3691925051925183613488565b92915f9060018184145f871287151717176148ba575f928082136148ac575b03604c81135f8212176148a057600a0a908461487e8382029384614276565b146148935750501561488f575f9190565b5f90565b9093509015611a36579190565b50501561488f575f9190565b5f956001945092509061485f565b5050505f90565b93929190918083145f83125f87121883158715171717614910575f928082136149035703604c81135f8212176148a057600a0a908461487e8382029384614276565b919460019350919061485f565b50919050565b919082604091031261018257815160048110156101825760209092015160ff811681036101825790565b91925f831215614968576044838360405191634a7d166b60e01b835260048301526024820152fd5b91928361497a57505090505f90600190565b60ff8116820191808312614a42575f8312156149b2575050604c19811261455d575f03600a0a916149ab83826139aa565b9283021490565b909293915f81135f14614a3857604d8113614a0d57600a0a9283156139b457835f190483116149e45750500290600190565b60405163c849483b60e01b815260048101849052602481019290925260ff166044820152606490fd5b5060405163c849483b60e01b81526004810192909252602482015260ff919091166044820152606490fd5b5050905090600190565b60405163c849483b60e01b815260048101869052602481019190915260ff82166044820152606490fd5b9060ff165f03916001600160ff1b0382115f14614a9257600a6001818404940192061590565b909190600190565b9091813b614ad557614aac9192615077565b50614ab681613ac3565b159182614ac257505090565b6001600160a01b03918216911614919050565b6020918160645f935160405192630b135d3f60e11b9788855260048501526040602485015286820190604485015e8281018201859052601f01601f191601915afa905f5114601f3d11161690565b909392915f614b33918184613e72565b9490945f8483019182019412159081614b80575b8115614b76575b50614b5857505090565b604492506040519163d556b11160e01b835260048301526024820152fd5b905083125f614b4e565b8281129150614b47565b614b9f93600160fe1b90810193920190613e72565b9081815f821215614bd6575050604b1982126128ee57614bc4915f03600a0a90614276565b9081614bce575f90565b600160ff1b90565b93600160ff1b90910192509050565b5f811215611a3657600160ff1b90808203614bfe575090565b90505f0390565b905f198183099102908180821091030391565b92939291905f8184181215614cad576001600160ff1b039283831115614c9757600160ff1b93838503614c4d57505050509190565b90919293508514614c67575050600a600191045f03920190565b604051630ed8062160e21b8152600481019190915260248101919091526044810182905260648101849052608490fd5b5090915050600160ff1b81146128a7575f039190565b90916001600160ff1b038084111561286f578514614c67575050600a60019104920190565b9190918015614e7457827f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee800000000000000000080830515614d82575b507f19999999999999999999999999999999999999999999999999999999999999997f0ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc830110614d73575b8313614d5d5791905f90565b919060018060ff1b926001600160ff1b03030190565b9290600a02905f190192614d51565b6f4b3b4ca85a86c47a098a22400000000080840515614e62575b507728c87cb5c89a2571ebfdcb54864ada834a00000000000000830515614e4b575b7b097edd871cfda3a5697758bf0e3cbb5ac5741c640000000000000000830515614e37575b7e3899162693736ac531a5a58f1fbb4b746504382ca7e4000000000000000000830515614e2757820515614e18575b5f614d06565b9290600a02905f190192614e12565b9391606402916001190193614de3565b93916402540be40002916009190193614de3565b9391678ac7230489e8000002916012190193614dbe565b6025198301955092909202915f614d9c565b505f915081908190565b90915f198383099280830292838086109503948086039584871015614efc5714614ef4579082910960018219018216809204600280826003021880830282030280830282030280830282030280830282030280830282030280920290030293600183805f03040190848311900302920304170290565b505091500490565b60648386866040519263362ced0960e11b8452600484015260248301526044820152fd5b611a3691905f811215614f34575f036150b1565b6150b1565b909291600160ff1b91828101614fcb5750808414614fc157808413918215614fb9578185035b604c811115614fa85750505f915b15614f9957507f8000000000000000000000000000000000000000000000000000000000000001019190565b92506001600160ff1b03039190565b600a0a9081156139b4570491614f6d565b848203614f5f565b505090505f905f90565b93614fd892945f036144ab565b80939180928114614fec575b50505f039190565b915092506001600160ff1b0383146145b757600a600191059201915f80614fe4565b73200e12d10bb0c5e4a17e7018f0f1161919bb9389803b15801561504c575b6150345750565b602490604051906373e6d7b360e01b82526004820152fd5b507f1de7d717526cba131d684e312dedbf0852adef9cced9e36798ae4937f7145d41813f141561502d565b81519190604183036150a7576150a09250602082015190606060408401519301515f1a90615140565b9192909190565b50505f9160029190565b90637ffffff581131561513a57637ffffffe1981019060438213615133575f82121561510757637fffffff91505f0301600a0a7b8000000000000000000000000000000000000000000000000000000202111590565b50600a0a80156139b4577b80000000000000000000000000000000000000000000000000000001041090565b5050151590565b50505f90565b91907f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a084116151b7579160209360809260ff5f9560405194855216868401526040830152606082015282805260015afa1561022c575f516001600160a01b038116156151ad57905f905f90565b505f906001905f90565b5050505f916003919056000000000000000000000000000000000000000000000000000000000000000000000000000000000000200e12d10bb0c5e4a17e7018f0f1161919bb93890000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000044b608060405234801561000f575f80fd5b506004361061004a575f3560e01c80630782d7e11461004e57806354636d2b14610078578063b7bad1b11461009d578063f5c36eaf146100b0575b5f80fd5b61006161005c366004610363565b6100c3565b60405161006f929190610403565b60405180910390f35b61008b610086366004610363565b6100d8565b60405160ff909116815260200161006f565b6100616100ab366004610363565b6100e9565b61008b6100be366004610363565b6100f5565b5f806100cf5f84610100565b91509150915091565b5f6100e35f836101f0565b92915050565b5f806100cf5f84610281565b5f6100e35f83610356565b73ffffffffffffffffffffffffffffffffffffffff81165f9081526020838152604080832081518083019092525460ff8082161515835261010090910416818301527f313ce56700000000000000000000000000000000000000000000000000000000808452839283908190816004818a5afa915060203d1015610182575f91505b811561019857505f5160ff811115610198575f91505b816101af57505050602001516003925090506101e9565b83516101c3575f955093506101e992505050565b836020015160ff1681146101d85760026101db565b60015b846020015195509550505050505b9250929050565b5f805f6101fd8585610281565b909250905060018260038111156102165761021661039d565b1415801561023557505f8260038111156102325761023261039d565b14155b156102795783826040517fee07877f000000000000000000000000000000000000000000000000000000008152600401610270929190610421565b60405180910390fd5b949350505050565b5f805f8061028f8686610100565b90925090505f8260038111156102a7576102a761039d565b0361034b576040805180820182526001815260ff838116602080840191825273ffffffffffffffffffffffffffffffffffffffff8a165f908152908b9052939093209151825493517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00009094169015157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff161761010093909116929092029190911790555b909590945092505050565b5f805f6101fd8585610100565b5f60208284031215610373575f80fd5b813573ffffffffffffffffffffffffffffffffffffffff81168114610396575f80fd5b9392505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b600481106103ff577f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b9052565b6040810161041182856103ca565b60ff831660208301529392505050565b73ffffffffffffffffffffffffffffffffffffffff831681526040810161039660208301846103ca560000000000000000000000000000000000000000000000000000000000000000006e2d0e71d900474b262e545bc4c98b71ab368d2100000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000003d486080604052600436106100d65760003560e01c80638456cb591161007f5780639a1f3406116100595780639a1f340614610200578063cd0fb7a714610220578063f2fde38b14610260578063fa461e331461028057600080fd5b80638456cb59146101ad5780638da5cb5b146101c257806393b3774c146101ed57600080fd5b80632c8958f6116100b05780632c8958f6146100f95780636b2ace871461013f578063715018a61461019857600080fd5b8063046f7da2146100e257806323a69e75146100f95780632646478b1461011957600080fd5b366100dd57005b600080fd5b3480156100ee57600080fd5b506100f76102a0565b005b34801561010557600080fd5b506100f7610114366004613579565b6103a8565b61012c6101273660046136f5565b6103ba565b6040519081526020015b60405180910390f35b34801561014b57600080fd5b506101737f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610136565b3480156101a457600080fd5b506100f7610564565b3480156101b957600080fd5b506100f7610578565b3480156101ce57600080fd5b5060005473ffffffffffffffffffffffffffffffffffffffff16610173565b61012c6101fb36600461377c565b61067b565b34801561020c57600080fd5b506100f761021b36600461382f565b61089a565b34801561022c57600080fd5b5061025061023b366004613868565b60016020526000908152604090205460ff1681565b6040519015158152602001610136565b34801561026c57600080fd5b506100f761027b366004613868565b6108f8565b34801561028c57600080fd5b506100f761029b366004613579565b6109af565b60005473ffffffffffffffffffffffffffffffffffffffff163314806102d557503360009081526001602052604090205460ff165b610366576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f52503a2063616c6c6572206973206e6f7420746865206f776e6572206f72206160448201527f2070726976696c6567656420757365720000000000000000000000000000000060648201526084015b60405180910390fd5b600280547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff167501000000000000000000000000000000000000000000179055565b6103b4848484846109af565b50505050565b60025460009074010000000000000000000000000000000000000000900460ff16600114610444576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f526f75746550726f636573736f72206973206c6f636b65640000000000000000604482015260640161035d565b6002547501000000000000000000000000000000000000000000900460ff166001146104cc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f526f75746550726f636573736f72206973207061757365640000000000000000604482015260640161035d565b600280547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff1674020000000000000000000000000000000000000000179055610519878787878787610b5d565b9050600280547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff16740100000000000000000000000000000000000000001790559695505050505050565b61056c6111a3565b6105766000611224565b565b60005473ffffffffffffffffffffffffffffffffffffffff163314806105ad57503360009081526001602052604090205460ff165b610639576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f52503a2063616c6c6572206973206e6f7420746865206f776e6572206f72206160448201527f2070726976696c65676564207573657200000000000000000000000000000000606482015260840161035d565b600280547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff167502000000000000000000000000000000000000000000179055565b60025460009074010000000000000000000000000000000000000000900460ff16600114610705576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f526f75746550726f636573736f72206973206c6f636b65640000000000000000604482015260640161035d565b6002547501000000000000000000000000000000000000000000900460ff1660011461078d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f526f75746550726f636573736f72206973207061757365640000000000000000604482015260640161035d565b600280547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff1674020000000000000000000000000000000000000000179055604051600090819073ffffffffffffffffffffffffffffffffffffffff8c16908b908381818185875af1925050503d8060008114610826576040519150601f19603f3d011682016040523d82523d6000602084013e61082b565b606091505b50915091508161083d57805181602001fd5b61084b898989898989610b5d565b92505050600280547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff167401000000000000000000000000000000000000000017905598975050505050505050565b6108a26111a3565b73ffffffffffffffffffffffffffffffffffffffff91909116600090815260016020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016911515919091179055565b6109006111a3565b73ffffffffffffffffffffffffffffffffffffffff81166109a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f6464726573730000000000000000000000000000000000000000000000000000606482015260840161035d565b6109ac81611224565b50565b60025473ffffffffffffffffffffffffffffffffffffffff163314610a56576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603e60248201527f526f75746550726f636573736f722e756e697377617056335377617043616c6c60448201527f6261636b3a2063616c6c2066726f6d20756e6b6e6f776e20736f757263650000606482015260840161035d565b6000808513610a655783610a67565b845b905060008113610af9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603960248201527f526f75746550726f636573736f722e756e697377617056335377617043616c6c60448201527f6261636b3a206e6f7420706f73697469766520616d6f756e7400000000000000606482015260840161035d565b600280547fffffffffffffffffffffffff00000000000000000000000000000000000000001660011790556000610b3283850185613868565b9050610b5573ffffffffffffffffffffffffffffffffffffffff82163384611299565b505050505050565b60008073ffffffffffffffffffffffffffffffffffffffff881673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee14610c24576040517f70a0823100000000000000000000000000000000000000000000000000000000815233600482015273ffffffffffffffffffffffffffffffffffffffff8916906370a0823190602401602060405180830381865afa158015610bfb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c1f919061388c565b610c27565b60005b9050600073ffffffffffffffffffffffffffffffffffffffff871673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee14610cf1576040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff86811660048301528816906370a0823190602401602060405180830381865afa158015610cc8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cec919061388c565b610d0a565b8473ffffffffffffffffffffffffffffffffffffffff16315b905087600080610d2e87604080518082019091528181528151909101602082015290565b90505b805160208201511115610e84576000610d508280516001018051915290565b90508060ff1660011415610d7a576000610d6983611372565b905083610d74578094505b50610e73565b8060ff1660021415610d9557610d90828d611437565b610e73565b8060ff1660031415610dac576000610d6983611457565b8060ff1660041415610dc157610d908261147d565b8060ff1660051415610dd657610d90826114a3565b8060ff1660061415610dec57610d908d836115a8565b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f526f75746550726f636573736f723a20556e6b6e6f776e20636f6d6d616e642060448201527f636f646500000000000000000000000000000000000000000000000000000000606482015260840161035d565b610e7c836138d4565b925050610d31565b506000905073ffffffffffffffffffffffffffffffffffffffff8b1673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee14610f4d576040517f70a0823100000000000000000000000000000000000000000000000000000000815233600482015273ffffffffffffffffffffffffffffffffffffffff8c16906370a0823190602401602060405180830381865afa158015610f24573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f48919061388c565b610f50565b60005b905083610f5d8b8361390d565b1015610feb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602f60248201527f526f75746550726f636573736f723a204d696e696d616c20696e70757420626160448201527f6c616e63652076696f6c6174696f6e0000000000000000000000000000000000606482015260840161035d565b600073ffffffffffffffffffffffffffffffffffffffff8a1673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee146110b3576040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff89811660048301528b16906370a0823190602401602060405180830381865afa15801561108a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110ae919061388c565b6110cc565b8773ffffffffffffffffffffffffffffffffffffffff16315b90506110d8898561390d565b81101561111e576110e98482613925565b6040517f963b34a500000000000000000000000000000000000000000000000000000000815260040161035d91815260200190565b6111288482613925565b6040805173ffffffffffffffffffffffffffffffffffffffff8b81168252602082018790529181018c905260608101839052919750808c1691908e169033907f2db5ddd0b42bdbca0d69ea16f234a870a485854ae0d91f16643d6f317d8b89949060800160405180910390a450505050509695505050505050565b60005473ffffffffffffffffffffffffffffffffffffffff163314610576576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161035d565b6000805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60405173ffffffffffffffffffffffffffffffffffffffff831660248201526044810182905261136d9084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009093169290921790915261163b565b505050565b6000806113858380516014018051915290565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015290915073ffffffffffffffffffffffffffffffffffffffff8216906370a0823190602401602060405180830381865afa1580156113f2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611416919061388c565b91508115611425576001820391505b61143183308385611747565b50919050565b60006114498380516014018051915290565b905061136d83338385611747565b47611478823073eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee84611747565b919050565b600061148f8280516014018051915290565b905061149f8260008360006117a2565b5050565b60006114b58280516014018051915290565b6040517ff7888aec00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff80831660048301523060248301529192506000917f0000000000000000000000000000000000000000000000000000000000000000169063f7888aec90604401602060405180830381865afa15801561154d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611571919061388c565b9050801561159c577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff015b61136d83308484611747565b60006115ba8280516020018051915290565b905060006115ce8380516020018051915290565b905060006115e28480516001018051915290565b905060006115f68580516020018051915290565b9050600061160a8680516020018051915290565b905061163273ffffffffffffffffffffffffffffffffffffffff8816333088888888886118d6565b50505050505050565b600061169d826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16611b569092919063ffffffff16565b80519091501561136d57808060200190518101906116bb919061393c565b61136d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f74207375636365656400000000000000000000000000000000000000000000606482015260840161035d565b60006117598580516001018051915290565b905060005b8160ff16811015610b5557600061177b8780516002018051915290565b61ffff8082168602049485900394909150611798888888846117a2565b505060010161175e565b60006117b48580516001018051915290565b905060ff81166117cf576117ca85858585611b6d565b6118cf565b8060ff16600114156117e7576117ca85858585611f22565b8060ff16600214156117ff576117ca85858585612162565b8060ff1660031415611817576117ca85858585612410565b8060ff166004141561182f576117ca85858585612a98565b8060ff1660051415611847576117ca85858585612c26565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f526f75746550726f636573736f723a20556e6b6e6f776e20706f6f6c2074797060448201527f6500000000000000000000000000000000000000000000000000000000000000606482015260840161035d565b5050505050565b6040517f7ecebe0000000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8881166004830152600091908a1690637ecebe0090602401602060405180830381865afa158015611946573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061196a919061388c565b6040517fd505accf00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8a811660048301528981166024830152604482018990526064820188905260ff8716608483015260a4820186905260c48201859052919250908a169063d505accf9060e401600060405180830381600087803b158015611a0457600080fd5b505af1158015611a18573d6000803e3d6000fd5b50506040517f7ecebe0000000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8b81166004830152600093508c169150637ecebe0090602401602060405180830381865afa158015611a8b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611aaf919061388c565b9050611abc82600161390d565b8114611b4a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f5361666545524332303a207065726d697420646964206e6f742073756363656560448201527f6400000000000000000000000000000000000000000000000000000000000000606482015260840161035d565b50505050505050505050565b6060611b6584846000856131e1565b949350505050565b6000611b7f8580516014018051915290565b90506000611b938680516001018051915290565b90506000611ba78780516014018051915290565b90506000611bbb8880516003018051915290565b905073ffffffffffffffffffffffffffffffffffffffff8716301415611c0157611bfc73ffffffffffffffffffffffffffffffffffffffff87168587611299565b611c41565b73ffffffffffffffffffffffffffffffffffffffff8716331415611c4157611c4173ffffffffffffffffffffffffffffffffffffffff87163386886132fa565b6000808573ffffffffffffffffffffffffffffffffffffffff16630902f1ac6040518163ffffffff1660e01b8152600401606060405180830381865afa158015611c8f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cb39190613977565b506dffffffffffffffffffffffffffff1691506dffffffffffffffffffffffffffff169150600082118015611ce85750600081115b611d4e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f57726f6e6720706f6f6c20726573657276657300000000000000000000000000604482015260640161035d565b6000808660ff16600114611d63578284611d66565b83835b6040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8b8116600483015292945090925083918c16906370a0823190602401602060405180830381865afa158015611dda573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611dfe919061388c565b611e089190613925565b98506000611e1986620f42406139c7565b611e289062ffffff168b6139eb565b9050600081611e3a85620f42406139eb565b611e44919061390d565b611e4e84846139eb565b611e589190613a28565b90506000808a60ff16600114611e7057826000611e74565b6000835b604080516000815260208101918290527f022c0d9f00000000000000000000000000000000000000000000000000000000909152919350915073ffffffffffffffffffffffffffffffffffffffff8d169063022c0d9f90611ede90859085908f9060248101613ad9565b600060405180830381600087803b158015611ef857600080fd5b505af1158015611f0c573d6000803e3d6000fd5b5050505050505050505050505050505050505050565b6000611f348580516014018051915290565b9050600080611f498780516001018051915290565b60ff161190506000611f618780516014018051915290565b905073ffffffffffffffffffffffffffffffffffffffff8616331415611fa357611fa373ffffffffffffffffffffffffffffffffffffffff86163330876132fa565b600280547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff851690811790915563128acb088284878161201757612012600173fffd8963efd1fc6a506488495d951d5263988d26613b14565b612027565b6120276401000276a36001613b41565b6040805173ffffffffffffffffffffffffffffffffffffffff8d166020820152016040516020818303038152906040526040518663ffffffff1660e01b8152600401612077959493929190613b79565b60408051808303816000875af1158015612095573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120b99190613bc0565b505060025473ffffffffffffffffffffffffffffffffffffffff16600114611632576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f526f75746550726f636573736f722e73776170556e6956333a20756e6578706560448201527f6374656400000000000000000000000000000000000000000000000000000000606482015260840161035d565b60006121748580516001018051915290565b905060006121888680516014018051915290565b9050600180831614156122575760006121a78780516014018051915290565b905060028316612213578073ffffffffffffffffffffffffffffffffffffffff1663d0e30db0856040518263ffffffff1660e01b81526004016000604051808303818588803b1580156121f957600080fd5b505af115801561220d573d6000803e3d6000fd5b50505050505b73ffffffffffffffffffffffffffffffffffffffff821630146122515761225173ffffffffffffffffffffffffffffffffffffffff82168386611299565b50610b55565b600282166123205773ffffffffffffffffffffffffffffffffffffffff851633141561229f5761229f73ffffffffffffffffffffffffffffffffffffffff85163330866132fa565b6040517f2e1a7d4d0000000000000000000000000000000000000000000000000000000081526004810184905273ffffffffffffffffffffffffffffffffffffffff851690632e1a7d4d90602401600060405180830381600087803b15801561230757600080fd5b505af115801561231b573d6000803e3d6000fd5b505050505b60008173ffffffffffffffffffffffffffffffffffffffff168460405160006040518083038185875af1925050503d806000811461237a576040519150601f19603f3d011682016040523d82523d6000602084013e61237f565b606091505b5050905080611632576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603760248201527f526f75746550726f636573736f722e777261704e61746976653a204e6174697660448201527f6520746f6b656e207472616e73666572206661696c6564000000000000000000606482015260840161035d565b60006124228580516001018051915290565b905060006124368680516014018051915290565b905060ff8216156128315773ffffffffffffffffffffffffffffffffffffffff85163014156124a5576124a073ffffffffffffffffffffffffffffffffffffffff85167f000000000000000000000000000000000000000000000000000000000000000085611299565b61275b565b73ffffffffffffffffffffffffffffffffffffffff8516331415612505576124a073ffffffffffffffffffffffffffffffffffffffff8516337f0000000000000000000000000000000000000000000000000000000000000000866132fa565b6040517f4ffe34db00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85811660048301527f00000000000000000000000000000000000000000000000000000000000000001690634ffe34db906024016040805180830381865afa158015612590573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125b49190613c04565b516040517fdf23b45b00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff86811660048301526fffffffffffffffffffffffffffffffff909216917f0000000000000000000000000000000000000000000000000000000000000000169063df23b45b90602401606060405180830381865afa158015612656573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061267a9190613c77565b60409081015190517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000811660048301526fffffffffffffffffffffffffffffffff909216918716906370a0823190602401602060405180830381865afa158015612720573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612744919061388c565b61274e919061390d565b6127589190613925565b92505b6040517f02b9446c00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85811660048301527f000000000000000000000000000000000000000000000000000000000000000081166024830181905290831660448301526064820185905260006084830152906302b9446c9060a40160408051808303816000875af1158015612806573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061282a9190613bc0565b5050610b55565b73ffffffffffffffffffffffffffffffffffffffff851615612908576040517ff18d03cc00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85811660048301528681166024830152306044830152606482018590527f0000000000000000000000000000000000000000000000000000000000000000169063f18d03cc90608401600060405180830381600087803b1580156128eb57600080fd5b505af11580156128ff573d6000803e3d6000fd5b505050506129c1565b6040517ff7888aec00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85811660048301523060248301527f0000000000000000000000000000000000000000000000000000000000000000169063f7888aec90604401602060405180830381865afa15801561299a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129be919061388c565b92505b6040517f97da6d3000000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8581166004830152306024830152828116604483015260006064830152608482018590527f000000000000000000000000000000000000000000000000000000000000000016906397da6d309060a40160408051808303816000875af1158015612a6a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a8e9190613bc0565b5050505050505050565b6000612aaa8580516014018051915290565b85516020808201805190920101875290915073ffffffffffffffffffffffffffffffffffffffff851615612b91576040517ff18d03cc00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff858116600483015286811660248301528381166044830152606482018590527f0000000000000000000000000000000000000000000000000000000000000000169063f18d03cc90608401600060405180830381600087803b158015612b7857600080fd5b505af1158015612b8c573d6000803e3d6000fd5b505050505b6040517f627dd56a00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff83169063627dd56a90612be3908490600401613ce3565b6020604051808303816000875af1158015612c02573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611632919061388c565b6000612c388580516014018051915290565b90506000612c4c8680516001018051915290565b90506000612c608780516001018051915290565b60000b90506000612c778880516001018051915290565b60000b90506000612c8e8980516014018051915290565b90506000612ca28a80516014018051915290565b9050600073ffffffffffffffffffffffffffffffffffffffff891673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee1415612d8b576040517f3df02124000000000000000000000000000000000000000000000000000000008152600f86810b600483015285900b6024820152604481018990526000606482015273ffffffffffffffffffffffffffffffffffffffff881690633df02124908a9060840160206040518083038185885af1158015612d5f573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190612d84919061388c565b905061306e565b73ffffffffffffffffffffffffffffffffffffffff8a16331415612dcb57612dcb73ffffffffffffffffffffffffffffffffffffffff8a1633308b6132fa565b612dec73ffffffffffffffffffffffffffffffffffffffff8a16888a613358565b5060ff8616612e9f576040517f3df02124000000000000000000000000000000000000000000000000000000008152600f86810b600483015285900b6024820152604481018990526000606482015273ffffffffffffffffffffffffffffffffffffffff881690633df02124906084016020604051808303816000875af1158015612e7b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d84919061388c565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015260009073ffffffffffffffffffffffffffffffffffffffff8416906370a0823190602401602060405180830381865afa158015612f0c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f30919061388c565b6040517f3df02124000000000000000000000000000000000000000000000000000000008152600f88810b600483015287900b6024820152604481018b90526000606482015290915073ffffffffffffffffffffffffffffffffffffffff891690633df0212490608401600060405180830381600087803b158015612fb457600080fd5b505af1158015612fc8573d6000803e3d6000fd5b50506040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201526000925073ffffffffffffffffffffffffffffffffffffffff861691506370a0823190602401602060405180830381865afa158015613039573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061305d919061388c565b90506130698282613925565b925050505b73ffffffffffffffffffffffffffffffffffffffff831630146131d45773ffffffffffffffffffffffffffffffffffffffff821673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee14156131b35760008373ffffffffffffffffffffffffffffffffffffffff168260405160006040518083038185875af1925050503d8060008114613117576040519150601f19603f3d011682016040523d82523d6000602084013e61311c565b606091505b50509050806131ad576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603660248201527f526f75746550726f636573736f722e7377617043757276653a204e617469766560448201527f20746f6b656e207472616e73666572206661696c656400000000000000000000606482015260840161035d565b506131d4565b6131d473ffffffffffffffffffffffffffffffffffffffff83168483611299565b5050505050505050505050565b606082471015613273576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c0000000000000000000000000000000000000000000000000000606482015260840161035d565b6000808673ffffffffffffffffffffffffffffffffffffffff16858760405161329c9190613cf6565b60006040518083038185875af1925050503d80600081146132d9576040519150601f19603f3d011682016040523d82523d6000602084013e6132de565b606091505b50915091506132ef87838387613389565b979650505050505050565b60405173ffffffffffffffffffffffffffffffffffffffff808516602483015283166044820152606481018290526103b49085907f23b872dd00000000000000000000000000000000000000000000000000000000906084016112eb565b6000613365848484613426565b80611b65575061337784846000613426565b8015611b655750611b65848484613426565b6060831561341c5782516134155773ffffffffffffffffffffffffffffffffffffffff85163b613415576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640161035d565b5081611b65565b611b658383613535565b6040805173ffffffffffffffffffffffffffffffffffffffff8481166024830152604480830185905283518084039091018152606490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f095ea7b300000000000000000000000000000000000000000000000000000000179052915160009283928392918816916134bf9190613cf6565b6000604051808303816000865af19150503d80600081146134fc576040519150601f19603f3d011682016040523d82523d6000602084013e613501565b606091505b509150915081801561352b57508051158061352b57508080602001905181019061352b919061393c565b9695505050505050565b8151156135455781518083602001fd5b806040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161035d9190613ce3565b6000806000806060858703121561358f57600080fd5b8435935060208501359250604085013567ffffffffffffffff808211156135b557600080fd5b818701915087601f8301126135c957600080fd5b8135818111156135d857600080fd5b8860208285010111156135ea57600080fd5b95989497505060200194505050565b73ffffffffffffffffffffffffffffffffffffffff811681146109ac57600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600082601f83011261365b57600080fd5b813567ffffffffffffffff808211156136765761367661361b565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f011681019082821181831017156136bc576136bc61361b565b816040528381528660208588010111156136d557600080fd5b836020870160208301376000602085830101528094505050505092915050565b60008060008060008060c0878903121561370e57600080fd5b8635613719816135f9565b9550602087013594506040870135613730816135f9565b9350606087013592506080870135613747816135f9565b915060a087013567ffffffffffffffff81111561376357600080fd5b61376f89828a0161364a565b9150509295509295509295565b600080600080600080600080610100898b03121561379957600080fd5b88356137a4816135f9565b97506020890135965060408901356137bb816135f9565b95506060890135945060808901356137d2816135f9565b935060a0890135925060c08901356137e9816135f9565b915060e089013567ffffffffffffffff81111561380557600080fd5b6138118b828c0161364a565b9150509295985092959890939650565b80151581146109ac57600080fd5b6000806040838503121561384257600080fd5b823561384d816135f9565b9150602083013561385d81613821565b809150509250929050565b60006020828403121561387a57600080fd5b8135613885816135f9565b9392505050565b60006020828403121561389e57600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613906576139066138a5565b5060010190565b60008219821115613920576139206138a5565b500190565b600082821015613937576139376138a5565b500390565b60006020828403121561394e57600080fd5b815161388581613821565b80516dffffffffffffffffffffffffffff8116811461147857600080fd5b60008060006060848603121561398c57600080fd5b61399584613959565b92506139a360208501613959565b9150604084015163ffffffff811681146139bc57600080fd5b809150509250925092565b600062ffffff838116908316818110156139e3576139e36138a5565b039392505050565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613a2357613a236138a5565b500290565b600082613a5e577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b60005b83811015613a7e578181015183820152602001613a66565b838111156103b45750506000910152565b60008151808452613aa7816020860160208601613a63565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b84815283602082015273ffffffffffffffffffffffffffffffffffffffff8316604082015260806060820152600061352b6080830184613a8f565b600073ffffffffffffffffffffffffffffffffffffffff838116908316818110156139e3576139e36138a5565b600073ffffffffffffffffffffffffffffffffffffffff808316818516808303821115613b7057613b706138a5565b01949350505050565b600073ffffffffffffffffffffffffffffffffffffffff8088168352861515602084015285604084015280851660608401525060a060808301526132ef60a0830184613a8f565b60008060408385031215613bd357600080fd5b505080516020909101519092909150565b80516fffffffffffffffffffffffffffffffff8116811461147857600080fd5b600060408284031215613c1657600080fd5b6040516040810181811067ffffffffffffffff82111715613c3957613c3961361b565b604052613c4583613be4565b8152613c5360208401613be4565b60208201529392505050565b805167ffffffffffffffff8116811461147857600080fd5b600060608284031215613c8957600080fd5b6040516060810181811067ffffffffffffffff82111715613cac57613cac61361b565b604052613cb883613c5f565b8152613cc660208401613c5f565b6020820152613cd760408401613be4565b60408201529392505050565b6020815260006138856020830184613a8f565b60008251613d08818460208701613a63565b919091019291505056fea26469706673582212201ff294929b57776d43429e47ba13e7bb550e4a27be6afbadf8c8a0d6ad6324b364736f6c634300080a0033000000000000000000000000000000000000000000000000"; + hex"0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000005280000000000000000000000000000000000000000000000000000000000000574000000000000000000000000050ad4ff129155d8f584deda447b11b4f5138840d000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000051b66080806040526004361015610012575f80fd5b5f3560e01c90816301ffc9a714611792575080631f69cb751461155c5780632cb77e9f146115305780632fbc4ba0146113ce57806341d1514f146113975780635cffe9de1461123b578063607461191461109f578063613255ab1461101c57806369c728561461072b578063709fb8a5146104375780639235084d146103e3578063ac9650d814610295578063d7e442ec14610237578063d9d98ce4146101865763fa501182146100c1575f80fd5b34610182576101403660031901126101825767ffffffffffffffff600435818111610182576100f4903690600401611b27565b6024358281116101825761010c903690600401611b27565b60c0366043190112610182576101043583811161018257610131903690600401611ccd565b90610124359384116101825761014e61015c943690600401611ccd565b926101576126bd565b612203565b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055005b5f80fd5b34610182576040366003190112610182576001600160a01b036101a7611816565b166040516370a0823160e01b8152306004820152602081602481855afa90811561022c575f916101fa575b50156101e25760206040515f8152f35b60249060405190633c5bf76960e21b82526004820152fd5b90506020813d602011610224575b8161021560209383611996565b810103126101825751826101d2565b3d9150610208565b6040513d5f823e3d90fd5b346101825760203660031901126101825760043567ffffffffffffffff81116101825761028f61026e61015c9236906004016117e5565b91906102786126bd565b604051926102858461197a565b5f84523691611da1565b90612bb1565b34610182576020806003193601126101825760043567ffffffffffffffff8111610182576102c79036906004016117e5565b9190604051926102d68461197a565b5f84528284016102e582611a7a565b946102f36040519687611996565b8286526102ff83611a7a565b9361031186880195601f1901866121e7565b5f5b84811061037557604080518881528951818a018190525f92600582901b83018101918a918c9085015b8287106103495785850386f35b909192938280610365600193603f198a820301865288516118a2565b960192019601959291909261033c565b806103c4886103be61039160019560059d9c9d1b8701876120c7565b929089846040519586938585013782018381015f81528b519283915e015f83820152038084520182611996565b30613a26565b6103ce828a611fad565b526103d98189611fad565b5001969596610313565b3461018257600319602036820112610182576004359067ffffffffffffffff82116101825760809082360301126101825761042260609160040161210f565b90604051921515835260208301526040820152f35b34610182576003196040368201126101825760043567ffffffffffffffff8082116101825760c08260040193833603011261018257602435908111610182576104849036906004016117e5565b61048f9291926126bd565b6104c06104bb6104b66104af6104a588806120fa565b60408101906120c7565b36916119b8565b6139bc565b613a11565b801561071957600110156107075760248201926104dd8486611f0a565b9050156106f55760448301936104f38587611f0a565b9050156106e3576105596105219561054d6105186105118a806120fa565b948a611f0a565b9890928a611f0a565b91909261053e60405196610534886118c6565b3388523690611a1c565b9960209a8b8801523691611a92565b60408501523691611a92565b606082015260648401356080820152610571816126ff565b90815f525f865260405f209485541595866105b5575b878760017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055604051908152f35b6001905560a46001600160a01b03917f87491344dfbcf91f6cbbc610cbbeedc85313d37a02df0c93527f7ea5f8db717f83855116604051908152868b82015260606040820152806106096060820188612015565b0390a10191610618838a6120c7565b905061063b575b50505061062e93949550612730565b8190838080808080610587565b6106486104af848b6120c7565b610651816147ad565b156106bc57509761068f7fd46c2c56b35c8210e9e712ec3f02242d5fc90187c0ac8ed80cc33626846ec369936106af9361062e999a9b5116926120c7565b92906040519384938452868c850152606060408501526060840191611cfc565b0390a1859493878061061f565b886106df604051928392630c89984b60e31b8452600484015260248301906118a2565b0390fd5b60405163540e5f0b60e01b8152600490fd5b604051636c44ef8f60e01b8152600490fd5b604051633c8270bd60e21b8152600490fd5b604051632cff108b60e21b8152600490fd5b34610182576003196020368201126101825767ffffffffffffffff600435116101825760c09060043536030112610182576107646126bd565b5f808061077960048035608481019101611e53565b90501561100a576024600435013592610791846127c0565b15610ff8576060806040516107a58161192e565b6107ad611ea8565b81525f60208201525f604082015201526107c5611ea8565b506108256108206107ff6107f56107ef6107e9608460043501600435600401611e53565b90611eda565b80611ef5565b6040810190611f0a565b60206108186107e9608460043501600435600401611e53565b013591611f40565b611ce8565b936001600160a01b0361087461082061085b6108516107ef6107e9608460043501600435600401611e53565b6060810190611f0a565b60406108186107e9608460043501600435600401611e53565b8160405197610882896118f6565b16875216602086015260408501526108a4608460043501600435600401611e53565b9490506001604051955f87520160051b85016040525f905f5b6108d1608460043501600435600401611e53565b9050811080610fe5575b15610e32576108f4608460043501600435600401611e53565b821015610e1e578160051b810135607e198236030181121561018257608081830136031261018257604051916109298361192e565b8181013567ffffffffffffffff81116101825761094b90369084840101611b27565b835280820160208181013590850152604080820135908501526060013567ffffffffffffffff8111610182576109849236920101611ccd565b606082015280516001600160a01b036109a66040830151602085015190611fad565b5151166001600160a01b0385511614801590610dea575b610dd8576109d5602083015160408401519083613102565b6109de816126ff565b91825f525f60205260405f2054155f14610a42575051604080513381526001600160a01b039092166020830152810191909152600191907fb70c12fa453793fa6818ec07c91e74363a47aa6a6829dcd9533937fdf30314f390606090a15b016108bd565b9190610a73602084979597015160408501519060608601519060405192610a688461197a565b5f8452339186613137565b925f93610a8b606082015160446004350135906127e3565b15610af257505051604080513381526001600160a01b03909216602083015281019190915260019291907fe3151dc8cb7a54ffc4baabd28c1f241c94d510b5e5b502491ac3cad6c16316d590606090a15b8115610aea575b5092610a3c565b905088610ae3565b610aff60408201516127c0565b158015610dc5575b15610b5c57505051604080513381526001600160a01b03909216602083015281019190915260019291907f500b713857325f9e6dcb52ae832eca9109d107ed1aae9cb4928b4c1e13f051aa90606090a1610adc565b9250925050600196959691610b75606460043501611fc1565b15610d325796610be597610bf560408401516040880151610b968183613496565b15610d2a5750925b610bef848592610bd8610bd260608a01516001600160e01b03601b918660e01d92828816810b928260e01d9216900b613e66565b90614021565b9d8e9260408d0151613561565b60408c015261358b565b9961358b565b98610c0084846135b5565b610c0a8482613613565b60405192338452608060208501526060610c308451608080880152610100870190612015565b93602081015160a0870152604081015160c0870152015192607f198582030160e0860152835180825260208201906020808260051b8501019601925f5b828110610ccc57505050505092806001979695937f194f1feb3b4d7076a2c272e774e792e0c48bb8c7aa1a9a3671c1cd6da9e6b4c193610cc796604084015260608301520390a180858c5101808d5260051b8c0152613725565b610adc565b9091929396602080610d1d600193601f198782030189528b51906001600160a01b0382511681526040610d0c858401516060878501526060840190612094565b9201519060408184039101526118a2565b9901950193929101610c6d565b905092610b9e565b610be590610bf56060840151610bef610d70610bd260408801516001600160e01b0394601b90868360e01d9316820b91878260e01d9216900b613e66565b60408a0151610d7f8183613496565b15610dbd5750915b829c8d916060890151908116155f14610dae575060408801515b96879460408d0151613561565b610db890856134bd565b610da1565b905091610d87565b50610dd36060820151613473565b610b07565b60405163936bb5ad60e01b8152600490fd5b506001600160a01b03610e066060830151604085015190611fad565b5151166001600160a01b0360208601511614156109bd565b634e487b7160e01b5f52603260045260245ffd5b50919390610e44606460043501611fc1565b15610fdf57835b6004356004013590610e5d8282613496565b610fc15750508490610e7d856001600160a01b0360208701511633613099565b505060a46004350190610e95826004356004016120c7565b905015159081610fb9575b50610f18575b506001600160a01b03610ebc929351163361280a565b50505b8351811015610ee45780610ede610ed860019387611fad565b516138fe565b01610ebf565b5060409160017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f005582519182526020820152f35b90506001600160a01b03602084015116610f426001600160a01b03855116926004356004016120c7565b929091333b1561018257610f8a5f93604051958694859463691f9ed760e01b8652600486015260248501528960448501528a606485015260a0608485015260a4840191611cfc565b038183335af190811561022c57859115610ea6579050610faa915061194a565b5f836001600160a01b03610ea6565b905088610ea0565b604492506040519163573b6f4160e01b835260048301526024820152fd5b84610e4b565b50610ff360408301516127c0565b6108db565b60405163315f9e2360e21b8152600490fd5b604051639c95219f60e01b8152600490fd5b3461018257602080600319360112610182576024816001600160a01b03611041611816565b16604051928380926370a0823160e01b82523060048301525afa90811561022c575f91611072575b50604051908152f35b90508181813d8311611098575b6110898183611996565b81010312610182575182611069565b503d61107f565b34610182576110ad36611856565b6110b56126bd565b6110c084863361278c565b6110c9836127c0565b1561120e576110d9848633612dcc565b6110e38185613496565b15611208575082935b6110f88582883361303b565b9690947f8045c25080b0868951141ed0a91720bcad09a8364a2b3109ee1fd49c1f0bc8b860c0611129898533613099565b94906001600160a01b0360405192338452169a8b6020840152876040840152856060840152608083015260a0820152a1836111845760017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055005b6111fb9761028f9660ff946040519960078b5260208b015260408a01526060890152608088015260a08701521660c08501523360e0850152610100840193846040526111cf8561195e565b600685526111e061012082016121cb565b6111e985611f9d565b526111f384611f9d565b503691611da1565b808080808080808061015c565b936110ec565b604051623a3a4d60e21b81523360048201526001600160a01b038616602482015260448101859052606490fd5b34610182576080366003190112610182576004356001600160a01b03908181168091036101825761126a61182c565b6044359167ffffffffffffffff916064358381116101825736602382011215610182578060040135938411610182573660248583010111610182576112f79560209216936112b9868587612f5c565b60405196879283926323e30c8b60e01b84523360048501528760248501528860448501525f606485015260a06084850152602460a485019201611cfc565b03815f855af193841561022c575f94611363575b507f439148f0bbc682ca079e46d6e2c2f0c1e3b820f1a291b069d8882abf8cf18dd9840361134a5761133f93503091612fd5565b602060405160018152f35b604051630b6c58a960e31b815260048101859052602490fd5b9093506020813d60201161138f575b8161137f60209383611996565b810103126101825751928461130b565b3d9150611372565b346101825760603660031901126101825760206113c66113b5611816565b6113bd61182c565b60443591612dcc565b604051908152f35b34610182576113dc36611856565b839493926113e86126bd565b6113f384863361278c565b6113fc816127c0565b15611502578061141061145f92873361280a565b9590967f7f9dfa19cf1cc2f806f2f860fbc9c056b601fb1afc0e9b843dfe5c63616268e660806040513381526001600160a01b0384169a8b60208301528560408301526060820152a1336128b0565b9590938261148d5760017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055005b6114f69661028f9560ff936040519860068a5260208a01526040890152606088015260808701521660a08501523360c085015260e0840193846040526114d28561195e565b600685526114e361010082016121cb565b6114ec85611f8d565b526111f384611f8d565b8080808080808061015c565b6040516306dde9c360e41b81523360048201526001600160a01b038616602482015260448101859052606490fd5b34610182576020366003190112610182576004355f525f6020526020600160405f205414604051908152f35b3461018257600319604036820112610182576004359067ffffffffffffffff808311610182578260040160a08436039384011261018257602435828111610182576115ab9036906004016117e5565b906115b46126bd565b5f946001600160a01b0394856115c986611ce8565b163303611770576115e26115dd3687611b27565b6126ff565b91825f525f60205260405f2096600188541461162a575b60208960017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00556040519015158152f35b9091929394959697505f6001985560405191338352846020840152606060408401528161165689611842565b16606084015260248a013590606219018112156101825789019060a060808401528061168460048401611842565b1661010084015261169760248301611842565b1661012083015260448101356022198236030181121561018257019560246004880135970192871161018257863603831361018257602098608461175384936117127f09d18501db0080ca2d6cd7c17fa7255daff4b2d503ea93b76ff68b6752ea8e63976117639c6060610140890152610160880191611cfc565b6117446117396117256044880185611d1c565b605f198a8603810160a08c01529491611d51565b926064870190611d1c565b918784030160c0880152611d51565b91013560e08301520390a1612730565b82808080808080806115f9565b60248661177c87611ce8565b6040516335252be360e01b815291166004820152fd5b34610182576020366003190112610182576004359063ffffffff60e01b82168092036101825760209163e414309160e01b81149081156117d4575b5015158152f35b6301ffc9a760e01b149050836117cd565b9181601f840112156101825782359167ffffffffffffffff8311610182576020808501948460051b01011161018257565b600435906001600160a01b038216820361018257565b602435906001600160a01b038216820361018257565b35906001600160a01b038216820361018257565b906080600319830112610182576004356001600160a01b0381168103610182579160243591604435916064359067ffffffffffffffff82116101825761189e916004016117e5565b9091565b805180835260209291819084018484015e5f828201840152601f01601f1916010190565b60a0810190811067ffffffffffffffff8211176118e257604052565b634e487b7160e01b5f52604160045260245ffd5b6060810190811067ffffffffffffffff8211176118e257604052565b6040810190811067ffffffffffffffff8211176118e257604052565b6080810190811067ffffffffffffffff8211176118e257604052565b67ffffffffffffffff81116118e257604052565b60e0810190811067ffffffffffffffff8211176118e257604052565b6020810190811067ffffffffffffffff8211176118e257604052565b90601f8019910116810190811067ffffffffffffffff8211176118e257604052565b92919267ffffffffffffffff82116118e257604051916119e2601f8201601f191660200184611996565b829481845281830111610182578281602093845f960137010152565b9080601f8301121561018257816020611a19933591016119b8565b90565b91906060838203126101825760405190611a35826118f6565b8193611a4081611842565b8352611a4e60208201611842565b602084015260408101359167ffffffffffffffff831161018257604092611a7592016119fe565b910152565b67ffffffffffffffff81116118e25760051b60200190565b929192611a9e82611a7a565b604092611aae6040519283611996565b819581835260208093019160061b84019381851161018257915b848310611ad757505050505050565b8583830312610182578386918251611aee81611912565b611af786611842565b81528286013583820152815201920191611ac8565b9080601f8301121561018257816020611a1993359101611a92565b91909160a0818403126101825760405190611b41826118c6565b8193611b4c82611842565b835267ffffffffffffffff9160208101358381116101825782611b70918301611a1c565b602085015260408101358381116101825782611b8d918301611b0c565b6040850152606081013592831161018257611bae6080939284938301611b0c565b60608501520135910152565b909291611bc684611a7a565b916040611bd66040519485611996565b839580855260208095019160059160051b8401948086116101825784935b868510611c05575050505050505050565b67ffffffffffffffff90853582811161018257870190606082850312610182578451611c30816118f6565b611c3983611842565b81528a83013584811161018257830185601f8201121561018257803590611c5f82611a7a565b91611c6c89519384611996565b8083528d808401918b1b83010191888311610182578e809101915b838310611cbd57509150508201528583013593841161018257611cae858c958695016119fe565b86820152815201940193611bf4565b82358152918101918f9101611c87565b9080601f8301121561018257816020611a1993359101611bba565b356001600160a01b03811681036101825790565b908060209392818452848401375f828201840152601f01601f1916010190565b9035601e198236030181121561018257016020813591019167ffffffffffffffff8211610182578160061b3603831361018257565b9190808252602080920192915f905b828210611d6e575050505090565b909192936001906001600160a01b03611d8687611842565b16815285830135838201526040908101950193920190611d60565b90929192611dae81611a7a565b91604091611dbf6040519485611996565b839581855260208095019160051b8301938185116101825783925b858410611dea5750505050505050565b67ffffffffffffffff908435828111610182578601908382860312610182578351611e1481611912565b82358481116101825786611e29918501611a1c565b81528983013593841161018257611e44868b95869501611ccd565b83820152815201930192611dda565b903590601e1981360301821215610182570180359067ffffffffffffffff821161018257602001918160051b3603831361018257565b60405190611e96826118f6565b60606040835f81525f60208201520152565b60405190611eb5826118c6565b5f608083828152611ec4611e89565b6020820152606060408201526060808201520152565b9015610e1e57803590607e1981360301821215610182570190565b903590609e1981360301821215610182570190565b903590601e1981360301821215610182570180359067ffffffffffffffff821161018257602001918160061b3603831361018257565b9190811015610e1e5760061b0190565b805115610e1e5760200190565b805160011015610e1e5760400190565b805160021015610e1e5760600190565b805160031015610e1e5760800190565b805160041015610e1e5760a00190565b805160051015610e1e5760c00190565b8051821015610e1e5760209160051b010190565b3580151581036101825790565b9081518082526020808093019301915f5b828110611fed575050505090565b835180516001600160a01b031686528201518583015260409094019392810192600101611fdf565b9060808061208b61207961206760406001600160a01b0380895116885260208901519060a060208a01528082511660a08a015260208201511660c08901520151606060e08801526101008701906118a2565b60408701518682036040880152611fce565b60608601518582036060870152611fce565b93015191015290565b9081518082526020808093019301915f5b8281106120b3575050505090565b8351855293810193928101926001016120a5565b903590601e1981360301821215610182570180359067ffffffffffffffff82116101825760200191813603831361018257565b903590605e1981360301821215610182570190565b6121266115dd61211f8380611ef5565b3690611b27565b5f525f602052600160405f2054036121c25780612146816121b293611ef5565b6121aa61216561216a6020850135938460408701359384923690611b27565b613102565b6121826121778580611ef5565b946060810190611e53565b92906121a2604051966121948861197a565b5f88525f3681373690611b27565b933691611bba565b923392613137565b6040810151606090910151600192565b505f905f905f90565b5f5b60c081106121d9575050565b6060828201526020016121cd565b5f5b8281106121f557505050565b6060828201526020016121e9565b926001600160a01b038451166001600160a01b03835116146126ab576001600160a01b03612238606086015160643590611fad565b515116906040830151916001600160a01b036122576084358095611fad565b5151161480159061266b575b610dd8576040850151906001600160a01b036122826044358094611fad565b5151166001600160a01b0361229d60643560608a0151611fad565b51511614612659576122ae866126ff565b805f525f60205260405f20541561260657506122c9846126ff565b805f525f60205260405f2054156125b257506123ac9291612386917f6fa7f4c28634b0a9d6831401c45ae468195fb63aed07308935c35374ff5d9e396040518061233161232361012033845280602085015283018d612015565b82810360408401528a612015565b85606083015260643560808301528760a083015260a43560c083015260c43560e083015260e4356101008301520390a16001600160a01b03865116604051926123798461197a565b5f8452606435908a613137565b936001600160a01b038651166040519261239f8461197a565b5f845260a4359086613137565b916123ba60408201516127c0565b15801561259e575b801561258b575b8015612578575b61256657604051916123e18361192e565b5f83525f60208401525f60408401525f606084015261240084836147d1565b8452604084015261242661241483866147d1565b60208601528060608601528451613561565b9461243a6020850151604086015190613561565b9361244487613473565b8015612557575b6125455761250c61253e957fd9fa84dd790c969daa5c33d8050dc06b4a9b59d5b42e2be5f5e8ae20447f618d946124ee6125439a60a09661248d8a88516135b5565b61249b8c60208901516135b5565b6124a98a6040890151613613565b6124b78c6060890151613613565b6124c08a6138fe565b6124c98c6138fe565b6001600160a01b036124e560c435926060606435910151611fad565b515116336128b0565b50506001600160a01b036124e560e43592606060a435910151611fad565b5050606060405191338352805160208401526020810151604084015260408101518284015201516080820152a1613725565b613725565b565b604051630d86822160e01b8152600490fd5b5061256185613473565b61244b565b6040516321badf1f60e01b8152600490fd5b506125866060840151613473565b6123d0565b506125996060820151613473565b6123c9565b506125ac60408401516127c0565b156123c2565b9351604080513381526001600160a01b039092166020830152810194909452507fb70c12fa453793fa6818ec07c91e74363a47aa6a6829dcd9533937fdf30314f3945091925082915050606081015b0390a1565b9551604080513381526001600160a01b039092166020830152810196909652507fb70c12fa453793fa6818ec07c91e74363a47aa6a6829dcd9533937fdf30314f394935083925050606082019050612601565b604051631cd2f1c760e21b8152600490fd5b506001600160a01b03612685606085015160a43590611fad565b5151166001600160a01b036126a1604088015160443590611fad565b5151161415612263565b604051630a98f1f360e21b8152600490fd5b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0060028154146126ed5760029055565b604051633ee5aeb560e01b8152600490fd5b60405161272a8161271c6020820194602086526040830190612015565b03601f198101835282611996565b51902090565b612543929161275b61028f923390919060405192600284526020840152604083015260608201604052565b92604051936127698561195e565b60068552612779602086016121cb565b61278285611f50565b526111f384611f50565b909115612797575050565b6040516305dbdfd960e41b81526001600160a01b03918216600482015291166024820152604490fd5b6127df905f60e01d906001600160e01b038160e01d9116601b0b614834565b1290565b906127df916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b6148b5565b92919261281682613af9565b9361282081613473565b61289e5784816001600160e01b0361283f9360e01d9116601b0b614934565b9290809315612875575b50829081612859575b5050509190565b61286d926001600160a01b03309216612fd5565b5f8181612852565b9092505f19811461288a57600101915f612849565b634e487b7160e01b5f52601160045260245ffd5b604051632eaefac360e21b8152600490fd5b939291936128bd83613473565b61295b57846128d9576128d1939450613099565b50505f905f90565b6001600160a01b039392919380911694855f52602060018152604092835f20961695865f528152825f20825f528152612916835f2054948561358b565b9561292087613473565b612943575f97885260018252838820908852815282872091875252909320829055565b835163c5e12af560e01b815260048101889052602490fd5b60405163793a8f5560e01b815260048101849052602490fd5b919060408382031261018257825167ffffffffffffffff908181116101825784019082601f830112156101825781516020926129af82611a7a565b916129bd6040519384611996565b808352848084019160051b830101918683116101825785809101915b838310612a4c5750505050948281015191821161018257019180601f84011215610182578251612a0881611a7a565b93612a166040519586611996565b818552838086019260051b820101928311610182578301905b828210612a3d575050505090565b81518152908301908301612a2f565b82518152918101918691016129d9565b90808251908181526020809101926020808460051b8301019501935f915b848310612a8a5750505050505090565b9091929394958480612aa8600193601f198682030187528a51612094565b9801930193019194939290612a7a565b91906020928381526001600160a01b0382511684820152838201516040820152612af2604083015160e060608401526101008301906118a2565b9060608301516080820152612b19608084015192601f1993848483030160a0850152612a5c565b9260a081015193838382030160c08401528680865192838152019501905f5b818110612b5c57505050611a1994955060c060e09101519282850301910152612094565b825187529588019591880191600101612b38565b90604082019082526020606081936040838201528551809452019301915f5b828110612b9d575050505090565b835185529381019392810192600101612b8f565b919091604092835192612bc38461195e565b60068452602094612bd58686016121cb565b5f5b8451811015612c0a5780612bed60019287611fad565b51612bf88289611fad565b52612c038188611fad565b5001612bd7565b50925092939093335f52308252825f2091835195612c2787611912565b612c2f611e89565b875260608281980152845190612c448261197a565b5f8252855190612c538261197a565b5f82525f3681375f5b8151811015612dc057898688612c728486611fad565b51888151948d80870151908151612c94575b5050505050505050600101612c5c565b905f92916001600160a01b0396612cb98887818d51169c015116998789015190613bd8565b95825199612cc68b61195e565b8a5289015287015285015260808401528760a08401528660c08401525f8c51809563d04dfe2360e01b82528180612d01600498898301612ab8565b03915afa938415612db6579089915f95612d90575b508451612d2c575b50899250808e8c938e612c84565b5101511691823b1561018257612d5a925f92838d5180968195829463012c676d60e21b845233908401612b70565b03925af18015612d86579060019291612d77575b81928782612d1e565b612d809061194a565b5f612d6e565b89513d5f823e3d90fd5b612dad9195503d805f833e612da58183611996565b810190612974565b9050935f612d16565b8c513d5f823e3d90fd5b50505050505050509050565b8215612e01576001600160a01b038091165f52600160205260405f2091165f5260205260405f20905f5260205260405f205490565b909150612e0d82613e0a565b6001600160a01b03809316906040918251946370a0823160e01b86528416938460048701526020928387602481865afa968715612f23575f97612f2d575b5083612e64612e5d83612e949a614ae9565b5090614274565b508651636eb1769f60e11b81526001600160a01b0390941660048501523060248501529297889081906044820190565b0381865afa968715612f23575f97612ef2575b50612e5d612eb891611a1998614ae9565b50612ec38183613496565b15612eea5750935b5f5260018252825f20905f528152815f20905f8052525f20549061358b565b905093612ecb565b96508387813d8311612f1c575b612f098183611996565b8101031261018257955195612e5d612ea7565b503d612eff565b85513d5f823e3d90fd5b96508387813d8311612f55575b612f448183611996565b810103126101825795519583612e4b565b503d612f3a565b6040519263a9059cbb60e01b5f526001600160a01b0380931660045260245260205f60448180855af160015f5114811615612fb6575b8360405215612fa057505050565b635274afe760e01b835216600482015260249150fd5b6001811516612fcc57813b15153d151616612f92565b833d5f823e3d90fd5b9092604051936323b872dd60e01b5f526001600160a01b0393848092166004521660245260445260205f60648180855af160015f5114811615613025575b836040525f60605215612fa057505050565b6001811516612fcc57813b15153d151616613013565b9392919361304883613473565b61295b578461305c576128d193945061280a565b6001600160a01b039392919380911694855f52602060018152604092835f20961695865f528152825f20825f528152612916835f20549485613561565b909291926130a681613af9565b936130b081613473565b6130f05784816001600160e01b036130cf9360e01d9116601b0b614934565b508092816130de575050509190565b6001600160a01b0361286d9316612f5c565b604051632d1671a360e11b8152600490fd5b9161312d906060613122936001600160a01b039485916040880151611fad565b515116940151611fad565b5151161461265957565b94919361337c919360c0915f6133036040928351946131558661195e565b61315d611ea8565b86526020958487820152848682015260609781868a809401528260808201528660a082015201526132b38551916131938361195e565b600683526131a28884016121cb565b8d6131ac816126ff565b9c896001600160a01b039e8f94859182865116908d5194600486528501528c840152168c82015233608082015260a081018a526131e886611f50565b526131f285611f50565b5088516131fe816118f6565b6002815289368c83013761321186611f5d565b5261321b85611f5d565b5060ff8a61327e8b8501936132688761324181613239858a51611fad565b515116613e0a565b97511688613250848951611fad565b5151168561325f858a51611fad565b51015191612dcc565b96613274828751611fad565b5151169451611fad565b51015192169093929190604051946005865260208601526040850152606084015260808301525f60a083015260c08201604052565b6132bc82611f6d565b526132c681611f6d565b506132ea8a8d8d60ff8a61327e8d8501936132688761324181613239858a51611fad565b6132f382611f7d565b526132fd81611f7d565b50613bd8565b95878a511697848b0191825191868184511693015116928a855230875285808620915101518651916133348361197a565b8683528751956133438761195e565b86528886015286850152848885015289608085015260a084015260c08301528351808098819463d04dfe2360e01b835260048301612ab8565b03915afa968715613469575f945f98613447575b50845160028110613430575081838601519501516133b66133b088611f8d565b51611f7d565b516133c18183613496565b156134285750925b6133eb8685919060405192600284526020840152604083015260608201604052565b6133f488611f6d565b526133fe87611f6d565b5082519961340b8b61195e565b8a52890152870152850152608084015260a083015260c082015290565b9050926133c9565b602490835190630fbb8e5560e21b82526004820152fd5b90975061345f9194503d805f833e612da58183611996565b939093965f613390565b50513d5f823e3d90fd5b613492905f60e01d906001600160e01b038160e01d9116601b0b614834565b1390565b90613492916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b6148b5565b6134e46001600160e01b0392838316601b0b9260e01d938160e01d9116601b0b848461402b565b90637ffffff58213613534575b906134fb91614274565b929092158061352c575b61350e57505090565b6044925060405191638eba4d0760e01b835260048301526024820152fd5b508215613505565b61353e8282614f14565b156134f157604483856040519163d556b11160e01b835260048301526024820152fd5b611a1991610bd2916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b61447a565b611a1991610bd2916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b61463e565b61360f9160808101826135d16135cb8351611f8d565b51611f8d565b526136086136026001600160a01b038094515116936135f96135f38551611f8d565b51611f50565b51169251611f8d565b51611f6d565b519161303b565b5050565b906080810191806136276135cb8551611f7d565b526001600160a01b038092515116916136436135f38551611f7d565b51166136526136028551611f7d565b5190816136ed5761366283613473565b61295b579183917f4cb6e22a3e7e651d7cf0376cff48f20f5007a54147777865be7f5f6c38c50f4a9593612601955f52602090600182526136b8604094855f20835f528452855f20855f528452855f205461358b565b945f5260018252835f20905f528152825f20915f52525f20555b51604051918291338352604060208401526040830190612a5c565b9161371e917f4cb6e22a3e7e651d7cf0376cff48f20f5007a54147777865be7f5f6c38c50f4a9593612601956128b0565b50506136d2565b60c0810151908151915f92613899575b506137da6020918281510151926001600160a01b039081818187511696015116928660a082019485518252308452604097888320898686510151015160808601518b51916137828361197a565b8683528c51936137918561197a565b8785528d51966137a08861195e565b8752898701528c86015260016060860152608085015260a084015260c08301528851808099819463d04dfe2360e01b835260048301612ab8565b03915afa94851561388f578795613871575b5084516137fd575b50505050505050565b81905101510151169051813b1561386d57918491849383613832965180978195829463012c676d60e21b845260048401612b70565b03925af1908115613864575061384d575b80808080806137f4565b613857829161194a565b6138615780613843565b80fd5b513d84823e3d90fd5b8480fd5b6138869195503d8089833e612da58183611996565b9050935f6137ec565b86513d89823e3d90fd5b6001600160a01b03602080845101510151169060a083015190823b15610182576138dc925f928360405180968195829463012c676d60e21b845260048401612b70565b03925af1801561022c5715613735576138f691925061194a565b5f905f613735565b6080810161390f6136028251611f7d565b5191821561391c57505050565b6139366135f36001600160a01b0380935151169351611f7d565b5116815f5260209160018352604092835f20835f528152835f20855f528152835f2054936001600160e01b038516613971575b505050505050565b613995955f9284845260018152828420868552815282842091845252812055613099565b5f808080613969565b81156139a8570490565b634e487b7160e01b5f52601260045260245ffd5b6040815110613a04576020810151908051603f19810190811161288a5760051c82116139f05760016020920160051b010190565b50506040516139fe8161197a565b5f815290565b506040516139fe8161197a565b805115613a2157602001515f1a90565b505f90565b905f8091602081519101845af48080613aa4575b15613a5a5750506040513d81523d5f602083013e60203d82010160405290565b15613a8157604051639996b31560e01b81526001600160a01b039091166004820152602490fd5b3d15613a92576040513d5f823e3d90fd5b60405163d6bda27560e01b8152600490fd5b503d151580613a3a5750813b1515613a3a565b60041115613ac157565b634e487b7160e01b5f52602160045260245ffd5b602090939291936001600160a01b036040820195168152613af583613ab7565b0152565b613b01615002565b6040805163b7bad1b160e01b81526001600160a01b0383166004820152909182826024815f73200e12d10bb0c5e4a17e7018f0f1161919bb93895af1928315613bcf575f925f94613b9a575b50613b5783613ab7565b600183141580613b88575b613b6c5750505090565b5163ee07877f60e01b81529182916106df919060048401613ad5565b50613b9283613ab7565b821515613b62565b90809450613bbe9293503d8511613bc8575b613bb68183611996565b81019061490a565b919091925f613b4d565b503d613bac565b513d5f823e3d90fd5b90805191613be583611a7a565b91613c00604094613bf886519586611996565b808552611a7a565b601f199460209186013686840137835183519095908015613dff576001613c569101965b6001978891010197613c4d613c388a611a7a565b99613c4586519b8c611996565b808b52611a7a565b018489016121e7565b85805f9684516002815233878201523086820152606081018652613c798b611f50565b52613c838a611f50565b505f925b613dbb575b5050508351613c9f575b50505050505090565b85809598979692980181613cb38289611fad565b52613cbe8188611fad565b505f925b613cd1575b5085969750613c96565b8451831015613db6576001600160a01b03613d4881613cf08689611fad565b51511686613cfe878a611fad565b51015187815160051b9101207f19457468657265756d205369676e6564204d6573736167653a0a3332000000005f52601c52603c5f208c613d3f888b611fad565b51015191614a60565b15613d9e57868098999a928192613d5f878a611fad565b515116613d6c8787611fad565b52019385613d7a8289611fad565b510151613d87868c611fad565b52613d92858b611fad565b50019290989796613cc2565b8951630a57f30960e31b815260048101859052602490fd5b613cc7565b9091968151881015613df6578280910197613dd68184611fad565b51613de18a8d611fad565b52613dec898c611fad565b5001919081613c87565b96829150613c8c565b50613c565f96613c24565b613e12615002565b60408051630782d7e160e01b81526001600160a01b03831660048201529091828260248173200e12d10bb0c5e4a17e7018f0f1161919bb93895afa928315613bcf575f925f94613b9a5750613b5783613ab7565b9091939284158215175f14613e805750505090505f905f90565b82810192600160fd1b8082019083011760fe1c613fb7575b5050613ea381614bd9565b93613ead81614bd9565b94613eb88682614bf9565b90918215613fa8575f9083986f0785ee10d5da46d900f436a000000000808611613f9a575b50670de0b6b3a7640000808b11613f8b575b50633b9aca00808b11613f7c575b50612710808b11613f6e575b5098805b613f5d5750819061189e989982600a0a9109960195817fcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccd0a93838211900382610100031b9203901c170291614c0c565b60019290920191600a900480613f0d565b60049a04998a930192613f09565b600991939a049901915f613efd565b601291939a049901915f613eef565b85049950602592505f613edd565b5092905061189e949550614c0c565b5f82121561400b57808413613ffd575b7f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb2841315613e985790925061189e939491614b17565b90925061189e939491614b7e565b80841215613fc75790925061189e939491614b17565b6134fb8282614274565b92909180614051576044848460405191637a97930f60e01b835260048301526024820152fd5b90919280155f1461406657505050505f905f90565b61407f9361407391614cc6565b92919490938492614cc6565b909391928461408d88614bd9565b9161409786614bd9565b947f161bcca7119915b50764b4abe86529797775a5f171951000000000000000000094604c9186881061423e575b030191600160ff1b98838a018112155f1461420b575050035b5f955f821280614202575b6141e4575b5f8112806141d2575b6141b45786820103966001600160ff1b03881490816141aa575b50806141a1575b80614198575b61417a57509061412e9291614e72565b915f8113614141575b5061189e93614c0c565b9091604c821361416f5761415891600a0a9061399e565b908115614165575f614137565b505050505f905f90565b50505050505f905f90565b876044916040519163d556b11160e01b835260048301526024820152fd5b505f851261411e565b50828414614118565b905088145f614111565b604489836040519163d556b11160e01b835260048301526024820152fd5b50806001600160ff1b030182136140f7565b95508087018613156141fc5786818703015b956140ee565b5f6141f6565b505f81136140e9565b89985090920390506001600160ff1b038190038701821361422f57018601946140de565b5050505050505050505f905f90565b7f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee80000000000000000009650604b92506140c5565b81156139a8570590565b8082601b82810b8314614469577d90e40fbeea1d3a4abc8955e946fe31cdcf66f634e10000000000000000008405614415575b8380820b0361440457507b199999999999999999999999999999999999999999999999999999987b0ccccccccccccccccccccccccccccccccccccccccccccccccccccccc840111156143b5575b838060030b03614339575b80841361431d5750506001600160e01b036001925b60e01b91161791565b8303600a0a80156139a8576001600160e01b0391071592614314565b92915f84131561438957509061434f8383614f14565b61436b57637ffffffe1901600a0a810290637fffffff926142ff565b506044916040519163d556b11160e01b835260048301526024820152fd5b637fffffff19928303906043821361416f576143a891600a0a9061426a565b91821561416557926142ff565b5f198401808060030b146143c957506142f4565b90506001600160e01b039293507b7fffffffffffffffffffffffffffffffffffffffffffffffffffffff915060e01b9260ff1d181617905f90565b600190940193600a909305926142a7565b937f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee8000000000000000000840515614456576305f5e100600894058094819201955b9150506142a7565b620186a06005940580948192019561444e565b50826142f457505050505f90600190565b919291600160ff1b84016144925761189e9350614f2d565b9061189e935f039161463e565b919291600160ff1b919080158061462c5750906144bb91614cc6565b9490929091905f868585858282138015614623575b614606575b505050508682841860ff1c94860391039081604c0381116145eb5701600a0a8082059190846145d1575b505081019182821860ff1c11156145c957826001600160ff1b03146145ab57905f600192135f1461457c57600a9004915b01925b8115811761454057509190565b80614559575b508015614551579190565b505f91508190565b919261456f9203600160ff1b01600a0a9061426a565b600160ff1b91905f614546565b600a60037fe6666666666666666666666666666666666666666666666666666666666666679201040191614530565b604490836040519163d556b11160e01b835260048301526024820152fd5b509092614533565b81076145de575b806144ff565b60ff1d600117015f6145d8565b5050509193506145f9579190565b60018160ff1d1790039190565b5f9a50909750909550600160ff1b945092509050868080806144d5565b50835f126144d0565b156146375750509190565b9350919050565b939291938415811581811761478f5750509061465991614cc6565b919490829561466a82958294614cc6565b8096929491969387868482138015614786575b61476d575b5050505050508682841860ff1c94860391039081604c0381116145eb5701600a0a808205919084614753575b505081019182821860ff1c111561474b57826001600160ff1b03146145ab57905f600192135f1461471c57600a9004915b01925b811581176146ef57509190565b806146ff57508015614551579190565b600160ff1b936147169291038401600a0a9061426a565b5f614546565b600a60037fe66666666666666666666666666666666666666666666666666666666666666792010401916146df565b5090926146e2565b8107614760575b806146ae565b60ff1d600117015f61475a565b929b5098509196509450925090505f8080808080614682565b5085841261467d565b93959390929190156147a5575050614551579190565b945092915050565b6008815110613a21576008015167ffffffffffffffff1667ff0a89c674ee78741490565b916040830192604061480b610bd2606087519401938451906001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b613e66565b9451930161481a8151866127e3565b614822575050565b909350611a19919250519251836134bd565b92915f9060018184145f871287151717176148ae575f928082136148a0575b03604c81135f82121761489457600a0a9084614872838202938461426a565b1461488757505015614883575f9190565b5f90565b9093509015611a19579190565b505015614883575f9190565b5f9560019450925090614853565b5050505f90565b93929190918083145f83125f87121883158715171717614904575f928082136148f75703604c81135f82121761489457600a0a9084614872838202938461426a565b9194600193509190614853565b50919050565b919082604091031261018257815160048110156101825760209092015160ff811681036101825790565b91925f83121561495c576044838360405191634a7d166b60e01b835260048301526024820152fd5b91928361496e57505090505f90600190565b60ff8116820191808312614a36575f8312156149a6575050604c198112614551575f03600a0a9161499f838261399e565b9283021490565b909293915f81135f14614a2c57604d8113614a0157600a0a9283156139a857835f190483116149d85750500290600190565b60405163c849483b60e01b815260048101849052602481019290925260ff166044820152606490fd5b5060405163c849483b60e01b81526004810192909252602482015260ff919091166044820152606490fd5b5050905090600190565b60405163c849483b60e01b815260048101869052602481019190915260ff82166044820152606490fd5b9091813b614a9b57614a72919261506b565b50614a7c81613ab7565b159182614a8857505090565b6001600160a01b03918216911614919050565b6020918160645f935160405192630b135d3f60e11b9788855260048501526040602485015286820190604485015e8281018201859052601f01601f191601915afa905f5114601f3d11161690565b9060ff165f03916001600160ff1b0382115f14614b0f57600a6001818404940192061590565b909190600190565b909392915f614b27918184613e66565b9490945f8483019182019412159081614b74575b8115614b6a575b50614b4c57505090565b604492506040519163d556b11160e01b835260048301526024820152fd5b905083125f614b42565b8281129150614b3b565b614b9393600160fe1b90810193920190613e66565b9081815f821215614bca575050604b1982126128d157614bb8915f03600a0a9061426a565b9081614bc2575f90565b600160ff1b90565b93600160ff1b90910192509050565b5f811215611a1957600160ff1b90808203614bf2575090565b90505f0390565b905f198183099102908180821091030391565b92939291905f8184181215614ca1576001600160ff1b039283831115614c8b57600160ff1b93838503614c4157505050509190565b90919293508514614c5b575050600a600191045f03920190565b604051630ed8062160e21b8152600481019190915260248101919091526044810182905260648101849052608490fd5b5090915050600160ff1b811461288a575f039190565b90916001600160ff1b0380841115612852578514614c5b575050600a60019104920190565b9190918015614e6857827f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee800000000000000000080830515614d76575b507f19999999999999999999999999999999999999999999999999999999999999997f0ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc830110614d67575b8313614d515791905f90565b919060018060ff1b926001600160ff1b03030190565b9290600a02905f190192614d45565b6f4b3b4ca85a86c47a098a22400000000080840515614e56575b507728c87cb5c89a2571ebfdcb54864ada834a00000000000000830515614e3f575b7b097edd871cfda3a5697758bf0e3cbb5ac5741c640000000000000000830515614e2b575b7e3899162693736ac531a5a58f1fbb4b746504382ca7e4000000000000000000830515614e1b57820515614e0c575b5f614cfa565b9290600a02905f190192614e06565b9391606402916001190193614dd7565b93916402540be40002916009190193614dd7565b9391678ac7230489e8000002916012190193614db2565b6025198301955092909202915f614d90565b505f915081908190565b90915f198383099280830292838086109503948086039584871015614ef05714614ee8579082910960018219018216809204600280826003021880830282030280830282030280830282030280830282030280830282030280920290030293600183805f03040190848311900302920304170290565b505091500490565b60648386866040519263362ced0960e11b8452600484015260248301526044820152fd5b611a1991905f811215614f28575f036150a5565b6150a5565b909291600160ff1b91828101614fbf5750808414614fb557808413918215614fad578185035b604c811115614f9c5750505f915b15614f8d57507f8000000000000000000000000000000000000000000000000000000000000001019190565b92506001600160ff1b03039190565b600a0a9081156139a8570491614f61565b848203614f53565b505090505f905f90565b93614fcc92945f0361449f565b80939180928114614fe0575b50505f039190565b915092506001600160ff1b0383146145ab57600a600191059201915f80614fd8565b73200e12d10bb0c5e4a17e7018f0f1161919bb9389803b158015615040575b6150285750565b602490604051906373e6d7b360e01b82526004820152fd5b507f1de7d717526cba131d684e312dedbf0852adef9cced9e36798ae4937f7145d41813f1415615021565b815191906041830361509b576150949250602082015190606060408401519301515f1a90615134565b9192909190565b50505f9160029190565b90637ffffff581131561512e57637ffffffe1981019060438213615127575f8212156150fb57637fffffff91505f0301600a0a7b8000000000000000000000000000000000000000000000000000000202111590565b50600a0a80156139a8577b80000000000000000000000000000000000000000000000000000001041090565b5050151590565b50505f90565b91907f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a084116151ab579160209360809260ff5f9560405194855216868401526040830152606082015282805260015afa1561022c575f516001600160a01b038116156151a157905f905f90565b505f906001905f90565b5050505f91600391905600000000000000000000000000000000000000000000200e12d10bb0c5e4a17e7018f0f1161919bb93890000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000044b608060405234801561000f575f80fd5b506004361061004a575f3560e01c80630782d7e11461004e57806354636d2b14610078578063b7bad1b11461009d578063f5c36eaf146100b0575b5f80fd5b61006161005c366004610363565b6100c3565b60405161006f929190610403565b60405180910390f35b61008b610086366004610363565b6100d8565b60405160ff909116815260200161006f565b6100616100ab366004610363565b6100e9565b61008b6100be366004610363565b6100f5565b5f806100cf5f84610100565b91509150915091565b5f6100e35f836101f0565b92915050565b5f806100cf5f84610281565b5f6100e35f83610356565b73ffffffffffffffffffffffffffffffffffffffff81165f9081526020838152604080832081518083019092525460ff8082161515835261010090910416818301527f313ce56700000000000000000000000000000000000000000000000000000000808452839283908190816004818a5afa915060203d1015610182575f91505b811561019857505f5160ff811115610198575f91505b816101af57505050602001516003925090506101e9565b83516101c3575f955093506101e992505050565b836020015160ff1681146101d85760026101db565b60015b846020015195509550505050505b9250929050565b5f805f6101fd8585610281565b909250905060018260038111156102165761021661039d565b1415801561023557505f8260038111156102325761023261039d565b14155b156102795783826040517fee07877f000000000000000000000000000000000000000000000000000000008152600401610270929190610421565b60405180910390fd5b949350505050565b5f805f8061028f8686610100565b90925090505f8260038111156102a7576102a761039d565b0361034b576040805180820182526001815260ff838116602080840191825273ffffffffffffffffffffffffffffffffffffffff8a165f908152908b9052939093209151825493517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00009094169015157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff161761010093909116929092029190911790555b909590945092505050565b5f805f6101fd8585610100565b5f60208284031215610373575f80fd5b813573ffffffffffffffffffffffffffffffffffffffff81168114610396575f80fd5b9392505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b600481106103ff577f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b9052565b6040810161041182856103ca565b60ff831660208301529392505050565b73ffffffffffffffffffffffffffffffffffffffff831681526040810161039660208301846103ca560000000000000000000000000000000000000000000000000000000000000000006e2d0e71d900474b262e545bc4c98b71ab368d2100000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000003d486080604052600436106100d65760003560e01c80638456cb591161007f5780639a1f3406116100595780639a1f340614610200578063cd0fb7a714610220578063f2fde38b14610260578063fa461e331461028057600080fd5b80638456cb59146101ad5780638da5cb5b146101c257806393b3774c146101ed57600080fd5b80632c8958f6116100b05780632c8958f6146100f95780636b2ace871461013f578063715018a61461019857600080fd5b8063046f7da2146100e257806323a69e75146100f95780632646478b1461011957600080fd5b366100dd57005b600080fd5b3480156100ee57600080fd5b506100f76102a0565b005b34801561010557600080fd5b506100f7610114366004613579565b6103a8565b61012c6101273660046136f5565b6103ba565b6040519081526020015b60405180910390f35b34801561014b57600080fd5b506101737f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610136565b3480156101a457600080fd5b506100f7610564565b3480156101b957600080fd5b506100f7610578565b3480156101ce57600080fd5b5060005473ffffffffffffffffffffffffffffffffffffffff16610173565b61012c6101fb36600461377c565b61067b565b34801561020c57600080fd5b506100f761021b36600461382f565b61089a565b34801561022c57600080fd5b5061025061023b366004613868565b60016020526000908152604090205460ff1681565b6040519015158152602001610136565b34801561026c57600080fd5b506100f761027b366004613868565b6108f8565b34801561028c57600080fd5b506100f761029b366004613579565b6109af565b60005473ffffffffffffffffffffffffffffffffffffffff163314806102d557503360009081526001602052604090205460ff165b610366576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f52503a2063616c6c6572206973206e6f7420746865206f776e6572206f72206160448201527f2070726976696c6567656420757365720000000000000000000000000000000060648201526084015b60405180910390fd5b600280547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff167501000000000000000000000000000000000000000000179055565b6103b4848484846109af565b50505050565b60025460009074010000000000000000000000000000000000000000900460ff16600114610444576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f526f75746550726f636573736f72206973206c6f636b65640000000000000000604482015260640161035d565b6002547501000000000000000000000000000000000000000000900460ff166001146104cc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f526f75746550726f636573736f72206973207061757365640000000000000000604482015260640161035d565b600280547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff1674020000000000000000000000000000000000000000179055610519878787878787610b5d565b9050600280547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff16740100000000000000000000000000000000000000001790559695505050505050565b61056c6111a3565b6105766000611224565b565b60005473ffffffffffffffffffffffffffffffffffffffff163314806105ad57503360009081526001602052604090205460ff165b610639576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f52503a2063616c6c6572206973206e6f7420746865206f776e6572206f72206160448201527f2070726976696c65676564207573657200000000000000000000000000000000606482015260840161035d565b600280547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff167502000000000000000000000000000000000000000000179055565b60025460009074010000000000000000000000000000000000000000900460ff16600114610705576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f526f75746550726f636573736f72206973206c6f636b65640000000000000000604482015260640161035d565b6002547501000000000000000000000000000000000000000000900460ff1660011461078d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f526f75746550726f636573736f72206973207061757365640000000000000000604482015260640161035d565b600280547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff1674020000000000000000000000000000000000000000179055604051600090819073ffffffffffffffffffffffffffffffffffffffff8c16908b908381818185875af1925050503d8060008114610826576040519150601f19603f3d011682016040523d82523d6000602084013e61082b565b606091505b50915091508161083d57805181602001fd5b61084b898989898989610b5d565b92505050600280547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff167401000000000000000000000000000000000000000017905598975050505050505050565b6108a26111a3565b73ffffffffffffffffffffffffffffffffffffffff91909116600090815260016020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016911515919091179055565b6109006111a3565b73ffffffffffffffffffffffffffffffffffffffff81166109a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f6464726573730000000000000000000000000000000000000000000000000000606482015260840161035d565b6109ac81611224565b50565b60025473ffffffffffffffffffffffffffffffffffffffff163314610a56576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603e60248201527f526f75746550726f636573736f722e756e697377617056335377617043616c6c60448201527f6261636b3a2063616c6c2066726f6d20756e6b6e6f776e20736f757263650000606482015260840161035d565b6000808513610a655783610a67565b845b905060008113610af9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603960248201527f526f75746550726f636573736f722e756e697377617056335377617043616c6c60448201527f6261636b3a206e6f7420706f73697469766520616d6f756e7400000000000000606482015260840161035d565b600280547fffffffffffffffffffffffff00000000000000000000000000000000000000001660011790556000610b3283850185613868565b9050610b5573ffffffffffffffffffffffffffffffffffffffff82163384611299565b505050505050565b60008073ffffffffffffffffffffffffffffffffffffffff881673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee14610c24576040517f70a0823100000000000000000000000000000000000000000000000000000000815233600482015273ffffffffffffffffffffffffffffffffffffffff8916906370a0823190602401602060405180830381865afa158015610bfb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c1f919061388c565b610c27565b60005b9050600073ffffffffffffffffffffffffffffffffffffffff871673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee14610cf1576040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff86811660048301528816906370a0823190602401602060405180830381865afa158015610cc8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cec919061388c565b610d0a565b8473ffffffffffffffffffffffffffffffffffffffff16315b905087600080610d2e87604080518082019091528181528151909101602082015290565b90505b805160208201511115610e84576000610d508280516001018051915290565b90508060ff1660011415610d7a576000610d6983611372565b905083610d74578094505b50610e73565b8060ff1660021415610d9557610d90828d611437565b610e73565b8060ff1660031415610dac576000610d6983611457565b8060ff1660041415610dc157610d908261147d565b8060ff1660051415610dd657610d90826114a3565b8060ff1660061415610dec57610d908d836115a8565b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f526f75746550726f636573736f723a20556e6b6e6f776e20636f6d6d616e642060448201527f636f646500000000000000000000000000000000000000000000000000000000606482015260840161035d565b610e7c836138d4565b925050610d31565b506000905073ffffffffffffffffffffffffffffffffffffffff8b1673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee14610f4d576040517f70a0823100000000000000000000000000000000000000000000000000000000815233600482015273ffffffffffffffffffffffffffffffffffffffff8c16906370a0823190602401602060405180830381865afa158015610f24573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f48919061388c565b610f50565b60005b905083610f5d8b8361390d565b1015610feb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602f60248201527f526f75746550726f636573736f723a204d696e696d616c20696e70757420626160448201527f6c616e63652076696f6c6174696f6e0000000000000000000000000000000000606482015260840161035d565b600073ffffffffffffffffffffffffffffffffffffffff8a1673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee146110b3576040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff89811660048301528b16906370a0823190602401602060405180830381865afa15801561108a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110ae919061388c565b6110cc565b8773ffffffffffffffffffffffffffffffffffffffff16315b90506110d8898561390d565b81101561111e576110e98482613925565b6040517f963b34a500000000000000000000000000000000000000000000000000000000815260040161035d91815260200190565b6111288482613925565b6040805173ffffffffffffffffffffffffffffffffffffffff8b81168252602082018790529181018c905260608101839052919750808c1691908e169033907f2db5ddd0b42bdbca0d69ea16f234a870a485854ae0d91f16643d6f317d8b89949060800160405180910390a450505050509695505050505050565b60005473ffffffffffffffffffffffffffffffffffffffff163314610576576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161035d565b6000805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60405173ffffffffffffffffffffffffffffffffffffffff831660248201526044810182905261136d9084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009093169290921790915261163b565b505050565b6000806113858380516014018051915290565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015290915073ffffffffffffffffffffffffffffffffffffffff8216906370a0823190602401602060405180830381865afa1580156113f2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611416919061388c565b91508115611425576001820391505b61143183308385611747565b50919050565b60006114498380516014018051915290565b905061136d83338385611747565b47611478823073eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee84611747565b919050565b600061148f8280516014018051915290565b905061149f8260008360006117a2565b5050565b60006114b58280516014018051915290565b6040517ff7888aec00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff80831660048301523060248301529192506000917f0000000000000000000000000000000000000000000000000000000000000000169063f7888aec90604401602060405180830381865afa15801561154d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611571919061388c565b9050801561159c577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff015b61136d83308484611747565b60006115ba8280516020018051915290565b905060006115ce8380516020018051915290565b905060006115e28480516001018051915290565b905060006115f68580516020018051915290565b9050600061160a8680516020018051915290565b905061163273ffffffffffffffffffffffffffffffffffffffff8816333088888888886118d6565b50505050505050565b600061169d826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16611b569092919063ffffffff16565b80519091501561136d57808060200190518101906116bb919061393c565b61136d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f74207375636365656400000000000000000000000000000000000000000000606482015260840161035d565b60006117598580516001018051915290565b905060005b8160ff16811015610b5557600061177b8780516002018051915290565b61ffff8082168602049485900394909150611798888888846117a2565b505060010161175e565b60006117b48580516001018051915290565b905060ff81166117cf576117ca85858585611b6d565b6118cf565b8060ff16600114156117e7576117ca85858585611f22565b8060ff16600214156117ff576117ca85858585612162565b8060ff1660031415611817576117ca85858585612410565b8060ff166004141561182f576117ca85858585612a98565b8060ff1660051415611847576117ca85858585612c26565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f526f75746550726f636573736f723a20556e6b6e6f776e20706f6f6c2074797060448201527f6500000000000000000000000000000000000000000000000000000000000000606482015260840161035d565b5050505050565b6040517f7ecebe0000000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8881166004830152600091908a1690637ecebe0090602401602060405180830381865afa158015611946573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061196a919061388c565b6040517fd505accf00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8a811660048301528981166024830152604482018990526064820188905260ff8716608483015260a4820186905260c48201859052919250908a169063d505accf9060e401600060405180830381600087803b158015611a0457600080fd5b505af1158015611a18573d6000803e3d6000fd5b50506040517f7ecebe0000000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8b81166004830152600093508c169150637ecebe0090602401602060405180830381865afa158015611a8b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611aaf919061388c565b9050611abc82600161390d565b8114611b4a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f5361666545524332303a207065726d697420646964206e6f742073756363656560448201527f6400000000000000000000000000000000000000000000000000000000000000606482015260840161035d565b50505050505050505050565b6060611b6584846000856131e1565b949350505050565b6000611b7f8580516014018051915290565b90506000611b938680516001018051915290565b90506000611ba78780516014018051915290565b90506000611bbb8880516003018051915290565b905073ffffffffffffffffffffffffffffffffffffffff8716301415611c0157611bfc73ffffffffffffffffffffffffffffffffffffffff87168587611299565b611c41565b73ffffffffffffffffffffffffffffffffffffffff8716331415611c4157611c4173ffffffffffffffffffffffffffffffffffffffff87163386886132fa565b6000808573ffffffffffffffffffffffffffffffffffffffff16630902f1ac6040518163ffffffff1660e01b8152600401606060405180830381865afa158015611c8f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cb39190613977565b506dffffffffffffffffffffffffffff1691506dffffffffffffffffffffffffffff169150600082118015611ce85750600081115b611d4e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f57726f6e6720706f6f6c20726573657276657300000000000000000000000000604482015260640161035d565b6000808660ff16600114611d63578284611d66565b83835b6040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8b8116600483015292945090925083918c16906370a0823190602401602060405180830381865afa158015611dda573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611dfe919061388c565b611e089190613925565b98506000611e1986620f42406139c7565b611e289062ffffff168b6139eb565b9050600081611e3a85620f42406139eb565b611e44919061390d565b611e4e84846139eb565b611e589190613a28565b90506000808a60ff16600114611e7057826000611e74565b6000835b604080516000815260208101918290527f022c0d9f00000000000000000000000000000000000000000000000000000000909152919350915073ffffffffffffffffffffffffffffffffffffffff8d169063022c0d9f90611ede90859085908f9060248101613ad9565b600060405180830381600087803b158015611ef857600080fd5b505af1158015611f0c573d6000803e3d6000fd5b5050505050505050505050505050505050505050565b6000611f348580516014018051915290565b9050600080611f498780516001018051915290565b60ff161190506000611f618780516014018051915290565b905073ffffffffffffffffffffffffffffffffffffffff8616331415611fa357611fa373ffffffffffffffffffffffffffffffffffffffff86163330876132fa565b600280547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff851690811790915563128acb088284878161201757612012600173fffd8963efd1fc6a506488495d951d5263988d26613b14565b612027565b6120276401000276a36001613b41565b6040805173ffffffffffffffffffffffffffffffffffffffff8d166020820152016040516020818303038152906040526040518663ffffffff1660e01b8152600401612077959493929190613b79565b60408051808303816000875af1158015612095573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120b99190613bc0565b505060025473ffffffffffffffffffffffffffffffffffffffff16600114611632576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f526f75746550726f636573736f722e73776170556e6956333a20756e6578706560448201527f6374656400000000000000000000000000000000000000000000000000000000606482015260840161035d565b60006121748580516001018051915290565b905060006121888680516014018051915290565b9050600180831614156122575760006121a78780516014018051915290565b905060028316612213578073ffffffffffffffffffffffffffffffffffffffff1663d0e30db0856040518263ffffffff1660e01b81526004016000604051808303818588803b1580156121f957600080fd5b505af115801561220d573d6000803e3d6000fd5b50505050505b73ffffffffffffffffffffffffffffffffffffffff821630146122515761225173ffffffffffffffffffffffffffffffffffffffff82168386611299565b50610b55565b600282166123205773ffffffffffffffffffffffffffffffffffffffff851633141561229f5761229f73ffffffffffffffffffffffffffffffffffffffff85163330866132fa565b6040517f2e1a7d4d0000000000000000000000000000000000000000000000000000000081526004810184905273ffffffffffffffffffffffffffffffffffffffff851690632e1a7d4d90602401600060405180830381600087803b15801561230757600080fd5b505af115801561231b573d6000803e3d6000fd5b505050505b60008173ffffffffffffffffffffffffffffffffffffffff168460405160006040518083038185875af1925050503d806000811461237a576040519150601f19603f3d011682016040523d82523d6000602084013e61237f565b606091505b5050905080611632576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603760248201527f526f75746550726f636573736f722e777261704e61746976653a204e6174697660448201527f6520746f6b656e207472616e73666572206661696c6564000000000000000000606482015260840161035d565b60006124228580516001018051915290565b905060006124368680516014018051915290565b905060ff8216156128315773ffffffffffffffffffffffffffffffffffffffff85163014156124a5576124a073ffffffffffffffffffffffffffffffffffffffff85167f000000000000000000000000000000000000000000000000000000000000000085611299565b61275b565b73ffffffffffffffffffffffffffffffffffffffff8516331415612505576124a073ffffffffffffffffffffffffffffffffffffffff8516337f0000000000000000000000000000000000000000000000000000000000000000866132fa565b6040517f4ffe34db00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85811660048301527f00000000000000000000000000000000000000000000000000000000000000001690634ffe34db906024016040805180830381865afa158015612590573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125b49190613c04565b516040517fdf23b45b00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff86811660048301526fffffffffffffffffffffffffffffffff909216917f0000000000000000000000000000000000000000000000000000000000000000169063df23b45b90602401606060405180830381865afa158015612656573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061267a9190613c77565b60409081015190517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000811660048301526fffffffffffffffffffffffffffffffff909216918716906370a0823190602401602060405180830381865afa158015612720573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612744919061388c565b61274e919061390d565b6127589190613925565b92505b6040517f02b9446c00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85811660048301527f000000000000000000000000000000000000000000000000000000000000000081166024830181905290831660448301526064820185905260006084830152906302b9446c9060a40160408051808303816000875af1158015612806573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061282a9190613bc0565b5050610b55565b73ffffffffffffffffffffffffffffffffffffffff851615612908576040517ff18d03cc00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85811660048301528681166024830152306044830152606482018590527f0000000000000000000000000000000000000000000000000000000000000000169063f18d03cc90608401600060405180830381600087803b1580156128eb57600080fd5b505af11580156128ff573d6000803e3d6000fd5b505050506129c1565b6040517ff7888aec00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85811660048301523060248301527f0000000000000000000000000000000000000000000000000000000000000000169063f7888aec90604401602060405180830381865afa15801561299a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129be919061388c565b92505b6040517f97da6d3000000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8581166004830152306024830152828116604483015260006064830152608482018590527f000000000000000000000000000000000000000000000000000000000000000016906397da6d309060a40160408051808303816000875af1158015612a6a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a8e9190613bc0565b5050505050505050565b6000612aaa8580516014018051915290565b85516020808201805190920101875290915073ffffffffffffffffffffffffffffffffffffffff851615612b91576040517ff18d03cc00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff858116600483015286811660248301528381166044830152606482018590527f0000000000000000000000000000000000000000000000000000000000000000169063f18d03cc90608401600060405180830381600087803b158015612b7857600080fd5b505af1158015612b8c573d6000803e3d6000fd5b505050505b6040517f627dd56a00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff83169063627dd56a90612be3908490600401613ce3565b6020604051808303816000875af1158015612c02573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611632919061388c565b6000612c388580516014018051915290565b90506000612c4c8680516001018051915290565b90506000612c608780516001018051915290565b60000b90506000612c778880516001018051915290565b60000b90506000612c8e8980516014018051915290565b90506000612ca28a80516014018051915290565b9050600073ffffffffffffffffffffffffffffffffffffffff891673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee1415612d8b576040517f3df02124000000000000000000000000000000000000000000000000000000008152600f86810b600483015285900b6024820152604481018990526000606482015273ffffffffffffffffffffffffffffffffffffffff881690633df02124908a9060840160206040518083038185885af1158015612d5f573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190612d84919061388c565b905061306e565b73ffffffffffffffffffffffffffffffffffffffff8a16331415612dcb57612dcb73ffffffffffffffffffffffffffffffffffffffff8a1633308b6132fa565b612dec73ffffffffffffffffffffffffffffffffffffffff8a16888a613358565b5060ff8616612e9f576040517f3df02124000000000000000000000000000000000000000000000000000000008152600f86810b600483015285900b6024820152604481018990526000606482015273ffffffffffffffffffffffffffffffffffffffff881690633df02124906084016020604051808303816000875af1158015612e7b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d84919061388c565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015260009073ffffffffffffffffffffffffffffffffffffffff8416906370a0823190602401602060405180830381865afa158015612f0c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f30919061388c565b6040517f3df02124000000000000000000000000000000000000000000000000000000008152600f88810b600483015287900b6024820152604481018b90526000606482015290915073ffffffffffffffffffffffffffffffffffffffff891690633df0212490608401600060405180830381600087803b158015612fb457600080fd5b505af1158015612fc8573d6000803e3d6000fd5b50506040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201526000925073ffffffffffffffffffffffffffffffffffffffff861691506370a0823190602401602060405180830381865afa158015613039573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061305d919061388c565b90506130698282613925565b925050505b73ffffffffffffffffffffffffffffffffffffffff831630146131d45773ffffffffffffffffffffffffffffffffffffffff821673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee14156131b35760008373ffffffffffffffffffffffffffffffffffffffff168260405160006040518083038185875af1925050503d8060008114613117576040519150601f19603f3d011682016040523d82523d6000602084013e61311c565b606091505b50509050806131ad576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603660248201527f526f75746550726f636573736f722e7377617043757276653a204e617469766560448201527f20746f6b656e207472616e73666572206661696c656400000000000000000000606482015260840161035d565b506131d4565b6131d473ffffffffffffffffffffffffffffffffffffffff83168483611299565b5050505050505050505050565b606082471015613273576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c0000000000000000000000000000000000000000000000000000606482015260840161035d565b6000808673ffffffffffffffffffffffffffffffffffffffff16858760405161329c9190613cf6565b60006040518083038185875af1925050503d80600081146132d9576040519150601f19603f3d011682016040523d82523d6000602084013e6132de565b606091505b50915091506132ef87838387613389565b979650505050505050565b60405173ffffffffffffffffffffffffffffffffffffffff808516602483015283166044820152606481018290526103b49085907f23b872dd00000000000000000000000000000000000000000000000000000000906084016112eb565b6000613365848484613426565b80611b65575061337784846000613426565b8015611b655750611b65848484613426565b6060831561341c5782516134155773ffffffffffffffffffffffffffffffffffffffff85163b613415576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640161035d565b5081611b65565b611b658383613535565b6040805173ffffffffffffffffffffffffffffffffffffffff8481166024830152604480830185905283518084039091018152606490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f095ea7b300000000000000000000000000000000000000000000000000000000179052915160009283928392918816916134bf9190613cf6565b6000604051808303816000865af19150503d80600081146134fc576040519150601f19603f3d011682016040523d82523d6000602084013e613501565b606091505b509150915081801561352b57508051158061352b57508080602001905181019061352b919061393c565b9695505050505050565b8151156135455781518083602001fd5b806040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161035d9190613ce3565b6000806000806060858703121561358f57600080fd5b8435935060208501359250604085013567ffffffffffffffff808211156135b557600080fd5b818701915087601f8301126135c957600080fd5b8135818111156135d857600080fd5b8860208285010111156135ea57600080fd5b95989497505060200194505050565b73ffffffffffffffffffffffffffffffffffffffff811681146109ac57600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600082601f83011261365b57600080fd5b813567ffffffffffffffff808211156136765761367661361b565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f011681019082821181831017156136bc576136bc61361b565b816040528381528660208588010111156136d557600080fd5b836020870160208301376000602085830101528094505050505092915050565b60008060008060008060c0878903121561370e57600080fd5b8635613719816135f9565b9550602087013594506040870135613730816135f9565b9350606087013592506080870135613747816135f9565b915060a087013567ffffffffffffffff81111561376357600080fd5b61376f89828a0161364a565b9150509295509295509295565b600080600080600080600080610100898b03121561379957600080fd5b88356137a4816135f9565b97506020890135965060408901356137bb816135f9565b95506060890135945060808901356137d2816135f9565b935060a0890135925060c08901356137e9816135f9565b915060e089013567ffffffffffffffff81111561380557600080fd5b6138118b828c0161364a565b9150509295985092959890939650565b80151581146109ac57600080fd5b6000806040838503121561384257600080fd5b823561384d816135f9565b9150602083013561385d81613821565b809150509250929050565b60006020828403121561387a57600080fd5b8135613885816135f9565b9392505050565b60006020828403121561389e57600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613906576139066138a5565b5060010190565b60008219821115613920576139206138a5565b500190565b600082821015613937576139376138a5565b500390565b60006020828403121561394e57600080fd5b815161388581613821565b80516dffffffffffffffffffffffffffff8116811461147857600080fd5b60008060006060848603121561398c57600080fd5b61399584613959565b92506139a360208501613959565b9150604084015163ffffffff811681146139bc57600080fd5b809150509250925092565b600062ffffff838116908316818110156139e3576139e36138a5565b039392505050565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613a2357613a236138a5565b500290565b600082613a5e577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b60005b83811015613a7e578181015183820152602001613a66565b838111156103b45750506000910152565b60008151808452613aa7816020860160208601613a63565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b84815283602082015273ffffffffffffffffffffffffffffffffffffffff8316604082015260806060820152600061352b6080830184613a8f565b600073ffffffffffffffffffffffffffffffffffffffff838116908316818110156139e3576139e36138a5565b600073ffffffffffffffffffffffffffffffffffffffff808316818516808303821115613b7057613b706138a5565b01949350505050565b600073ffffffffffffffffffffffffffffffffffffffff8088168352861515602084015285604084015280851660608401525060a060808301526132ef60a0830184613a8f565b60008060408385031215613bd357600080fd5b505080516020909101519092909150565b80516fffffffffffffffffffffffffffffffff8116811461147857600080fd5b600060408284031215613c1657600080fd5b6040516040810181811067ffffffffffffffff82111715613c3957613c3961361b565b604052613c4583613be4565b8152613c5360208401613be4565b60208201529392505050565b805167ffffffffffffffff8116811461147857600080fd5b600060608284031215613c8957600080fd5b6040516060810181811067ffffffffffffffff82111715613cac57613cac61361b565b604052613cb883613c5f565b8152613cc660208401613c5f565b6020820152613cd760408401613be4565b60408201529392505050565b6020815260006138856020830184613a8f565b60008251613d08818460208701613a63565b919091019291505056fea26469706673582212201ff294929b57776d43429e47ba13e7bb550e4a27be6afbadf8c8a0d6ad6324b364736f6c634300080a0033000000000000000000000000000000000000000000000000"; diff --git a/src/lib/LibRaindex.sol b/src/lib/LibRaindex.sol index ee10dc2f18..8acebbe65c 100644 --- a/src/lib/LibRaindex.sol +++ b/src/lib/LibRaindex.sol @@ -10,12 +10,7 @@ import { EvalV4 } from "rainlang-interface-0.2.13/src/interface/IInterpreterV4.sol"; import {LibNamespace, FullyQualifiedNamespace} from "rainlang-interface-0.2.13/src/lib/ns/LibNamespace.sol"; -import { - LibContext, - CONTEXT_BASE_COLUMN, - CONTEXT_BASE_ROW_SENDER -} from "rainlang-interface-0.2.13/src/lib/caller/LibContext.sol"; -import {LibBytes32Array} from "rain-solmem-0.1.28/src/lib/LibBytes32Array.sol"; +import {LibContext} from "rainlang-interface-0.2.13/src/lib/caller/LibContext.sol"; /// @dev Raindex context is actually fairly complex. The calling context column /// is populated before calculate order, but the remaining columns are only @@ -27,7 +22,7 @@ import {LibBytes32Array} from "rain-solmem-0.1.28/src/lib/LibBytes32Array.sol"; /// Each entrypoint fills only its own columns and leaves the rest empty, so a /// word read outside the entrypoints that fill its cell reverts out of bounds /// instead of reading another entrypoint's value. -uint256 constant CALLING_CONTEXT_COLUMNS = 7; +uint256 constant CALLING_CONTEXT_COLUMNS = 6; uint256 constant CONTEXT_COLUMNS = CALLING_CONTEXT_COLUMNS + 1; @@ -65,10 +60,6 @@ uint256 constant CONTEXT_CALLING_CONTEXT_ROW_WITHDRAW_TARGET_AMOUNT = 4; uint256 constant CONTEXT_CALLING_CONTEXT_ROW_WITHDRAW_TOKEN_DECIMALS = 5; uint256 constant CONTEXT_CALLING_CONTEXT_ROW_WITHDRAW_WITHDRAWER = 6; -/// @dev Post-arb column: the input, output and gas balances swept to the -/// sender. Filled only for the post-arb task. -uint256 constant CONTEXT_ARB_COLUMN = 7; - /// @dev Calculations column contains the DECIMAL RESCALED calculations but /// otherwise provided as-is according to calculate order entrypoint uint256 constant CONTEXT_CALCULATIONS_COLUMN = 2; @@ -105,13 +96,13 @@ uint256 constant CONTEXT_VAULT_IO_ROWS = 5; /// @dev Signed context signer addresses occupy their own column so that each /// signer can be matched to its corresponding signed context column. -uint256 constant CONTEXT_SIGNED_CONTEXT_SIGNERS_COLUMN = 8; +uint256 constant CONTEXT_SIGNED_CONTEXT_SIGNERS_COLUMN = CONTEXT_COLUMNS; uint256 constant CONTEXT_SIGNED_CONTEXT_SIGNERS_ROWS = 1; uint256 constant CONTEXT_SIGNED_CONTEXT_SIGNERS_ROW = 0; /// @dev Signed context data columns start after the signers column. Each /// signer's data is a separate column at this offset + signer index. -uint256 constant CONTEXT_SIGNED_CONTEXT_START_COLUMN = 9; +uint256 constant CONTEXT_SIGNED_CONTEXT_START_COLUMN = CONTEXT_SIGNED_CONTEXT_SIGNERS_COLUMN + 1; uint256 constant CONTEXT_SIGNED_CONTEXT_START_ROWS = 1; uint256 constant CONTEXT_SIGNED_CONTEXT_START_ROW = 0; @@ -124,21 +115,12 @@ library LibRaindex { return callingContext; } - /// @dev Evaluates each Raindex post task in `post` against `context` padded - /// with empty columns to `CALLING_CONTEXT_COLUMNS`. Tasks with empty - /// bytecode are skipped. + /// @dev Evaluates each task in `post` against `context` padded with empty + /// columns to `CALLING_CONTEXT_COLUMNS`, so the signers and signed context + /// columns are at `CONTEXT_SIGNED_CONTEXT_SIGNERS_COLUMN` and + /// `CONTEXT_SIGNED_CONTEXT_START_COLUMN` as in order evaluation. Tasks with + /// empty bytecode are skipped. function doPost(bytes32[][] memory context, TaskV2[] memory post) internal { - evalPost(context, post, true); - } - - /// @dev As `doPost` for the post-arb task, with `arbColumn` as - /// `CONTEXT_ARB_COLUMN`. The calling contract is the arb, not a raindex, so - /// the base column drops its calling contract row. - function doArbPost(bytes32[] memory arbColumn, TaskV2[] memory post) internal { - evalPost(callingContextColumn(CONTEXT_ARB_COLUMN, arbColumn), post, false); - } - - function evalPost(bytes32[][] memory context, TaskV2[] memory post, bool callerIsRaindex) private { bytes32[][] memory callingContext = new bytes32[][](CALLING_CONTEXT_COLUMNS); for (uint256 i = 0; i < context.length; ++i) { callingContext[i] = context[i]; @@ -151,11 +133,6 @@ library LibRaindex { for (uint256 i = 0; i < post.length; ++i) { task = post[i]; if (task.evaluable.bytecode.length > 0) { - bytes32[][] memory fullContext = LibContext.build(callingContext, task.signedContext); - if (!callerIsRaindex) { - fullContext[CONTEXT_BASE_COLUMN] = - LibBytes32Array.arrayFrom(fullContext[CONTEXT_BASE_COLUMN][CONTEXT_BASE_ROW_SENDER]); - } //slither-disable-next-line unused-return (, bytes32[] memory writes) = task.evaluable.interpreter .eval4( @@ -164,7 +141,7 @@ library LibRaindex { namespace: qualifiedNamespace, bytecode: task.evaluable.bytecode, sourceIndex: SourceIndexV2.wrap(0), - context: fullContext, + context: LibContext.build(callingContext, task.signedContext), inputs: emptyStack, stateOverlay: emptyStateOverlay }) diff --git a/src/lib/LibRaindexArb.sol b/src/lib/LibRaindexArb.sol index 7beeee887d..d3c064406a 100644 --- a/src/lib/LibRaindexArb.sol +++ b/src/lib/LibRaindexArb.sol @@ -15,7 +15,7 @@ library LibRaindexArb { /// @dev Sweeps the orders' input and output token balances and any native /// gas held by this contract to `msg.sender`, then evaluates the post-arb - /// task with `CONTEXT_ARB_COLUMN` holding those balances as Floats. Only the + /// task with a context column containing those balances as Floats. Only the /// two order tokens are swept; any other token left on the arb stays put. /// The Float columns are the balances read immediately before each transfer, /// so for fee-on-transfer tokens they can exceed the amount actually @@ -27,6 +27,7 @@ library LibRaindexArb { address ordersOutputToken, uint8 outputDecimals ) internal { + bytes32[][] memory context = new bytes32[][](1); bytes32[] memory col = new bytes32[](3); { @@ -71,8 +72,10 @@ library LibRaindexArb { col[2] = Float.unwrap(gasFloat); } + context[0] = col; + TaskV2[] memory post = new TaskV2[](1); post[0] = task; - LibRaindex.doArbPost(col, post); + LibRaindex.doPost(context, post); } } diff --git a/src/lib/LibRaindexSubParser.sol b/src/lib/LibRaindexSubParser.sol index f366d50b89..131c8524ae 100644 --- a/src/lib/LibRaindexSubParser.sol +++ b/src/lib/LibRaindexSubParser.sol @@ -443,7 +443,7 @@ library LibRaindexSubParser { /// @dev Builds the complete authoring metadata for all raindex context /// words. Returns ABI-encoded `AuthoringMetaV2[]` covering every context /// column (base, order, calculations, vault IO, deposit, withdraw, signers, - /// signed context; the arb column has no words). The inner arrays are flattened before encoding. + /// signed context). The inner arrays are flattened before encoding. //slither-disable-next-line dead-code function authoringMetaV2() internal pure returns (bytes memory) { AuthoringMetaV2[][] memory meta = new AuthoringMetaV2[][](CONTEXT_COLUMNS_EXTENDED); diff --git a/test/abstract/RaindexV6ArbOrderTaker.context.t.sol b/test/abstract/RaindexV6ArbOrderTaker.context.t.sol index 36e28fb856..ff463efdea 100644 --- a/test/abstract/RaindexV6ArbOrderTaker.context.t.sol +++ b/test/abstract/RaindexV6ArbOrderTaker.context.t.sol @@ -72,9 +72,9 @@ contract RaindexV6ArbOrderTakerContextTest is RaindexV6ExternalRealTest { bytecode: iParserV2.parse2( bytes( string.concat( - ":ensure(equal-to(context<7 0>() 3) \"input token\"),", - ":ensure(equal-to(context<7 1>() 4) \"output token\"),", - ":ensure(equal-to(context<7 2>() 5) \"gas balance\");" + ":ensure(equal-to(context<1 0>() 3) \"input token\"),", + ":ensure(equal-to(context<1 1>() 4) \"output token\"),", + ":ensure(equal-to(context<1 2>() 5) \"gas balance\");" ) ) ) diff --git a/test/abstract/RaindexV6ArbOrderTaker.finalizeDecimals.t.sol b/test/abstract/RaindexV6ArbOrderTaker.finalizeDecimals.t.sol index 31d3de6e8f..ba54686d00 100644 --- a/test/abstract/RaindexV6ArbOrderTaker.finalizeDecimals.t.sol +++ b/test/abstract/RaindexV6ArbOrderTaker.finalizeDecimals.t.sol @@ -81,9 +81,9 @@ contract RaindexV6ArbOrderTakerFinalizeDecimalsTest is RaindexV6ExternalRealTest bytecode: iParserV2.parse2( bytes( string.concat( - ":ensure(equal-to(context<7 0>() 3) \"input token\"),", - ":ensure(equal-to(context<7 1>() 4) \"output token\"),", - ":ensure(equal-to(context<7 2>() 5) \"gas balance\");" + ":ensure(equal-to(context<1 0>() 3) \"input token\"),", + ":ensure(equal-to(context<1 1>() 4) \"output token\"),", + ":ensure(equal-to(context<1 2>() 5) \"gas balance\");" ) ) ) diff --git a/test/abstract/RaindexV6FlashBorrower.finalizeDecimals.t.sol b/test/abstract/RaindexV6FlashBorrower.finalizeDecimals.t.sol index 1277eac57f..f91d3a04c9 100644 --- a/test/abstract/RaindexV6FlashBorrower.finalizeDecimals.t.sol +++ b/test/abstract/RaindexV6FlashBorrower.finalizeDecimals.t.sol @@ -31,11 +31,11 @@ import {LibDecimalFloat} from "rain-math-float-0.3.10/src/lib/LibDecimalFloat.so /// Here the input token is 6-decimal and the output token is 9-decimal, the arb /// is pre-funded with a deterministic leftover of each token (3e6 input, 4e9 /// output) that the mock raindex's no-op `takeOrders4` leaves untouched, and a -/// REAL post-arb task asserts the swept context floats. context<7 0>() == 3 and -/// context<7 1>() == 4 hold ONLY when each leftover is scaled by its OWN +/// REAL post-arb task asserts the swept context floats. context<1 0>() == 3 and +/// context<1 1>() == 4 hold ONLY when each leftover is scaled by its OWN /// decimals (3e6 / 1e6 == 3; 4e9 / 1e9 == 4). Swapping input-decimals for -/// output-decimals makes context<7 0>() == 0.003 (reverts "input token"); the -/// reverse makes context<7 1>() == 4000 (reverts "output token"). +/// output-decimals makes context<1 0>() == 0.003 (reverts "input token"); the +/// reverse makes context<1 1>() == 4000 (reverts "output token"). contract RaindexV6FlashBorrowerFinalizeDecimalsTest is RaindexV6ExternalRealTest { function testRaindexV6FlashBorrowerFinalizeUsesPerTokenDecimals() external { // 6-decimal input token, 9-decimal output token. @@ -77,7 +77,7 @@ contract RaindexV6FlashBorrowerFinalizeDecimalsTest is RaindexV6ExternalRealTest orders[0] = TakeOrderConfigV4(order, 0, 0, new SignedContextV1[](0)); // Real post-arb task: assert each swept leftover was scaled by its OWN - // decimals. context<7 0>() is the input float, context<7 1>() the output. + // decimals. context<1 0>() is the input float, context<1 1>() the output. TaskV2 memory task = TaskV2({ evaluable: EvaluableV4({ interpreter: iInterpreter, @@ -85,8 +85,8 @@ contract RaindexV6FlashBorrowerFinalizeDecimalsTest is RaindexV6ExternalRealTest bytecode: iParserV2.parse2( bytes( string.concat( - ":ensure(equal-to(context<7 0>() 3) \"input token\"),", - ":ensure(equal-to(context<7 1>() 4) \"output token\");" + ":ensure(equal-to(context<1 0>() 3) \"input token\"),", + ":ensure(equal-to(context<1 1>() 4) \"output token\");" ) ) ) diff --git a/test/concrete/parser/RaindexV6SubParser.operandHandlersWiring.t.sol b/test/concrete/parser/RaindexV6SubParser.operandHandlersWiring.t.sol index 215b598296..a723ddd090 100644 --- a/test/concrete/parser/RaindexV6SubParser.operandHandlersWiring.t.sol +++ b/test/concrete/parser/RaindexV6SubParser.operandHandlersWiring.t.sol @@ -14,8 +14,8 @@ import {RaindexV6SubParser} from "../../../src/concrete/parser/RaindexV6SubParse /// (base / order / calculations / vault-in / vault-out / deposit / withdraw) /// is wired to the SAME `LibParseOperand.handleOperandDisallowed` function, so /// those slots all share one 16-bit pointer. Only TWO slots are different: -/// - signers (column 8, row 0) -> `handleOperandSingleFullNoDefault` -/// - signed-context (column 9, row 0) -> `handleOperandDoublePerByteNoDefault` +/// - signers (column 7, row 0) -> `handleOperandSingleFullNoDefault` +/// - signed-context (column 8, row 0) -> `handleOperandDoublePerByteNoDefault` /// Because the build function is a freshly compiled `external pure`, this test /// runs against a fresh deployment WITHOUT etching or pointer regeneration. The /// absolute pointer values are unstable across source edits (solc reorders its @@ -41,9 +41,8 @@ contract RaindexV6SubParserOperandHandlersWiringTest is Test { // col 4 vault outputs (5 rows) -> 12..16 // col 5 deposit (6 rows) -> 17..22 // col 6 withdraw (7 rows) -> 23..29 - // col 7 arb (0 rows) - // col 8 signers (1 row) -> 30 - // col 9 signed context (1 row) -> 31 + // col 7 signers (1 row) -> 30 + // col 8 signed context (1 row) -> 31 uint256 internal constant TABLE_SLOTS = 32; uint256 internal constant SLOT_SIGNERS = 30; uint256 internal constant SLOT_SIGNED_CONTEXT = 31; @@ -69,7 +68,7 @@ contract RaindexV6SubParserOperandHandlersWiringTest is Test { } /// Every slot before signers (base through withdraw) is the shared - /// disallowed pointer; the signers slot (column 8, row 0) differs. + /// disallowed pointer; the signers slot (column 7, row 0) differs. function testSignersOperandHandlerIsDistinct() external view { uint16 disallowed = pointerAt(0); // Every plain context slot before signers shares the disallowed pointer. @@ -79,7 +78,7 @@ contract RaindexV6SubParserOperandHandlersWiringTest is Test { assertTrue(pointerAt(SLOT_SIGNERS) != disallowed, "signers handler must differ from handleOperandDisallowed"); } - /// The signed-context handler (column 9, row 0) differs from both the + /// The signed-context handler (column 8, row 0) differs from both the /// disallowed default and the signers handler. function testSignedContextOperandHandlerIsDistinct() external view { uint16 disallowed = pointerAt(0); diff --git a/test/concrete/parser/RaindexV6SubParser.routing.t.sol b/test/concrete/parser/RaindexV6SubParser.routing.t.sol index 3b5a54f7c2..ce7dd9486e 100644 --- a/test/concrete/parser/RaindexV6SubParser.routing.t.sol +++ b/test/concrete/parser/RaindexV6SubParser.routing.t.sol @@ -183,25 +183,25 @@ contract RaindexV6SubParserRoutingTest is Test { // Operand-driven words. - /// signers routes to the signers column (column 8) and uses the raw + /// signers routes to the signers column (column 7) and uses the raw /// operand as the row. function testRouteSignersRowFromOperand() external pure { - checkRouteOperand(LibRaindexSubParser.subParserSigners, OperandV2.wrap(bytes32(uint256(0))), 8, 0); - checkRouteOperand(LibRaindexSubParser.subParserSigners, OperandV2.wrap(bytes32(uint256(1))), 8, 1); - checkRouteOperand(LibRaindexSubParser.subParserSigners, OperandV2.wrap(bytes32(uint256(7))), 8, 7); + checkRouteOperand(LibRaindexSubParser.subParserSigners, OperandV2.wrap(bytes32(uint256(0))), 7, 0); + checkRouteOperand(LibRaindexSubParser.subParserSigners, OperandV2.wrap(bytes32(uint256(1))), 7, 1); + checkRouteOperand(LibRaindexSubParser.subParserSigners, OperandV2.wrap(bytes32(uint256(7))), 7, 7); } /// signed-context low operand byte selects a column offset added to the - /// signed context start column (column 9); the second byte selects the row. + /// signed context start column (column 8); the second byte selects the row. function testRouteSignedContextColumnMaskAndRowShift() external pure { - // operand 0x0000 -> column 9 + 0, row 0. - checkRouteOperand(LibRaindexSubParser.subParserSignedContext, OperandV2.wrap(bytes32(uint256(0x0000))), 9, 0); - // operand 0x0001 -> low byte 1 -> column 9 + 1 = 10, row 0. - checkRouteOperand(LibRaindexSubParser.subParserSignedContext, OperandV2.wrap(bytes32(uint256(0x0001))), 10, 0); - // operand 0x0100 -> low byte 0 -> column 9, second byte 1 -> row 1. - checkRouteOperand(LibRaindexSubParser.subParserSignedContext, OperandV2.wrap(bytes32(uint256(0x0100))), 9, 1); - // operand 0x0201 -> column 9 + 1 = 10, row 2. Proves column and row are + // operand 0x0000 -> column 8 + 0, row 0. + checkRouteOperand(LibRaindexSubParser.subParserSignedContext, OperandV2.wrap(bytes32(uint256(0x0000))), 8, 0); + // operand 0x0001 -> low byte 1 -> column 8 + 1 = 9, row 0. + checkRouteOperand(LibRaindexSubParser.subParserSignedContext, OperandV2.wrap(bytes32(uint256(0x0001))), 9, 0); + // operand 0x0100 -> low byte 0 -> column 8, second byte 1 -> row 1. + checkRouteOperand(LibRaindexSubParser.subParserSignedContext, OperandV2.wrap(bytes32(uint256(0x0100))), 8, 1); + // operand 0x0201 -> column 8 + 1 = 9, row 2. Proves column and row are // taken from distinct operand bytes (mask vs shift not swapped). - checkRouteOperand(LibRaindexSubParser.subParserSignedContext, OperandV2.wrap(bytes32(uint256(0x0201))), 10, 2); + checkRouteOperand(LibRaindexSubParser.subParserSignedContext, OperandV2.wrap(bytes32(uint256(0x0201))), 9, 2); } } diff --git a/test/concrete/parser/RaindexV6SubParser.routingTokenDecimalsAndMasks.t.sol b/test/concrete/parser/RaindexV6SubParser.routingTokenDecimalsAndMasks.t.sol index 6073a35ca2..c20b6c77b2 100644 --- a/test/concrete/parser/RaindexV6SubParser.routingTokenDecimalsAndMasks.t.sol +++ b/test/concrete/parser/RaindexV6SubParser.routingTokenDecimalsAndMasks.t.sol @@ -51,7 +51,7 @@ contract RaindexV6SubParserRoutingTokenDecimalsAndMasksTest is Test { /// A signed-context row wider than a byte reverts rather than wrapping onto /// another row. function testSignedContextWideRowReverts() external { - vm.expectRevert(abi.encodeWithSelector(ContextGridOverflow.selector, 9, 256)); + vm.expectRevert(abi.encodeWithSelector(ContextGridOverflow.selector, 8, 256)); this.callSignedContext(OperandV2.wrap(bytes32(uint256(0x010000)))); } diff --git a/test/concrete/parser/RaindexV6SubParser.signers.t.sol b/test/concrete/parser/RaindexV6SubParser.signers.t.sol index c766018729..8cd32f2a81 100644 --- a/test/concrete/parser/RaindexV6SubParser.signers.t.sol +++ b/test/concrete/parser/RaindexV6SubParser.signers.t.sol @@ -82,6 +82,6 @@ contract RaindexV6SubParserSignersTest is OpTest { bytes memory rainlang = bytes(string.concat("using-words-from ", subParserAddress.toHexString(), " _: signer<256>();")); - checkUnhappyParse(rainlang, abi.encodeWithSelector(ContextGridOverflow.selector, 8, 256)); + checkUnhappyParse(rainlang, abi.encodeWithSelector(ContextGridOverflow.selector, 7, 256)); } } diff --git a/test/lib/LibRaindexArb.finalizeArbContextWords.t.sol b/test/lib/LibRaindexArb.finalizeArbContextWords.t.sol deleted file mode 100644 index fa2e21f9ed..0000000000 --- a/test/lib/LibRaindexArb.finalizeArbContextWords.t.sol +++ /dev/null @@ -1,72 +0,0 @@ -// SPDX-License-Identifier: LicenseRef-DCL-1.0 -// SPDX-FileCopyrightText: Copyright (c) 2020 Rain Open Source Software Ltd -pragma solidity =0.8.25; - -import {Test} from "forge-std-1.17.0/src/Test.sol"; -import {stdError} from "forge-std-1.17.0/src/StdError.sol"; -import {Strings} from "@openzeppelin-contracts-5.7.0/utils/Strings.sol"; -import {EvaluableV4, SignedContextV1, TaskV2} from "raindex-interface-0.1.8/src/interface/IRaindexV6.sol"; -import {IInterpreterV4} from "rainlang-interface-0.2.13/src/interface/IInterpreterV4.sol"; -import {IInterpreterStoreV3} from "rainlang-interface-0.2.13/src/interface/IInterpreterStoreV3.sol"; -import {IParserV2} from "rainlang-interface-0.2.13/src/interface/IParserV2.sol"; -import { - LibTestInterpreterDeploy, - TEST_INTERPRETER_ADDRESS, - TEST_STORE_ADDRESS, - TEST_EXPRESSION_DEPLOYER_ADDRESS -} from "rainlang-0.2.19/test/lib/deploy/LibTestInterpreterDeploy.sol"; -import {LibTestArb} from "test/util/lib/LibTestArb.sol"; -import {LibEtchRaindex} from "test/util/lib/LibEtchRaindex.sol"; -import {LibTestContextWords} from "test/util/lib/LibTestContextWords.sol"; -import {LibRaindexDeploy} from "../../src/lib/deploy/LibRaindexDeploy.sol"; - -/// @title LibRaindexArbFinalizeArbContextWordsTest -/// @notice The post-arb task sees only the sender and the arb column: every -/// Raindex context word reverts out of bounds there. -contract LibRaindexArbFinalizeArbContextWordsTest is Test { - using Strings for address; - - function task(string memory body) internal returns (TaskV2 memory) { - LibTestInterpreterDeploy.etchTestRainlang(vm); - LibEtchRaindex.etchRaindex(vm); - bytes memory bytecode = IParserV2(TEST_EXPRESSION_DEPLOYER_ADDRESS) - .parse2( - bytes( - string.concat( - "using-words-from ", LibRaindexDeploy.SUB_PARSER_DEPLOYED_ADDRESS.toHexString(), "\n", body - ) - ) - ); - return TaskV2( - EvaluableV4(IInterpreterV4(TEST_INTERPRETER_ADDRESS), IInterpreterStoreV3(TEST_STORE_ADDRESS), bytecode), - new SignedContextV1[](0) - ); - } - - function arb(TaskV2 memory post) external { - LibTestArb.setupAndArb(vm, 80e18, 100e18, 100e18, 100e18, post, 0); - } - - function testArbTaskBaseColumnIsSenderOnly() external { - uint256 snapshot = vm.snapshotState(); - this.arb(task(string.concat(":ensure(equal-to(context<0 0>() ", address(this).toHexString(), ") \"sender\");"))); - vm.revertToState(snapshot); - TaskV2 memory post = task(":set(0 context<0 1>());"); - vm.expectRevert(stdError.indexOOBError); - this.arb(post); - } - - function testArbTaskRaindexWordsOutOfBounds() external { - string[] memory words = LibTestContextWords.allWords(); - for (uint256 i = 0; i < words.length; i++) { - if (keccak256(bytes(words[i])) == keccak256("context<7 0>()")) { - continue; - } - uint256 snapshot = vm.snapshotState(); - TaskV2 memory post = task(string.concat(":set(0 ", words[i], ");")); - vm.expectRevert(stdError.indexOOBError); - this.arb(post); - vm.revertToState(snapshot); - } - } -} diff --git a/test/lib/LibRaindexArb.finalizeArbTaskContext.t.sol b/test/lib/LibRaindexArb.finalizeArbTaskContext.t.sol index 2925b61256..849a85f685 100644 --- a/test/lib/LibRaindexArb.finalizeArbTaskContext.t.sol +++ b/test/lib/LibRaindexArb.finalizeArbTaskContext.t.sol @@ -17,8 +17,8 @@ import {LibTestArb, ArbResult} from "test/util/lib/LibTestArb.sol"; /// @title LibRaindexArbFinalizeArbTaskContextTest /// @notice Verifies that finalizeArb passes correct Float-encoded context to -/// the post-arb task: context<7 0>=input balance, context<7 1>=output balance, -/// context<7 2>=gas balance. Column 0 is the calling context added by LibContext. +/// the post-arb task: context<1 0>=input balance, context<1 1>=output balance, +/// context<1 2>=gas balance. Column 0 is the calling context added by LibContext. contract LibRaindexArbFinalizeArbTaskContextTest is Test { function testFinalizeArbTaskContextValues() external { LibTestInterpreterDeploy.etchTestRainlang(vm); @@ -32,9 +32,9 @@ contract LibRaindexArbFinalizeArbTaskContextTest is Test { bytes memory taskBytecode = parser.parse2( bytes( string.concat( - ":ensure(equal-to(context<7 0>() 20) \"input\"),", - ":ensure(equal-to(context<7 1>() 0) \"output\"),", - ":ensure(equal-to(context<7 2>() 0) \"gas\");" + ":ensure(equal-to(context<1 0>() 20) \"input\"),", + ":ensure(equal-to(context<1 1>() 0) \"output\"),", + ":ensure(equal-to(context<1 2>() 0) \"gas\");" ) ) ); @@ -57,7 +57,7 @@ contract LibRaindexArbFinalizeArbTaskContextTest is Test { assertEq(result.outputToken.balanceOf(address(result.arb)), 0, "arb outputToken"); } - /// Companion to the above: the output (context<7 1>) and gas (context<7 2>) + /// Companion to the above: the output (context<1 1>) and gas (context<1 2>) /// columns must carry the correct NON-ZERO Floats, not just zero. The /// sibling test only ever sees zero output/gas, so a mutation zeroing either /// column would survive it. Here input profit is zero while output profit is @@ -72,9 +72,9 @@ contract LibRaindexArbFinalizeArbTaskContextTest is Test { bytes memory taskBytecode = parser.parse2( bytes( string.concat( - ":ensure(equal-to(context<7 0>() 0) \"input\"),", - ":ensure(equal-to(context<7 1>() 20) \"output\"),", - ":ensure(equal-to(context<7 2>() 1) \"gas\");" + ":ensure(equal-to(context<1 0>() 0) \"input\"),", + ":ensure(equal-to(context<1 1>() 20) \"output\"),", + ":ensure(equal-to(context<1 2>() 1) \"gas\");" ) ) ); diff --git a/test/util/lib/LibTestContextWords.sol b/test/util/lib/LibTestContextWords.sol index c90ff96827..21ff5763fc 100644 --- a/test/util/lib/LibTestContextWords.sol +++ b/test/util/lib/LibTestContextWords.sol @@ -2,11 +2,10 @@ // SPDX-FileCopyrightText: Copyright (c) 2020 Rain Open Source Software Ltd pragma solidity ^0.8.25; -/// @dev Every Raindex context word, and a raw read of the arb column, as -/// rainlang call expressions. +/// @dev Every Raindex sub parser context word as a rainlang call expression. library LibTestContextWords { - function allWords() internal pure returns (string[] memory words) { - words = new string[](31); + function allWords() internal pure returns (string[] memory) { + string[] memory words = new string[](30); words[0] = "raindex()"; words[1] = "order-hash()"; words[2] = "order-owner()"; @@ -37,6 +36,6 @@ library LibTestContextWords { words[27] = "withdraw-vault-after()"; words[28] = "withdraw-target-amount()"; words[29] = "withdraw-token-decimals()"; - words[30] = "context<7 0>()"; + return words; } }