From 4f4145f0a40e14b87eaaa29a27891c88d91962f2 Mon Sep 17 00:00:00 2001 From: David Meister Date: Mon, 15 Jun 2026 00:37:39 +0000 Subject: [PATCH 1/4] pi constant word Add a `pi` standard op mirroring the existing `e` word (LibOpE), stacking the mathematical constant pi as a Float. - New `LibOpPi` library with integrity/run/referenceFn, encoding pi as a Float at the same precision/convention as `LibDecimalFloat.FLOAT_E` (67-digit coefficient * 10^-66; round-trips to pi to 66 decimal places). - Register `pi` in `LibAllStandardOps` between `mul` and `power` across all four parallel arrays (authoring meta, operand handlers, integrity pointers, opcode pointers); bump ALL_STANDARD_OPS_LENGTH 72 -> 73. - Update the word-ordering assertions in LibAllStandardOps.t.sol. - Add `LibOpPi.t.sol` mirroring `LibOpE.t.sol` (parse + eval to pi, integrity, operand-disallowed, bad input/output arity). - Regenerate bytecode pointer artifacts: interpreter, parser, expression deployer, and Rainlang `.pointers.sol` (creation/runtime code, deploy addresses, codehashes, parse-meta, function pointer tables) plus the CBOR authoring meta. Converged to a stable fixed point. This is a deployed-interpreter-bytecode change: the pinned deploy addresses and codehashes change, so landing REQUIRES the multi-network interpreter redeploy workflow (per #237 / the LibOpE class of change). Closes #225 Co-Authored-By: Claude Opus 4.8 --- meta/AuthoringMeta.rain.meta | Bin 17504 -> 17664 bytes meta/RainlangExpressionDeployer.rain.meta | Bin 3153 -> 3167 bytes src/generated/Rainlang.pointers.sol | 8 +- .../RainlangExpressionDeployer.pointers.sol | 12 +-- .../RainlangInterpreter.pointers.sol | 10 +-- src/generated/RainlangParser.pointers.sol | 14 +-- src/lib/op/LibAllStandardOps.sol | 8 +- src/lib/op/math/LibOpPi.sol | 49 +++++++++++ test/src/lib/op/LibAllStandardOps.t.sol | 28 +++--- test/src/lib/op/math/LibOpPi.t.sol | 82 ++++++++++++++++++ 10 files changed, 175 insertions(+), 36 deletions(-) create mode 100644 src/lib/op/math/LibOpPi.sol create mode 100644 test/src/lib/op/math/LibOpPi.t.sol diff --git a/meta/AuthoringMeta.rain.meta b/meta/AuthoringMeta.rain.meta index d7cb93f8d969d28edc1cf568e0a830f197fab51a..f0b10c47ca9072e5e7a938268727f75e7df65a1d 100644 GIT binary patch delta 475 zcmXAkOHRU27)JYdU{df&8i|ecUW{lE=>vQf9~2q6i#lYcJE$|`NW2@UYhVG^oz$J! z?_+Xua{jMvTD?pDA)ixuT8eKwnk>Oa1~$pf6uzZv%C>oRmA%8VOYUj&94Y2jg`vyr z()a0YjowC)11!bk-Yd}$x#`reiPx`DoU39fN@`V7n{RhnyA}K>2aj2LDZIyiQov6$ z^XBkTU;6w|pVu>92N^a4mUFlaxfzz|L5>o#g!G6W(PMfHw?`S4W0rA&azS2}@GD&H z>m0lRCE+q*nP~J$1>UmUmF9P}{{08$X=!FHB|OeD3?Iq4hR>^2>imVWFyFzw`DtkB Re1+b|%ObEWYo(L4`43)LZ?XUY delta 444 zcmXAlT~5M47)A5-ts+qjQ8B^{#`;IK6+wZh9reX!j60b}6I*uJP@eMLB0lG)lsL;oz6X zujBRyR{`Og;|<4&L7A|m^faK{R^Xi_Su%P?&*?e+o<23WoU%MP_>7!a@J9naS#Z%Z qz?TkO8It8$!(Xi5CQ8@~mZEu{6D2j)H}c)VKg`C)f7xccEIR)%c5J}_ diff --git a/meta/RainlangExpressionDeployer.rain.meta b/meta/RainlangExpressionDeployer.rain.meta index 59854716b0bf8f2a666565235295b00ecbfd5f7b..80a4f2d922971fefcefa4e260a12c07089012201 100644 GIT binary patch literal 3167 zcmV-l450J>3W>&a?s#;h09gzzc%0Q+Pjg$h5oa!)N&nZAHccjp5l>r7iAYOwowP~E zwJiTr$FW=4x6Wh;z6X+s9v|ojJW=c+@uAb{wdY>^A$rO5qDxP`^dtDv>DTBkfcK9S zf%l%oWWs}GaRKaa7rTqy1=MkWh=+dQCco;L|LUom{_Vb-{v8kfySLo*?-4is`)+dQ z2cGqR=%N3}!~c?p|D~61`fDEkuX*PG#54bO;-P!if5T1gyy>H#y6JD-a?{@?Zu&bO z{+B)TFTZfpiDy3X%zxK2|J|2v`jzKy`p-P;|NNGR?&1H77jF91zMH;5-1N_pHC=ncwYr=%;Ra@41_P&9nYB&-`uA{B6(t9nbt7&-~rKn||H1{`D7b z`Y%278>epi2YomF!{=`LuRQc$cRX~@{Evu-{?bkV*t7m`PTlmI9S_~Z|F@p?Z#{R@ z_xf)7Z4Z5)c<3*sqQOz8_2-s{zOgT+oJm4s!cMqUJRXr_8l{X36EPub%!o$NTeUzS zVi*vsHQ~FO;UgI%3s1yK)PUDvCyFI;OLTsGf8VE3WYvd^XoNsjLIc$!PXV5ovV_JV z;ZmdJamY@H80ueG9EgyGB;;~RRWJss{yq~G)=d&Rw+p3en(D7`l_5(Kn3-=#bAXc8zjF^#DET>ISB=*em{Qs&2%F%|f|PzAv8Oy0Y+Wf-J~jz7!EK6o3SL$iY8sEU=q>9?`4vC44k)B%n{e z=S%Ww7GIr!0ptfw1ZpVX|7`w2q)3y1pdZz!3F1VIT;J82wb3!fZ^;o00(t}?5@53=*xl~JbTOlG&^SQ* z@cs8bv(}xnz-_~P6d8lQk65e?6TZT2fYZLLbK?_M<7O}o!-Pq>bw;!nvlzT3ACTFC z8uO&swkd-h%SZLdLm}lHleuH?2aX|AkYOaib)+yS?-j^rc?|YI=yaNhV|GQmS$tK2 z6p2V&0n+GqKqC~rD~1=W-_LXXS{4_i-4(~7T_aasCZ7_DMqQasr_uaE<$I9Jr&$og zVp+&i)HqX~m0Og8yMQNjTl#?y|36yTKcN^fEwJSbX8kU)T0f2L*r%VrHMZZ@+No{Q zoz?O;wsW8Sf2?WWE2Z|CJgjl!`p)&Pwu4%bo8W)tTRDDXXgP3X3PE)OjRQW2SgGsq zNGMy;WW#J)gJ<%b+F>Y8ezo=O_&=M5ArNTHbs2sJNTxm5WpK4Fl`Po@{m|E*>I zIWG+%7PF>2FOUo z_-qkylWoF>gh3`hFC1ap-Jil%VwXKj;b2$dqVa#cgMdoa8P=nk*%n|G=vLTX=#jhl z9iD6e*kH>0;~`gYur=$e*2MS9t)~g2x@a`$B$-mKA(5Q(HKTAORO(^a5WOGyz^gKA z!bzw!8MGx1hA^raV8plcwiZwB1ourz-OM=VAuC_1WV~!YR6rjCN-`WW1m)_=KA@<_ zgW*EsB&&*{8y1F!C(MLYs{&OA)!3AC&=k;VLU!8$>zaI}D#`?}M0z@@Xx`VXxj&uL zL!%V5BDEajw{btW%l4+($m}G@)}xv1THcaw zaIV=O_(3J?)=EIokwDWn{g+-_$EvBHn{E6Hl)w^9H?e-jSkV$(4Saj3<%r5f3wA^= zOnU3ZF8qwpezkC)*JQ6HiPzge z?FrlzdM^0_#@Bg2^k5&>$AqK2DbSLiF>P#$L1=Qv>S{T-^a=U#IpBNoe{zRoswzt^ zVpA-*>B4Q-)}Jex+{FY_X2(2$LK809BGMb!&yPy9%_nCm`1jjkSsI(lE#*BuE5N%QT_<#Pu zu3rs62Us(qONShtAz*p5!3STnv54|gYGa3V3GULy$)>HUGR%Z3?dFy7;OjeN0}~b~ z!XUqj*BYO0n(PU$HW@;_Mou=Xq81UUR38=rX+lrdiEr~B+@G8137q&Oon#QqL#Vty zS{2}7RySrN2wummtIzif#rM~zC1eT1UIj!6s;?CE9dYS_7Uty^i7m^sM?^FkvEpRV zg99-30V|fomko9isW^yTBv`AChFt!skbF(@e_2cZLR`3y(b8IBv^;D$WC7xfu&~uP z>GK}hizWheQb~=n_bSkkjzR)r;pNR7F2x4s3P#%mEILC4f%f<)7Kv@%kOaEe`VB|r zPJY7MKd!BzpR)aeU@hzyy0>ez-+w+WA*;84a)PK=>|X}8-9|#Pje)eu4x)b6Xy1P> z>nGz=M^U=cK}|Jw>`FH4^ldGFdY<&#D?j-pjTE0ooUN!*ru;nYz5L%^oqtX_DrO3$ zz#8+fj}9qRre~z@_Pp2ZvxjE3vaRH4@>$aQ@p=t>2m3S%(g+O3njDlq(BXvaLS?Az zgXiiwUUZ7G6KMqlh^^;<@5R6M#K!KbdF9XW%Q`<3Vkt52juJ6b&0f>_@cpNxU;RfC zMHyhY;pG=Z1c*=l0bB$?3iUo-hqBF2RUZ;N=qVXOzxWFZuBY41R38WDMEnK!&903X zvVEngX^am%aZBNP4-(MqEg#go`e{ziCtGqWpN;PvvH-oLLny8pP1>lgmj3=-)*ms< z&ek00Z9|Ly9#Na$2-WFNcK_e9Pvp}d&HF?7i&qnPQE!zye!1x4fJom&fzbwx!7BX> zE9QiH&c^xf z<^0&@ISedPLSmzzX`2p~sS-9&;_~0FplR-GI=3jt-!2dE;h!v=|BbD1V&@06oh@eL zTAuSh`TnwWz8mvfJl>nxqP@7bN5#3EFdN?T9QMiohwAxjg-{8QvO2mpiq+naA9z8Y-wX*bZKvHFJoeFasy{%WoB$) FbY&a?s#;h09gzlc%0Q+OLH8z5vDJxavqh~<;0J2B3P9~q|IHCRAeVk zB9o#XR7#c-O1D(Gh@HXi!kitf1{f|k2b+gfD%YHI(T~W*m5VMp<&vMkOUi%4-2mpb z%LQhJyLNdGqPPv9zixClx*On{`$IhR12_3)&-9m{yXoKEb<@A+p?{ya=|5QW(9hlU zA9~jRk%#_@hyN=c{;$4p(_i!Of6X)hC!YDQuX*U6_1`#m)8F*a-+Jz*zfIiqpRRf6 z9{yK6^RJw_>BKXic;>(3ng7lUH~s37oBngp`oAC^x`+QS&)oEDyKegWnumVwrf-%ENnItqO?37Ez;{iFLQOZa^5hJ38jA#ViMGFKX zh5@l!5x#2~K9VuA@I_Q~edL(q~BmGxJS~(@~El zxbVY+Cxk0Dl13+p2B57<{z1M!Ggf2y8ti?ZNHwbpI|6=2=_n>hkqo|^8<2>};{EM$ zHQ|zVVEQWLW4F!vWbe@(4N8eIQ4?WQ3|3gOLGs5$^k^@dl2Cw39zA{v{~?nhRb(ns zFpx0|6zPkEge>4AFcq_Fvg-hl$rp$;Rvi&Dxm5X{?c=&~#)f)4rpXk307WtdLX+*x zIC%_axI9@i`Cu6MLL=Gg$oHQ+dfgcVrDW&k`zW6MQX%dMmAOYwxEhiSn)%XU$*}#2 z(#zqO`kRU&M=Tzw;cD%}fLyx%p5KkD`r{aPXY}_?swR_PB#mXSBY&9r|Kr1N#QpRA zl|$ZForv|Dg>s*KpFhEMW#QQbS&-gzE+Swk010@XgMZjqU^n|RqF3ch_+Z#bK%abP zbMk2xU!Q;hTuw*q%pTJ1bew~^q@5H5A_?(#OD>WWN9ZsTX>k_2$dJn6 z3iW&I0M^Iw2THO!vk_2&I1wW^cC=<~bWHJEa?FB&9z%!(*enTlwmL9fOlTZ54$wY) z|G&?yb>}Q_+b|zR#-Q(G7Hh+VuW%dSv@h%2_=MHC8BD`4VNz~h5Us@|25-p+WVWD& zJSnzq%wWgzQC;#-NIAu1?gadSW5^Vw9|>?BDa^@x74lgggFO&B9w*|2UDa+DUsE7O zA`(}CH2Uq)2u1IR{*v|kS*~BpVoBOva2(n-a^+?6DWPc8k?D9GO_wU)K`x(WK@5v| zAxlx?LU|T$Q3~z?p3rIO2R{7&YGMC`V!*V(<};YpyToGsG`3@(e*V$eep_p&wn?uo zmcOx``{e&~P5WLbwa?^Xjhi>NZ*;UB)Pmdu|4ZM=@f$Y6u1c z8i8-d(5cYu(S}$o(?lQg!vYTuEMQ)s(|llNMsPd~u;whu>^J~G#t(M3TOR-({jYt# z*nfcS*Khz>`LrgQA8-Et%_95CrMr|kW(*G(Z(zy)+w7xHzAu{Z->L&3Ib+B!M8Sd-nu&l=^RksomA~R62C4jLylnn&&-2fD zX$Y~HH08Ne{yI2zc&p}O4gNna^EZLG>ManWTe7aj|88N}v4}f=VTs5Z>|o{SD|z9w zNx)6E2=5aHnf$bHge`Y}3R{UC_AG^iU5RDm|LrycDphA#k7{O{fK{MdVSAxV?&5cN zvH@U&DesSmT*1NCtgl)V-%Gns6GnB>XwXSArd&fJIp^y};Yg^|!>}QGKk|XsWY&a} zP-!w~OFZbqsA7N--_F~dJ-HLyHzjp5|rksPOfKC&#+YVUQG?QJ+Tha~A zHTwfUsD#~G2nae7XxgU#(rxQlHT83=jemg>Sc2&$)~^^VT7s*AZx6K`Q8{bDj_8F+ zZ@t)sp8@(Wq+WP7uK@oaRDw=&;a*$TCM{4i*0hO^364{2fge9K$(sgZAO6SNb--hB zfPAy|UsaGTmk_*h%G(Hk`rtzJl@L1X#3uAU&MrfFKK5d<+hJ5!O{uAkH@-og-#^1tuYT$pk?FD}c=YbFHwM%Sj;=h8{13cgkKW~C# z+|8>9sCrh(|E;|+G~Ic7;R0HM?!hoGVCczUmHapM61XZJF~tKy;iv;wC+j0d;|+a# z0yl-8OTK{dRo)LB?8Ew)aFjO%TJjU7jZHBKP3~A-EeGd5AwRhUd@ufw?{G|2WywWs ziUl`axb52db0w3zm|)86m7jfB)}cZxiYnkb8_zA!d;bMwj63=l`?&Oh9yk3N)mnkbqctc{7Dev7Wht(KZ2#PEbLhJwAvg}H#A?gMDmqBf}k&tX-AZ@aPsGk+u_g~BU z$@tV!l&*A8Q;i+FlFd4OTg#tbCjIuxPd-i~#m5n63#ybcq~a^ge?B~&N3Y@IBb4QIJNkVRp-*^neZ{obD<^Wgi?@&(We&lbr|)7(i^h z1bi?4%_lZ?R<}2Q24B|sg%C@Lac7W-iE8$m&4=%QCH?9@QYg}J!woN=z#}0(9QB|P z4=K!hcpb?$K2b-ISV2$65RQt!VBmVX?F=2^;GBrR;J(?l@j~=SX=)nd154aexL$(< zFndb}^`?Frlk>@z+{|a=JA*7h&gl?}TSk*Ms;i~H|CaSf46}x;P-xH$h;u0b{VrQHB+BGCgN~CwRr{ui*b^^8cxN{#xN?j$fma#S(*fDL&AIM0D;i&A?9D;I51Rwtk;f z`Qs$11h$bKFXNBd6gL<;TgU0x69DCE@eiMr@xz%^8$JGA+028fnSuFR1Q@zd%C7)H radu(>8~;-NLh+zblLByIaBysCV_|e@Z*DJRVsCN-XJln&Y+-a|ao9!A diff --git a/src/generated/Rainlang.pointers.sol b/src/generated/Rainlang.pointers.sol index d1d7f43ec..651e03449 100644 --- a/src/generated/Rainlang.pointers.sol +++ b/src/generated/Rainlang.pointers.sol @@ -10,16 +10,16 @@ pragma solidity ^0.8.25; // file needs the contract to exist so that it can be compiled. /// @dev Hash of the known bytecode. -bytes32 constant BYTECODE_HASH = bytes32(0xe17c8ef9fd3ce9ca757925db43efe36b433229ca276f9eb3b02743d62bbc3014); +bytes32 constant BYTECODE_HASH = bytes32(0xe6cdd994c12e5626c2c0d6e0ad7c0fdf0bd290ea4c8a474e1f32ae040b12df6f); /// @dev The deterministic deploy address of the contract when deployed via /// the Zoltu factory. -address constant DEPLOYED_ADDRESS = address(0x3836774dD66F5e9d11553c0c4a4088d457eC603E); +address constant DEPLOYED_ADDRESS = address(0x7c08C22E0700E9bB51082907514F8F68806fEEA0); /// @dev The creation bytecode of the contract. bytes constant CREATION_CODE = - hex"6080604052348015600e575f80fd5b506101f78061001c5f395ff3fe608060405234801561000f575f80fd5b5060043610610064575f3560e01c8063107628021161004d57806310762802146100cb5780634501e517146100e5578063f2c4da93146100ff575f80fd5b806301ffc9a7146100685780630c1916a414610090575b5f80fd5b61007b6100763660046101b1565b610119565b60405190151581526020015b60405180910390f35b739179445a637e6ae72bb38273944fab96834488dd5b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610087565b73c9e1d673ed122193b28376016ac506de2fa20bee6100a6565b73b3a710b89a5569893da4ca0db7d178593b5be8a06100a6565b731aa775533e28b1d843e1a589034984e3a62005dc6100a6565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082167fabaa01220000000000000000000000000000000000000000000000000000000014806101ab57507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b92915050565b5f602082840312156101c1575f80fd5b81357fffffffff00000000000000000000000000000000000000000000000000000000811681146101f0575f80fd5b939250505056"; + hex"6080604052348015600e575f80fd5b506101f78061001c5f395ff3fe608060405234801561000f575f80fd5b5060043610610064575f3560e01c8063107628021161004d57806310762802146100cb5780634501e517146100e5578063f2c4da93146100ff575f80fd5b806301ffc9a7146100685780630c1916a414610090575b5f80fd5b61007b6100763660046101b1565b610119565b60405190151581526020015b60405180910390f35b73088bdb2b554e3cdeda4137beef92ffee1e9f4dbf5b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610087565b73c0bffccb665d3ebca5aba3816d94f35c8467d6f76100a6565b737e694007bb400ab2147a2060d2e48703f3fa1cef6100a6565b731aa775533e28b1d843e1a589034984e3a62005dc6100a6565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082167fabaa01220000000000000000000000000000000000000000000000000000000014806101ab57507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b92915050565b5f602082840312156101c1575f80fd5b81357fffffffff00000000000000000000000000000000000000000000000000000000811681146101f0575f80fd5b939250505056"; /// @dev The runtime bytecode of the contract. bytes constant RUNTIME_CODE = - hex"608060405234801561000f575f80fd5b5060043610610064575f3560e01c8063107628021161004d57806310762802146100cb5780634501e517146100e5578063f2c4da93146100ff575f80fd5b806301ffc9a7146100685780630c1916a414610090575b5f80fd5b61007b6100763660046101b1565b610119565b60405190151581526020015b60405180910390f35b739179445a637e6ae72bb38273944fab96834488dd5b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610087565b73c9e1d673ed122193b28376016ac506de2fa20bee6100a6565b73b3a710b89a5569893da4ca0db7d178593b5be8a06100a6565b731aa775533e28b1d843e1a589034984e3a62005dc6100a6565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082167fabaa01220000000000000000000000000000000000000000000000000000000014806101ab57507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b92915050565b5f602082840312156101c1575f80fd5b81357fffffffff00000000000000000000000000000000000000000000000000000000811681146101f0575f80fd5b939250505056"; + hex"608060405234801561000f575f80fd5b5060043610610064575f3560e01c8063107628021161004d57806310762802146100cb5780634501e517146100e5578063f2c4da93146100ff575f80fd5b806301ffc9a7146100685780630c1916a414610090575b5f80fd5b61007b6100763660046101b1565b610119565b60405190151581526020015b60405180910390f35b73088bdb2b554e3cdeda4137beef92ffee1e9f4dbf5b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610087565b73c0bffccb665d3ebca5aba3816d94f35c8467d6f76100a6565b737e694007bb400ab2147a2060d2e48703f3fa1cef6100a6565b731aa775533e28b1d843e1a589034984e3a62005dc6100a6565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082167fabaa01220000000000000000000000000000000000000000000000000000000014806101ab57507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b92915050565b5f602082840312156101c1575f80fd5b81357fffffffff00000000000000000000000000000000000000000000000000000000811681146101f0575f80fd5b939250505056"; diff --git a/src/generated/RainlangExpressionDeployer.pointers.sol b/src/generated/RainlangExpressionDeployer.pointers.sol index 5ffe71dd9..2b60ee208 100644 --- a/src/generated/RainlangExpressionDeployer.pointers.sol +++ b/src/generated/RainlangExpressionDeployer.pointers.sol @@ -10,23 +10,23 @@ pragma solidity ^0.8.25; // file needs the contract to exist so that it can be compiled. /// @dev Hash of the known bytecode. -bytes32 constant BYTECODE_HASH = bytes32(0x5a63ce8a1036d4495c1b30104a217c5e90458b3d469d334695e72c2e6da0484b); +bytes32 constant BYTECODE_HASH = bytes32(0x65c7c20b94c1878de8d25c6c0bd22ba470a9983719e274626e87e679b8da1df7); /// @dev The deterministic deploy address of the contract when deployed via /// the Zoltu factory. -address constant DEPLOYED_ADDRESS = address(0xC9e1D673eD122193b28376016AC506De2fA20beE); +address constant DEPLOYED_ADDRESS = address(0xC0BFfCcb665d3ebCa5Aba3816d94F35C8467d6f7); /// @dev The creation bytecode of the contract. bytes constant CREATION_CODE = - hex"6080604052348015600e575f80fd5b50611ca88061001c5f395ff3fe608060405234801561000f575f80fd5b5060043610610064575f3560e01c80636f5aa28d1161004d5780636f5aa28d146100b0578063a3869e14146100de578063b92d7553146100fe575f80fd5b806301ffc9a7146100685780635514ca2014610090575b5f80fd5b61007b610076366004611619565b610106565b60405190151581526020015b60405180910390f35b6100a361009e366004611658565b610282565b60405161008791906116c4565b6040517f0ae1ecb6c0f6314beaf4d4cd803ba14c900b0eecb1ecd39a52739cff9ae2c34a8152602001610087565b6100f16100ec366004611813565b610347565b60405161008791906118d9565b6100f1610468565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082167f6f5aa28d00000000000000000000000000000000000000000000000000000000148061019857507fffffffff0000000000000000000000000000000000000000000000000000000082167fa3869e1400000000000000000000000000000000000000000000000000000000145b806101e457507fffffffff0000000000000000000000000000000000000000000000000000000082167f5514ca2000000000000000000000000000000000000000000000000000000000145b8061023057507fffffffff0000000000000000000000000000000000000000000000000000000082167fb92d755300000000000000000000000000000000000000000000000000000000145b8061027c57507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b92915050565b604080516020810182526060815290517f5514ca20000000000000000000000000000000000000000000000000000000008152739179445a637e6ae72bb38273944fab96834488dd90635514ca20906102e190869086906004016118eb565b5f60405180830381865afa1580156102fb573d5f803e3d5ffd5b505050506040513d5f823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201604052610340919081019061195a565b9392505050565b6040517f7764fd9c0000000000000000000000000000000000000000000000000000000081526060905f908190739179445a637e6ae72bb38273944fab96834488dd90637764fd9c9061039e9087906004016118d9565b5f60405180830381865afa1580156103b8573d5f803e3d5ffd5b505050506040513d5f823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682016040526103fd9190810190611a39565b915091505f610416838351905160406020909202010190565b60408051602083820181019092528281529192508101610437818686610477565b5f61045b6040518060c0016040528060908152602001611c186090913987876104ba565b5091979650505050505050565b6060610472610879565b905090565b80600182510160200281015b8082101561049e578151855260209485019490910190610483565b50506104b56104aa8390565b848451602001610b4c565b505050565b60605f6104c684610b55565b85519091506020860190600290046104dd86610b6f565b8260020267ffffffffffffffff8111156104f9576104f9611729565b6040519080825280601f01601f191660200182016040528015610523576020820181803683370190505b509350602084015f5b8481101561086d575f806105408a84610d8c565b915091508184538060018501536002840193505f61055f8b848c610daf565b90505f601861056e8d87610e16565b0390505f61057c8d87610e45565b600402820190505b808210156107b757815162ffffff811690601d81901a600f81169160049190911c90601c1a61160f8c82106106015760808801516040517fc8344ab1000000000000000000000000000000000000000000000000000000008152600481019190915260248101839052604481018e90526064015b60405180910390fd5b50600281028d015160f01c5f806106168a8885565b9150915085821461066a5760808a01516040517fddf56071000000000000000000000000000000000000000000000000000000008152600481019190915260248101839052604481018790526064016105f8565b8481146106ba5760808a01516040517ffc8b5603000000000000000000000000000000000000000000000000000000008152600481019190915260248101829052604481018690526064016105f8565b895182111561070c5760808a01518a516040517f2cab6bff00000000000000000000000000000000000000000000000000000000815260048101929092526024820152604481018390526064016105f8565b8951829003808b5260408b0151111561076e5760808a01518a516040808d015190517f1bc5ab0f0000000000000000000000000000000000000000000000000000000081526004810193909352602483019190915260448201526064016105f8565b89518101808b5260208b0151101561078857895160208b01525b600181111561079957895160408b01525b50505060808701805160010190525050506004929092019150610584565b6107c18d87610e5c565b8360200151146108155782602001516107da8e88610e5c565b6040517f4d9c18dc000000000000000000000000000000000000000000000000000000008152600481019290925260248201526044016105f8565b8251841461085c5782516040517f4689f0b30000000000000000000000000000000000000000000000000000000081526004810191909152602481018590526044016105f8565b50506001909301925061052c915050565b50505050509392505050565b606061160f5f604890508091505f6040518061092001604052808467ffffffffffffffff1667ffffffffffffffff168152602001610e748152602001610ef08152602001610f5381526020016111ae81526020016111b781526020016111c181526020016111ca81526020016111e481526020016111b78152602001611289815260200161128981526020016112e481526020016113ad81526020016113ba81526020016111b781526020016111c181526020016113ba81526020016111b781526020016111c181526020016111c181526020016111b781526020016111b781526020016111b781526020016111ae81526020016111ae81526020016111ae81526020016111ae81526020016113c481526020016111b781526020016113e8815260200161140181526020016111b781526020016113c481526020016111b781526020016111b781526020016113ba81526020016111c181526020016111b781526020016111b781526020016111c1815260200161140a81526020016111b781526020016111c1815260200161140a81526020016111ae81526020016111c181526020016111c181526020016111c181526020016111c181526020016111b781526020016111c181526020016111c1815260200161140a81526020016111ae81526020016111ae815260200161140a81526020016111ae81526020016111ae815260200161140a81526020016111b781526020016111c1815260200161140a81526020016113ba81526020016113ba815260200161140a815260200161140a81526020016111ae815260200161140a815260200161140a815260200161140a81526020016111c18152602001611401815250905060608190506048815114610b3a5780516040517fc8b569010000000000000000000000000000000000000000000000000000000081526004810191909152602481018490526044016105f8565b610b4381611423565b94505050505090565b8083835e505050565b5f81515f03610b6557505f919050565b50602001515f1a90565b5f610b7982610b55565b90508015610d4a5781516001600283020190811115610bc657826040517f17f4bc5e0000000000000000000000000000000000000000000000000000000081526004016105f891906118d9565b82516020828501810191850101602160027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff860102860181019086015b808210610d0657815160f01c8481016004810185811115610c5157896040517e39ba560000000000000000000000000000000000000000000000000000000081526004016105f891906118d9565b81515f81901a90600181901a90600281901a9060031a80821180610c7457508281115b15610caf578d876040517feaf45f4f0000000000000000000000000000000000000000000000000000000081526004016105f8929190611b2a565b505050600481028201878114610cf3578b6040517ffbb8027a0000000000000000000000000000000000000000000000000000000081526004016105f891906118d9565b8397506002870396505050505050610c03565b838314610d4157866040517fde67b29a0000000000000000000000000000000000000000000000000000000081526004016105f891906118d9565b50505050505050565b600182511115610d8857816040517fd013da5d0000000000000000000000000000000000000000000000000000000081526004016105f891906118d9565b5050565b5f805f610d998585610e16565b51600281901a9660039190911a95509350505050565b610de46040518060c001604052805f81526020015f81526020015f8152602001606081526020015f8152602001606081525090565b506040805160c081018252838152602081018490529081019290925260608201525f608082015260a081019190915290565b5f80610e2184610b55565b60020260010190505f610e3485856114b3565b949091019093016020019392505050565b5f80610e518484610e16565b515f1a949350505050565b5f80610e688484610e16565b5160011a949350505050565b81515f90819061ffff8416908110610ecf57608085015185516040517feaa16f3300000000000000000000000000000000000000000000000000000000815260048101929092526024820152604481018290526064016105f8565b8460400151811115610ee357604085018190525b505f946001945092505050565b6060820151515f90819061ffff8416908110610ee35760808501516060860151516040517feb78945400000000000000000000000000000000000000000000000000000000815260048101929092526024820152604481018290526064016105f8565b6060820151515f90819061ffff8416908110610fb65760808501516060860151516040517feb78945400000000000000000000000000000000000000000000000000000000815260048101929092526024820152604481018290526064016105f8565b5f85606001518281518110610fcd57610fcd611b4b565b602002602001015190505f80610fe6839060a082901c90565b91509150611014827f18003f8e00000000000000000000000000000000000000000000000000000000611509565b611062576040517f23016c8900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff831660048201526024016105f8565b6040517f40c04edc00000000000000000000000000000000000000000000000000000000815260048101829052600f601089901c81166024830181905260148a901c9091166044830181905290915f90819073ffffffffffffffffffffffffffffffffffffffff8716906340c04edc906064016040805180830381865afa1580156110ef573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111139190611b78565b9150915083821461115a576040517f528cc0fb00000000000000000000000000000000000000000000000000000000815260048101859052602481018390526044016105f8565b82811461119d576040517fc5ff08dc00000000000000000000000000000000000000000000000000000000815260048101849052602481018290526044016105f8565b909b909a5098505050505050505050565b505f9160019150565b5060029160019150565b50600191829150565b5f806111d684846111e4565b506001958695509350505050565b5f8060ff83811690600885901c1680830361122b576040517f46f0ca6900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6101006112388284611b9a565b111561127a576040517f8abcdd3f00000000000000000000000000000000000000000000000000000000815260048101839052602481018290526044016105f8565b50600295600195509350505050565b5f8061ffff831660ff81118061129d575080155b156112d7576040517fc1be16a1000000000000000000000000000000000000000000000000000000008152600481018290526024016105f8565b5060019485945092505050565b60a08201515f90819061ffff841690600f601486901c811691601087901c90911690849081906113149086610d8c565b9150915081831461135b576040517f9199e58e00000000000000000000000000000000000000000000000000000000815260048101849052602481018390526044016105f8565b8381101561139f576040517fff13710800000000000000000000000000000000000000000000000000000000815260048101829052602481018590526044016105f8565b509791965090945050505050565b60101c600f169160019150565b5060039160019150565b5f80600f601084901c16806113da5760016113dc565b805b95600195509350505050565b5f80600f601084901c16600281116113da5760026113dc565b506002915f9150565b5f80600f601084901c16600181116113da5760026113dc565b60605f825160020267ffffffffffffffff81111561144357611443611729565b6040519080825280601f01601f19166020018201604052801561146d576020820181803683370190505b50905061ffff80196020850160208651028101600285015b818310156114a757805183518616908516178152602090920191600201611485565b50939695505050505050565b5f6114bd83610b55565b82106114f95781836040517ffcfaeff10000000000000000000000000000000000000000000000000000000081526004016105f8929190611bd2565b50600202016003015161ffff1690565b5f61151383611524565b80156103405750610340838361159e565b5f61154f827f01ffc9a70000000000000000000000000000000000000000000000000000000061159e565b15611597575f80611580847fffffffff000000000000000000000000000000000000000000000000000000006115c2565b9150915081801561158f575080155b949350505050565b505f919050565b5f805f6115ab85856115c2565b915091508180156115b95750805b95945050505050565b7f01ffc9a7000000000000000000000000000000000000000000000000000000005f818152600483905290819060208260248188617530fa92505f511515601f3d11169150509250929050565b611617611bea565b565b5f60208284031215611629575f80fd5b81357fffffffff0000000000000000000000000000000000000000000000000000000081168114610340575f80fd5b5f8060208385031215611669575f80fd5b823567ffffffffffffffff80821115611680575f80fd5b818501915085601f830112611693575f80fd5b8135818111156116a1575f80fd5b8660208285010111156116b2575f80fd5b60209290920196919550909350505050565b602080825282518282018290528051604084018190525f9291820190839060608601905b8083101561171e57835173ffffffffffffffffffffffffffffffffffffffff1682529284019260019290920191908401906116e8565b509695505050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6040516020810167ffffffffffffffff8111828210171561177957611779611729565b60405290565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156117c6576117c6611729565b604052919050565b5f67ffffffffffffffff8211156117e7576117e7611729565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b5f60208284031215611823575f80fd5b813567ffffffffffffffff811115611839575f80fd5b8201601f81018413611849575f80fd5b803561185c611857826117ce565b61177f565b818152856020838501011115611870575f80fd5b816020840160208301375f91810160200191909152949350505050565b5f81518084528060208401602086015e5f6020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b602081525f610340602083018461188d565b60208152816020820152818360408301375f818301604090810191909152601f9092017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0160101919050565b5f67ffffffffffffffff82111561195057611950611729565b5060051b60200190565b5f602080838503121561196b575f80fd5b825167ffffffffffffffff80821115611982575f80fd5b8185019150828287031215611995575f80fd5b61199d611756565b8251828111156119ab575f80fd5b80840193505086601f8401126119bf575f80fd5b825191506119cf61185783611937565b82815260059290921b830184019184810190888411156119ed575f80fd5b938501935b83851015611a2c57845173ffffffffffffffffffffffffffffffffffffffff81168114611a1d575f80fd5b825293850193908501906119f2565b8252509695505050505050565b5f8060408385031215611a4a575f80fd5b825167ffffffffffffffff80821115611a61575f80fd5b818501915085601f830112611a74575f80fd5b81516020611a84611857836117ce565b8281528882848701011115611a97575f80fd5b828286018383015e5f81840183015287820151909650935082841115611abb575f80fd5b838701935087601f850112611ace575f80fd5b83519250611ade61185784611937565b83815260059390931b8401810192818101925088841115611afd575f80fd5b938101935b83851015611b1b57845183529381019391810191611b02565b80955050505050509250929050565b604081525f611b3c604083018561188d565b90508260208301529392505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f8060408385031215611b89575f80fd5b505080516020909101519092909150565b8082018082111561027c577f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b828152604060208201525f61158f604083018461188d565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52605160045260245ffdfe0e740ef00f5311ae11b711c111ca11e411b71289128912e413ad13ba11b711c113ba11b711c111c111b711b711b711ae11ae11ae11ae13c411b713e8140111b713c411b711b713ba11c111b711b711c1140a11b711c1140a11ae11c111c111c111c111b711c111c1140a11ae11ae140a11ae11ae140a11b711c1140a13ba13ba140a140a11ae140a140a140a11c11401"; + hex"6080604052348015600e575f80fd5b50611cb28061001c5f395ff3fe608060405234801561000f575f80fd5b5060043610610064575f3560e01c80636f5aa28d1161004d5780636f5aa28d146100b0578063a3869e14146100de578063b92d7553146100fe575f80fd5b806301ffc9a7146100685780635514ca2014610090575b5f80fd5b61007b610076366004611621565b610106565b60405190151581526020015b60405180910390f35b6100a361009e366004611660565b610282565b60405161008791906116cc565b6040517fc5a28e7d9dcddeae423dae076cbc7510e07229c5aac6e894727caa6ebf1353fa8152602001610087565b6100f16100ec36600461181b565b610347565b60405161008791906118e1565b6100f1610468565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082167f6f5aa28d00000000000000000000000000000000000000000000000000000000148061019857507fffffffff0000000000000000000000000000000000000000000000000000000082167fa3869e1400000000000000000000000000000000000000000000000000000000145b806101e457507fffffffff0000000000000000000000000000000000000000000000000000000082167f5514ca2000000000000000000000000000000000000000000000000000000000145b8061023057507fffffffff0000000000000000000000000000000000000000000000000000000082167fb92d755300000000000000000000000000000000000000000000000000000000145b8061027c57507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b92915050565b604080516020810182526060815290517f5514ca2000000000000000000000000000000000000000000000000000000000815273088bdb2b554e3cdeda4137beef92ffee1e9f4dbf90635514ca20906102e190869086906004016118f3565b5f60405180830381865afa1580156102fb573d5f803e3d5ffd5b505050506040513d5f823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682016040526103409190810190611962565b9392505050565b6040517f7764fd9c0000000000000000000000000000000000000000000000000000000081526060905f90819073088bdb2b554e3cdeda4137beef92ffee1e9f4dbf90637764fd9c9061039e9087906004016118e1565b5f60405180830381865afa1580156103b8573d5f803e3d5ffd5b505050506040513d5f823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682016040526103fd9190810190611a41565b915091505f610416838351905160406020909202010190565b60408051602083820181019092528281529192508101610437818686610477565b5f61045b6040518060c0016040528060928152602001611c206092913987876104ba565b5091979650505050505050565b6060610472610879565b905090565b80600182510160200281015b8082101561049e578151855260209485019490910190610483565b50506104b56104aa8390565b848451602001610b54565b505050565b60605f6104c684610b5d565b85519091506020860190600290046104dd86610b77565b8260020267ffffffffffffffff8111156104f9576104f9611731565b6040519080825280601f01601f191660200182016040528015610523576020820181803683370190505b509350602084015f5b8481101561086d575f806105408a84610d94565b915091508184538060018501536002840193505f61055f8b848c610db7565b90505f601861056e8d87610e1e565b0390505f61057c8d87610e4d565b600402820190505b808210156107b757815162ffffff811690601d81901a600f81169160049190911c90601c1a6116178c82106106015760808801516040517fc8344ab1000000000000000000000000000000000000000000000000000000008152600481019190915260248101839052604481018e90526064015b60405180910390fd5b50600281028d015160f01c5f806106168a8885565b9150915085821461066a5760808a01516040517fddf56071000000000000000000000000000000000000000000000000000000008152600481019190915260248101839052604481018790526064016105f8565b8481146106ba5760808a01516040517ffc8b5603000000000000000000000000000000000000000000000000000000008152600481019190915260248101829052604481018690526064016105f8565b895182111561070c5760808a01518a516040517f2cab6bff00000000000000000000000000000000000000000000000000000000815260048101929092526024820152604481018390526064016105f8565b8951829003808b5260408b0151111561076e5760808a01518a516040808d015190517f1bc5ab0f0000000000000000000000000000000000000000000000000000000081526004810193909352602483019190915260448201526064016105f8565b89518101808b5260208b0151101561078857895160208b01525b600181111561079957895160408b01525b50505060808701805160010190525050506004929092019150610584565b6107c18d87610e64565b8360200151146108155782602001516107da8e88610e64565b6040517f4d9c18dc000000000000000000000000000000000000000000000000000000008152600481019290925260248201526044016105f8565b8251841461085c5782516040517f4689f0b30000000000000000000000000000000000000000000000000000000081526004810191909152602481018590526044016105f8565b50506001909301925061052c915050565b50505050509392505050565b60606116175f604990508091505f6040518061094001604052808467ffffffffffffffff1667ffffffffffffffff168152602001610e7c8152602001610ef88152602001610f5b81526020016111b681526020016111bf81526020016111c981526020016111d281526020016111ec81526020016111bf8152602001611291815260200161129181526020016112ec81526020016113b581526020016113c281526020016111bf81526020016111c981526020016113c281526020016111bf81526020016111c981526020016111c981526020016111bf81526020016111bf81526020016111bf81526020016111b681526020016111b681526020016111b681526020016111b681526020016113cc81526020016111bf81526020016113f0815260200161140981526020016111bf81526020016113cc81526020016111bf81526020016111bf81526020016113c281526020016111c981526020016111bf81526020016111bf81526020016111c9815260200161141281526020016111bf81526020016111c9815260200161141281526020016111b681526020016111c981526020016111c981526020016111c981526020016111c981526020016111bf81526020016111c981526020016111c9815260200161141281526020016111b681526020016111b6815260200161141281526020016111b681526020016111b6815260200161141281526020016111b681526020016111bf81526020016111c9815260200161141281526020016113c281526020016113c28152602001611412815260200161141281526020016111b681526020016114128152602001611412815260200161141281526020016111c98152602001611409815250905060608190506049815114610b425780516040517fc8b569010000000000000000000000000000000000000000000000000000000081526004810191909152602481018490526044016105f8565b610b4b8161142b565b94505050505090565b8083835e505050565b5f81515f03610b6d57505f919050565b50602001515f1a90565b5f610b8182610b5d565b90508015610d525781516001600283020190811115610bce57826040517f17f4bc5e0000000000000000000000000000000000000000000000000000000081526004016105f891906118e1565b82516020828501810191850101602160027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff860102860181019086015b808210610d0e57815160f01c8481016004810185811115610c5957896040517e39ba560000000000000000000000000000000000000000000000000000000081526004016105f891906118e1565b81515f81901a90600181901a90600281901a9060031a80821180610c7c57508281115b15610cb7578d876040517feaf45f4f0000000000000000000000000000000000000000000000000000000081526004016105f8929190611b32565b505050600481028201878114610cfb578b6040517ffbb8027a0000000000000000000000000000000000000000000000000000000081526004016105f891906118e1565b8397506002870396505050505050610c0b565b838314610d4957866040517fde67b29a0000000000000000000000000000000000000000000000000000000081526004016105f891906118e1565b50505050505050565b600182511115610d9057816040517fd013da5d0000000000000000000000000000000000000000000000000000000081526004016105f891906118e1565b5050565b5f805f610da18585610e1e565b51600281901a9660039190911a95509350505050565b610dec6040518060c001604052805f81526020015f81526020015f8152602001606081526020015f8152602001606081525090565b506040805160c081018252838152602081018490529081019290925260608201525f608082015260a081019190915290565b5f80610e2984610b5d565b60020260010190505f610e3c85856114bb565b949091019093016020019392505050565b5f80610e598484610e1e565b515f1a949350505050565b5f80610e708484610e1e565b5160011a949350505050565b81515f90819061ffff8416908110610ed757608085015185516040517feaa16f3300000000000000000000000000000000000000000000000000000000815260048101929092526024820152604481018290526064016105f8565b8460400151811115610eeb57604085018190525b505f946001945092505050565b6060820151515f90819061ffff8416908110610eeb5760808501516060860151516040517feb78945400000000000000000000000000000000000000000000000000000000815260048101929092526024820152604481018290526064016105f8565b6060820151515f90819061ffff8416908110610fbe5760808501516060860151516040517feb78945400000000000000000000000000000000000000000000000000000000815260048101929092526024820152604481018290526064016105f8565b5f85606001518281518110610fd557610fd5611b53565b602002602001015190505f80610fee839060a082901c90565b9150915061101c827f18003f8e00000000000000000000000000000000000000000000000000000000611511565b61106a576040517f23016c8900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff831660048201526024016105f8565b6040517f40c04edc00000000000000000000000000000000000000000000000000000000815260048101829052600f601089901c81166024830181905260148a901c9091166044830181905290915f90819073ffffffffffffffffffffffffffffffffffffffff8716906340c04edc906064016040805180830381865afa1580156110f7573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061111b9190611b80565b91509150838214611162576040517f528cc0fb00000000000000000000000000000000000000000000000000000000815260048101859052602481018390526044016105f8565b8281146111a5576040517fc5ff08dc00000000000000000000000000000000000000000000000000000000815260048101849052602481018290526044016105f8565b909b909a5098505050505050505050565b505f9160019150565b5060029160019150565b50600191829150565b5f806111de84846111ec565b506001958695509350505050565b5f8060ff83811690600885901c16808303611233576040517f46f0ca6900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6101006112408284611ba2565b1115611282576040517f8abcdd3f00000000000000000000000000000000000000000000000000000000815260048101839052602481018290526044016105f8565b50600295600195509350505050565b5f8061ffff831660ff8111806112a5575080155b156112df576040517fc1be16a1000000000000000000000000000000000000000000000000000000008152600481018290526024016105f8565b5060019485945092505050565b60a08201515f90819061ffff841690600f601486901c811691601087901c909116908490819061131c9086610d94565b91509150818314611363576040517f9199e58e00000000000000000000000000000000000000000000000000000000815260048101849052602481018390526044016105f8565b838110156113a7576040517fff13710800000000000000000000000000000000000000000000000000000000815260048101829052602481018590526044016105f8565b509791965090945050505050565b60101c600f169160019150565b5060039160019150565b5f80600f601084901c16806113e25760016113e4565b805b95600195509350505050565b5f80600f601084901c16600281116113e25760026113e4565b506002915f9150565b5f80600f601084901c16600181116113e25760026113e4565b60605f825160020267ffffffffffffffff81111561144b5761144b611731565b6040519080825280601f01601f191660200182016040528015611475576020820181803683370190505b50905061ffff80196020850160208651028101600285015b818310156114af5780518351861690851617815260209092019160020161148d565b50939695505050505050565b5f6114c583610b5d565b82106115015781836040517ffcfaeff10000000000000000000000000000000000000000000000000000000081526004016105f8929190611bda565b50600202016003015161ffff1690565b5f61151b8361152c565b8015610340575061034083836115a6565b5f611557827f01ffc9a7000000000000000000000000000000000000000000000000000000006115a6565b1561159f575f80611588847fffffffff000000000000000000000000000000000000000000000000000000006115ca565b91509150818015611597575080155b949350505050565b505f919050565b5f805f6115b385856115ca565b915091508180156115c15750805b95945050505050565b7f01ffc9a7000000000000000000000000000000000000000000000000000000005f818152600483905290819060208260248188617530fa92505f511515601f3d11169150509250929050565b61161f611bf2565b565b5f60208284031215611631575f80fd5b81357fffffffff0000000000000000000000000000000000000000000000000000000081168114610340575f80fd5b5f8060208385031215611671575f80fd5b823567ffffffffffffffff80821115611688575f80fd5b818501915085601f83011261169b575f80fd5b8135818111156116a9575f80fd5b8660208285010111156116ba575f80fd5b60209290920196919550909350505050565b602080825282518282018290528051604084018190525f9291820190839060608601905b8083101561172657835173ffffffffffffffffffffffffffffffffffffffff1682529284019260019290920191908401906116f0565b509695505050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6040516020810167ffffffffffffffff8111828210171561178157611781611731565b60405290565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156117ce576117ce611731565b604052919050565b5f67ffffffffffffffff8211156117ef576117ef611731565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b5f6020828403121561182b575f80fd5b813567ffffffffffffffff811115611841575f80fd5b8201601f81018413611851575f80fd5b803561186461185f826117d6565b611787565b818152856020838501011115611878575f80fd5b816020840160208301375f91810160200191909152949350505050565b5f81518084528060208401602086015e5f6020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b602081525f6103406020830184611895565b60208152816020820152818360408301375f818301604090810191909152601f9092017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0160101919050565b5f67ffffffffffffffff82111561195857611958611731565b5060051b60200190565b5f6020808385031215611973575f80fd5b825167ffffffffffffffff8082111561198a575f80fd5b818501915082828703121561199d575f80fd5b6119a561175e565b8251828111156119b3575f80fd5b80840193505086601f8401126119c7575f80fd5b825191506119d761185f8361193f565b82815260059290921b830184019184810190888411156119f5575f80fd5b938501935b83851015611a3457845173ffffffffffffffffffffffffffffffffffffffff81168114611a25575f80fd5b825293850193908501906119fa565b8252509695505050505050565b5f8060408385031215611a52575f80fd5b825167ffffffffffffffff80821115611a69575f80fd5b818501915085601f830112611a7c575f80fd5b81516020611a8c61185f836117d6565b8281528882848701011115611a9f575f80fd5b828286018383015e5f81840183015287820151909650935082841115611ac3575f80fd5b838701935087601f850112611ad6575f80fd5b83519250611ae661185f8461193f565b83815260059390931b8401810192818101925088841115611b05575f80fd5b938101935b83851015611b2357845183529381019391810191611b0a565b80955050505050509250929050565b604081525f611b446040830185611895565b90508260208301529392505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f8060408385031215611b91575f80fd5b505080516020909101519092909150565b8082018082111561027c577f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b828152604060208201525f6115976040830184611895565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52605160045260245ffdfe0e7c0ef80f5b11b611bf11c911d211ec11bf1291129112ec13b513c211bf11c913c211bf11c911c911bf11bf11bf11b611b611b611b613cc11bf13f0140911bf13cc11bf11bf13c211c911bf11bf11c9141211bf11c9141211b611c911c911c911c911bf11c911c9141211b611b6141211b611b6141211b611bf11c9141213c213c21412141211b614121412141211c91409"; /// @dev The runtime bytecode of the contract. bytes constant RUNTIME_CODE = - hex"608060405234801561000f575f80fd5b5060043610610064575f3560e01c80636f5aa28d1161004d5780636f5aa28d146100b0578063a3869e14146100de578063b92d7553146100fe575f80fd5b806301ffc9a7146100685780635514ca2014610090575b5f80fd5b61007b610076366004611619565b610106565b60405190151581526020015b60405180910390f35b6100a361009e366004611658565b610282565b60405161008791906116c4565b6040517f0ae1ecb6c0f6314beaf4d4cd803ba14c900b0eecb1ecd39a52739cff9ae2c34a8152602001610087565b6100f16100ec366004611813565b610347565b60405161008791906118d9565b6100f1610468565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082167f6f5aa28d00000000000000000000000000000000000000000000000000000000148061019857507fffffffff0000000000000000000000000000000000000000000000000000000082167fa3869e1400000000000000000000000000000000000000000000000000000000145b806101e457507fffffffff0000000000000000000000000000000000000000000000000000000082167f5514ca2000000000000000000000000000000000000000000000000000000000145b8061023057507fffffffff0000000000000000000000000000000000000000000000000000000082167fb92d755300000000000000000000000000000000000000000000000000000000145b8061027c57507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b92915050565b604080516020810182526060815290517f5514ca20000000000000000000000000000000000000000000000000000000008152739179445a637e6ae72bb38273944fab96834488dd90635514ca20906102e190869086906004016118eb565b5f60405180830381865afa1580156102fb573d5f803e3d5ffd5b505050506040513d5f823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201604052610340919081019061195a565b9392505050565b6040517f7764fd9c0000000000000000000000000000000000000000000000000000000081526060905f908190739179445a637e6ae72bb38273944fab96834488dd90637764fd9c9061039e9087906004016118d9565b5f60405180830381865afa1580156103b8573d5f803e3d5ffd5b505050506040513d5f823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682016040526103fd9190810190611a39565b915091505f610416838351905160406020909202010190565b60408051602083820181019092528281529192508101610437818686610477565b5f61045b6040518060c0016040528060908152602001611c186090913987876104ba565b5091979650505050505050565b6060610472610879565b905090565b80600182510160200281015b8082101561049e578151855260209485019490910190610483565b50506104b56104aa8390565b848451602001610b4c565b505050565b60605f6104c684610b55565b85519091506020860190600290046104dd86610b6f565b8260020267ffffffffffffffff8111156104f9576104f9611729565b6040519080825280601f01601f191660200182016040528015610523576020820181803683370190505b509350602084015f5b8481101561086d575f806105408a84610d8c565b915091508184538060018501536002840193505f61055f8b848c610daf565b90505f601861056e8d87610e16565b0390505f61057c8d87610e45565b600402820190505b808210156107b757815162ffffff811690601d81901a600f81169160049190911c90601c1a61160f8c82106106015760808801516040517fc8344ab1000000000000000000000000000000000000000000000000000000008152600481019190915260248101839052604481018e90526064015b60405180910390fd5b50600281028d015160f01c5f806106168a8885565b9150915085821461066a5760808a01516040517fddf56071000000000000000000000000000000000000000000000000000000008152600481019190915260248101839052604481018790526064016105f8565b8481146106ba5760808a01516040517ffc8b5603000000000000000000000000000000000000000000000000000000008152600481019190915260248101829052604481018690526064016105f8565b895182111561070c5760808a01518a516040517f2cab6bff00000000000000000000000000000000000000000000000000000000815260048101929092526024820152604481018390526064016105f8565b8951829003808b5260408b0151111561076e5760808a01518a516040808d015190517f1bc5ab0f0000000000000000000000000000000000000000000000000000000081526004810193909352602483019190915260448201526064016105f8565b89518101808b5260208b0151101561078857895160208b01525b600181111561079957895160408b01525b50505060808701805160010190525050506004929092019150610584565b6107c18d87610e5c565b8360200151146108155782602001516107da8e88610e5c565b6040517f4d9c18dc000000000000000000000000000000000000000000000000000000008152600481019290925260248201526044016105f8565b8251841461085c5782516040517f4689f0b30000000000000000000000000000000000000000000000000000000081526004810191909152602481018590526044016105f8565b50506001909301925061052c915050565b50505050509392505050565b606061160f5f604890508091505f6040518061092001604052808467ffffffffffffffff1667ffffffffffffffff168152602001610e748152602001610ef08152602001610f5381526020016111ae81526020016111b781526020016111c181526020016111ca81526020016111e481526020016111b78152602001611289815260200161128981526020016112e481526020016113ad81526020016113ba81526020016111b781526020016111c181526020016113ba81526020016111b781526020016111c181526020016111c181526020016111b781526020016111b781526020016111b781526020016111ae81526020016111ae81526020016111ae81526020016111ae81526020016113c481526020016111b781526020016113e8815260200161140181526020016111b781526020016113c481526020016111b781526020016111b781526020016113ba81526020016111c181526020016111b781526020016111b781526020016111c1815260200161140a81526020016111b781526020016111c1815260200161140a81526020016111ae81526020016111c181526020016111c181526020016111c181526020016111c181526020016111b781526020016111c181526020016111c1815260200161140a81526020016111ae81526020016111ae815260200161140a81526020016111ae81526020016111ae815260200161140a81526020016111b781526020016111c1815260200161140a81526020016113ba81526020016113ba815260200161140a815260200161140a81526020016111ae815260200161140a815260200161140a815260200161140a81526020016111c18152602001611401815250905060608190506048815114610b3a5780516040517fc8b569010000000000000000000000000000000000000000000000000000000081526004810191909152602481018490526044016105f8565b610b4381611423565b94505050505090565b8083835e505050565b5f81515f03610b6557505f919050565b50602001515f1a90565b5f610b7982610b55565b90508015610d4a5781516001600283020190811115610bc657826040517f17f4bc5e0000000000000000000000000000000000000000000000000000000081526004016105f891906118d9565b82516020828501810191850101602160027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff860102860181019086015b808210610d0657815160f01c8481016004810185811115610c5157896040517e39ba560000000000000000000000000000000000000000000000000000000081526004016105f891906118d9565b81515f81901a90600181901a90600281901a9060031a80821180610c7457508281115b15610caf578d876040517feaf45f4f0000000000000000000000000000000000000000000000000000000081526004016105f8929190611b2a565b505050600481028201878114610cf3578b6040517ffbb8027a0000000000000000000000000000000000000000000000000000000081526004016105f891906118d9565b8397506002870396505050505050610c03565b838314610d4157866040517fde67b29a0000000000000000000000000000000000000000000000000000000081526004016105f891906118d9565b50505050505050565b600182511115610d8857816040517fd013da5d0000000000000000000000000000000000000000000000000000000081526004016105f891906118d9565b5050565b5f805f610d998585610e16565b51600281901a9660039190911a95509350505050565b610de46040518060c001604052805f81526020015f81526020015f8152602001606081526020015f8152602001606081525090565b506040805160c081018252838152602081018490529081019290925260608201525f608082015260a081019190915290565b5f80610e2184610b55565b60020260010190505f610e3485856114b3565b949091019093016020019392505050565b5f80610e518484610e16565b515f1a949350505050565b5f80610e688484610e16565b5160011a949350505050565b81515f90819061ffff8416908110610ecf57608085015185516040517feaa16f3300000000000000000000000000000000000000000000000000000000815260048101929092526024820152604481018290526064016105f8565b8460400151811115610ee357604085018190525b505f946001945092505050565b6060820151515f90819061ffff8416908110610ee35760808501516060860151516040517feb78945400000000000000000000000000000000000000000000000000000000815260048101929092526024820152604481018290526064016105f8565b6060820151515f90819061ffff8416908110610fb65760808501516060860151516040517feb78945400000000000000000000000000000000000000000000000000000000815260048101929092526024820152604481018290526064016105f8565b5f85606001518281518110610fcd57610fcd611b4b565b602002602001015190505f80610fe6839060a082901c90565b91509150611014827f18003f8e00000000000000000000000000000000000000000000000000000000611509565b611062576040517f23016c8900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff831660048201526024016105f8565b6040517f40c04edc00000000000000000000000000000000000000000000000000000000815260048101829052600f601089901c81166024830181905260148a901c9091166044830181905290915f90819073ffffffffffffffffffffffffffffffffffffffff8716906340c04edc906064016040805180830381865afa1580156110ef573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111139190611b78565b9150915083821461115a576040517f528cc0fb00000000000000000000000000000000000000000000000000000000815260048101859052602481018390526044016105f8565b82811461119d576040517fc5ff08dc00000000000000000000000000000000000000000000000000000000815260048101849052602481018290526044016105f8565b909b909a5098505050505050505050565b505f9160019150565b5060029160019150565b50600191829150565b5f806111d684846111e4565b506001958695509350505050565b5f8060ff83811690600885901c1680830361122b576040517f46f0ca6900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6101006112388284611b9a565b111561127a576040517f8abcdd3f00000000000000000000000000000000000000000000000000000000815260048101839052602481018290526044016105f8565b50600295600195509350505050565b5f8061ffff831660ff81118061129d575080155b156112d7576040517fc1be16a1000000000000000000000000000000000000000000000000000000008152600481018290526024016105f8565b5060019485945092505050565b60a08201515f90819061ffff841690600f601486901c811691601087901c90911690849081906113149086610d8c565b9150915081831461135b576040517f9199e58e00000000000000000000000000000000000000000000000000000000815260048101849052602481018390526044016105f8565b8381101561139f576040517fff13710800000000000000000000000000000000000000000000000000000000815260048101829052602481018590526044016105f8565b509791965090945050505050565b60101c600f169160019150565b5060039160019150565b5f80600f601084901c16806113da5760016113dc565b805b95600195509350505050565b5f80600f601084901c16600281116113da5760026113dc565b506002915f9150565b5f80600f601084901c16600181116113da5760026113dc565b60605f825160020267ffffffffffffffff81111561144357611443611729565b6040519080825280601f01601f19166020018201604052801561146d576020820181803683370190505b50905061ffff80196020850160208651028101600285015b818310156114a757805183518616908516178152602090920191600201611485565b50939695505050505050565b5f6114bd83610b55565b82106114f95781836040517ffcfaeff10000000000000000000000000000000000000000000000000000000081526004016105f8929190611bd2565b50600202016003015161ffff1690565b5f61151383611524565b80156103405750610340838361159e565b5f61154f827f01ffc9a70000000000000000000000000000000000000000000000000000000061159e565b15611597575f80611580847fffffffff000000000000000000000000000000000000000000000000000000006115c2565b9150915081801561158f575080155b949350505050565b505f919050565b5f805f6115ab85856115c2565b915091508180156115b95750805b95945050505050565b7f01ffc9a7000000000000000000000000000000000000000000000000000000005f818152600483905290819060208260248188617530fa92505f511515601f3d11169150509250929050565b611617611bea565b565b5f60208284031215611629575f80fd5b81357fffffffff0000000000000000000000000000000000000000000000000000000081168114610340575f80fd5b5f8060208385031215611669575f80fd5b823567ffffffffffffffff80821115611680575f80fd5b818501915085601f830112611693575f80fd5b8135818111156116a1575f80fd5b8660208285010111156116b2575f80fd5b60209290920196919550909350505050565b602080825282518282018290528051604084018190525f9291820190839060608601905b8083101561171e57835173ffffffffffffffffffffffffffffffffffffffff1682529284019260019290920191908401906116e8565b509695505050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6040516020810167ffffffffffffffff8111828210171561177957611779611729565b60405290565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156117c6576117c6611729565b604052919050565b5f67ffffffffffffffff8211156117e7576117e7611729565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b5f60208284031215611823575f80fd5b813567ffffffffffffffff811115611839575f80fd5b8201601f81018413611849575f80fd5b803561185c611857826117ce565b61177f565b818152856020838501011115611870575f80fd5b816020840160208301375f91810160200191909152949350505050565b5f81518084528060208401602086015e5f6020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b602081525f610340602083018461188d565b60208152816020820152818360408301375f818301604090810191909152601f9092017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0160101919050565b5f67ffffffffffffffff82111561195057611950611729565b5060051b60200190565b5f602080838503121561196b575f80fd5b825167ffffffffffffffff80821115611982575f80fd5b8185019150828287031215611995575f80fd5b61199d611756565b8251828111156119ab575f80fd5b80840193505086601f8401126119bf575f80fd5b825191506119cf61185783611937565b82815260059290921b830184019184810190888411156119ed575f80fd5b938501935b83851015611a2c57845173ffffffffffffffffffffffffffffffffffffffff81168114611a1d575f80fd5b825293850193908501906119f2565b8252509695505050505050565b5f8060408385031215611a4a575f80fd5b825167ffffffffffffffff80821115611a61575f80fd5b818501915085601f830112611a74575f80fd5b81516020611a84611857836117ce565b8281528882848701011115611a97575f80fd5b828286018383015e5f81840183015287820151909650935082841115611abb575f80fd5b838701935087601f850112611ace575f80fd5b83519250611ade61185784611937565b83815260059390931b8401810192818101925088841115611afd575f80fd5b938101935b83851015611b1b57845183529381019391810191611b02565b80955050505050509250929050565b604081525f611b3c604083018561188d565b90508260208301529392505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f8060408385031215611b89575f80fd5b505080516020909101519092909150565b8082018082111561027c577f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b828152604060208201525f61158f604083018461188d565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52605160045260245ffdfe0e740ef00f5311ae11b711c111ca11e411b71289128912e413ad13ba11b711c113ba11b711c111c111b711b711b711ae11ae11ae11ae13c411b713e8140111b713c411b711b713ba11c111b711b711c1140a11b711c1140a11ae11c111c111c111c111b711c111c1140a11ae11ae140a11ae11ae140a11b711c1140a13ba13ba140a140a11ae140a140a140a11c11401"; + hex"608060405234801561000f575f80fd5b5060043610610064575f3560e01c80636f5aa28d1161004d5780636f5aa28d146100b0578063a3869e14146100de578063b92d7553146100fe575f80fd5b806301ffc9a7146100685780635514ca2014610090575b5f80fd5b61007b610076366004611621565b610106565b60405190151581526020015b60405180910390f35b6100a361009e366004611660565b610282565b60405161008791906116cc565b6040517fc5a28e7d9dcddeae423dae076cbc7510e07229c5aac6e894727caa6ebf1353fa8152602001610087565b6100f16100ec36600461181b565b610347565b60405161008791906118e1565b6100f1610468565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082167f6f5aa28d00000000000000000000000000000000000000000000000000000000148061019857507fffffffff0000000000000000000000000000000000000000000000000000000082167fa3869e1400000000000000000000000000000000000000000000000000000000145b806101e457507fffffffff0000000000000000000000000000000000000000000000000000000082167f5514ca2000000000000000000000000000000000000000000000000000000000145b8061023057507fffffffff0000000000000000000000000000000000000000000000000000000082167fb92d755300000000000000000000000000000000000000000000000000000000145b8061027c57507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b92915050565b604080516020810182526060815290517f5514ca2000000000000000000000000000000000000000000000000000000000815273088bdb2b554e3cdeda4137beef92ffee1e9f4dbf90635514ca20906102e190869086906004016118f3565b5f60405180830381865afa1580156102fb573d5f803e3d5ffd5b505050506040513d5f823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682016040526103409190810190611962565b9392505050565b6040517f7764fd9c0000000000000000000000000000000000000000000000000000000081526060905f90819073088bdb2b554e3cdeda4137beef92ffee1e9f4dbf90637764fd9c9061039e9087906004016118e1565b5f60405180830381865afa1580156103b8573d5f803e3d5ffd5b505050506040513d5f823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682016040526103fd9190810190611a41565b915091505f610416838351905160406020909202010190565b60408051602083820181019092528281529192508101610437818686610477565b5f61045b6040518060c0016040528060928152602001611c206092913987876104ba565b5091979650505050505050565b6060610472610879565b905090565b80600182510160200281015b8082101561049e578151855260209485019490910190610483565b50506104b56104aa8390565b848451602001610b54565b505050565b60605f6104c684610b5d565b85519091506020860190600290046104dd86610b77565b8260020267ffffffffffffffff8111156104f9576104f9611731565b6040519080825280601f01601f191660200182016040528015610523576020820181803683370190505b509350602084015f5b8481101561086d575f806105408a84610d94565b915091508184538060018501536002840193505f61055f8b848c610db7565b90505f601861056e8d87610e1e565b0390505f61057c8d87610e4d565b600402820190505b808210156107b757815162ffffff811690601d81901a600f81169160049190911c90601c1a6116178c82106106015760808801516040517fc8344ab1000000000000000000000000000000000000000000000000000000008152600481019190915260248101839052604481018e90526064015b60405180910390fd5b50600281028d015160f01c5f806106168a8885565b9150915085821461066a5760808a01516040517fddf56071000000000000000000000000000000000000000000000000000000008152600481019190915260248101839052604481018790526064016105f8565b8481146106ba5760808a01516040517ffc8b5603000000000000000000000000000000000000000000000000000000008152600481019190915260248101829052604481018690526064016105f8565b895182111561070c5760808a01518a516040517f2cab6bff00000000000000000000000000000000000000000000000000000000815260048101929092526024820152604481018390526064016105f8565b8951829003808b5260408b0151111561076e5760808a01518a516040808d015190517f1bc5ab0f0000000000000000000000000000000000000000000000000000000081526004810193909352602483019190915260448201526064016105f8565b89518101808b5260208b0151101561078857895160208b01525b600181111561079957895160408b01525b50505060808701805160010190525050506004929092019150610584565b6107c18d87610e64565b8360200151146108155782602001516107da8e88610e64565b6040517f4d9c18dc000000000000000000000000000000000000000000000000000000008152600481019290925260248201526044016105f8565b8251841461085c5782516040517f4689f0b30000000000000000000000000000000000000000000000000000000081526004810191909152602481018590526044016105f8565b50506001909301925061052c915050565b50505050509392505050565b60606116175f604990508091505f6040518061094001604052808467ffffffffffffffff1667ffffffffffffffff168152602001610e7c8152602001610ef88152602001610f5b81526020016111b681526020016111bf81526020016111c981526020016111d281526020016111ec81526020016111bf8152602001611291815260200161129181526020016112ec81526020016113b581526020016113c281526020016111bf81526020016111c981526020016113c281526020016111bf81526020016111c981526020016111c981526020016111bf81526020016111bf81526020016111bf81526020016111b681526020016111b681526020016111b681526020016111b681526020016113cc81526020016111bf81526020016113f0815260200161140981526020016111bf81526020016113cc81526020016111bf81526020016111bf81526020016113c281526020016111c981526020016111bf81526020016111bf81526020016111c9815260200161141281526020016111bf81526020016111c9815260200161141281526020016111b681526020016111c981526020016111c981526020016111c981526020016111c981526020016111bf81526020016111c981526020016111c9815260200161141281526020016111b681526020016111b6815260200161141281526020016111b681526020016111b6815260200161141281526020016111b681526020016111bf81526020016111c9815260200161141281526020016113c281526020016113c28152602001611412815260200161141281526020016111b681526020016114128152602001611412815260200161141281526020016111c98152602001611409815250905060608190506049815114610b425780516040517fc8b569010000000000000000000000000000000000000000000000000000000081526004810191909152602481018490526044016105f8565b610b4b8161142b565b94505050505090565b8083835e505050565b5f81515f03610b6d57505f919050565b50602001515f1a90565b5f610b8182610b5d565b90508015610d525781516001600283020190811115610bce57826040517f17f4bc5e0000000000000000000000000000000000000000000000000000000081526004016105f891906118e1565b82516020828501810191850101602160027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff860102860181019086015b808210610d0e57815160f01c8481016004810185811115610c5957896040517e39ba560000000000000000000000000000000000000000000000000000000081526004016105f891906118e1565b81515f81901a90600181901a90600281901a9060031a80821180610c7c57508281115b15610cb7578d876040517feaf45f4f0000000000000000000000000000000000000000000000000000000081526004016105f8929190611b32565b505050600481028201878114610cfb578b6040517ffbb8027a0000000000000000000000000000000000000000000000000000000081526004016105f891906118e1565b8397506002870396505050505050610c0b565b838314610d4957866040517fde67b29a0000000000000000000000000000000000000000000000000000000081526004016105f891906118e1565b50505050505050565b600182511115610d9057816040517fd013da5d0000000000000000000000000000000000000000000000000000000081526004016105f891906118e1565b5050565b5f805f610da18585610e1e565b51600281901a9660039190911a95509350505050565b610dec6040518060c001604052805f81526020015f81526020015f8152602001606081526020015f8152602001606081525090565b506040805160c081018252838152602081018490529081019290925260608201525f608082015260a081019190915290565b5f80610e2984610b5d565b60020260010190505f610e3c85856114bb565b949091019093016020019392505050565b5f80610e598484610e1e565b515f1a949350505050565b5f80610e708484610e1e565b5160011a949350505050565b81515f90819061ffff8416908110610ed757608085015185516040517feaa16f3300000000000000000000000000000000000000000000000000000000815260048101929092526024820152604481018290526064016105f8565b8460400151811115610eeb57604085018190525b505f946001945092505050565b6060820151515f90819061ffff8416908110610eeb5760808501516060860151516040517feb78945400000000000000000000000000000000000000000000000000000000815260048101929092526024820152604481018290526064016105f8565b6060820151515f90819061ffff8416908110610fbe5760808501516060860151516040517feb78945400000000000000000000000000000000000000000000000000000000815260048101929092526024820152604481018290526064016105f8565b5f85606001518281518110610fd557610fd5611b53565b602002602001015190505f80610fee839060a082901c90565b9150915061101c827f18003f8e00000000000000000000000000000000000000000000000000000000611511565b61106a576040517f23016c8900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff831660048201526024016105f8565b6040517f40c04edc00000000000000000000000000000000000000000000000000000000815260048101829052600f601089901c81166024830181905260148a901c9091166044830181905290915f90819073ffffffffffffffffffffffffffffffffffffffff8716906340c04edc906064016040805180830381865afa1580156110f7573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061111b9190611b80565b91509150838214611162576040517f528cc0fb00000000000000000000000000000000000000000000000000000000815260048101859052602481018390526044016105f8565b8281146111a5576040517fc5ff08dc00000000000000000000000000000000000000000000000000000000815260048101849052602481018290526044016105f8565b909b909a5098505050505050505050565b505f9160019150565b5060029160019150565b50600191829150565b5f806111de84846111ec565b506001958695509350505050565b5f8060ff83811690600885901c16808303611233576040517f46f0ca6900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6101006112408284611ba2565b1115611282576040517f8abcdd3f00000000000000000000000000000000000000000000000000000000815260048101839052602481018290526044016105f8565b50600295600195509350505050565b5f8061ffff831660ff8111806112a5575080155b156112df576040517fc1be16a1000000000000000000000000000000000000000000000000000000008152600481018290526024016105f8565b5060019485945092505050565b60a08201515f90819061ffff841690600f601486901c811691601087901c909116908490819061131c9086610d94565b91509150818314611363576040517f9199e58e00000000000000000000000000000000000000000000000000000000815260048101849052602481018390526044016105f8565b838110156113a7576040517fff13710800000000000000000000000000000000000000000000000000000000815260048101829052602481018590526044016105f8565b509791965090945050505050565b60101c600f169160019150565b5060039160019150565b5f80600f601084901c16806113e25760016113e4565b805b95600195509350505050565b5f80600f601084901c16600281116113e25760026113e4565b506002915f9150565b5f80600f601084901c16600181116113e25760026113e4565b60605f825160020267ffffffffffffffff81111561144b5761144b611731565b6040519080825280601f01601f191660200182016040528015611475576020820181803683370190505b50905061ffff80196020850160208651028101600285015b818310156114af5780518351861690851617815260209092019160020161148d565b50939695505050505050565b5f6114c583610b5d565b82106115015781836040517ffcfaeff10000000000000000000000000000000000000000000000000000000081526004016105f8929190611bda565b50600202016003015161ffff1690565b5f61151b8361152c565b8015610340575061034083836115a6565b5f611557827f01ffc9a7000000000000000000000000000000000000000000000000000000006115a6565b1561159f575f80611588847fffffffff000000000000000000000000000000000000000000000000000000006115ca565b91509150818015611597575080155b949350505050565b505f919050565b5f805f6115b385856115ca565b915091508180156115c15750805b95945050505050565b7f01ffc9a7000000000000000000000000000000000000000000000000000000005f818152600483905290819060208260248188617530fa92505f511515601f3d11169150509250929050565b61161f611bf2565b565b5f60208284031215611631575f80fd5b81357fffffffff0000000000000000000000000000000000000000000000000000000081168114610340575f80fd5b5f8060208385031215611671575f80fd5b823567ffffffffffffffff80821115611688575f80fd5b818501915085601f83011261169b575f80fd5b8135818111156116a9575f80fd5b8660208285010111156116ba575f80fd5b60209290920196919550909350505050565b602080825282518282018290528051604084018190525f9291820190839060608601905b8083101561172657835173ffffffffffffffffffffffffffffffffffffffff1682529284019260019290920191908401906116f0565b509695505050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6040516020810167ffffffffffffffff8111828210171561178157611781611731565b60405290565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156117ce576117ce611731565b604052919050565b5f67ffffffffffffffff8211156117ef576117ef611731565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b5f6020828403121561182b575f80fd5b813567ffffffffffffffff811115611841575f80fd5b8201601f81018413611851575f80fd5b803561186461185f826117d6565b611787565b818152856020838501011115611878575f80fd5b816020840160208301375f91810160200191909152949350505050565b5f81518084528060208401602086015e5f6020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b602081525f6103406020830184611895565b60208152816020820152818360408301375f818301604090810191909152601f9092017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0160101919050565b5f67ffffffffffffffff82111561195857611958611731565b5060051b60200190565b5f6020808385031215611973575f80fd5b825167ffffffffffffffff8082111561198a575f80fd5b818501915082828703121561199d575f80fd5b6119a561175e565b8251828111156119b3575f80fd5b80840193505086601f8401126119c7575f80fd5b825191506119d761185f8361193f565b82815260059290921b830184019184810190888411156119f5575f80fd5b938501935b83851015611a3457845173ffffffffffffffffffffffffffffffffffffffff81168114611a25575f80fd5b825293850193908501906119fa565b8252509695505050505050565b5f8060408385031215611a52575f80fd5b825167ffffffffffffffff80821115611a69575f80fd5b818501915085601f830112611a7c575f80fd5b81516020611a8c61185f836117d6565b8281528882848701011115611a9f575f80fd5b828286018383015e5f81840183015287820151909650935082841115611ac3575f80fd5b838701935087601f850112611ad6575f80fd5b83519250611ae661185f8461193f565b83815260059390931b8401810192818101925088841115611b05575f80fd5b938101935b83851015611b2357845183529381019391810191611b0a565b80955050505050509250929050565b604081525f611b446040830185611895565b90508260208301529392505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f8060408385031215611b91575f80fd5b505080516020909101519092909150565b8082018082111561027c577f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b828152604060208201525f6115976040830184611895565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52605160045260245ffdfe0e7c0ef80f5b11b611bf11c911d211ec11bf1291129112ec13b513c211bf11c913c211bf11c911c911bf11bf11bf11b611b611b611b613cc11bf13f0140911bf13cc11bf11bf13c211c911bf11bf11c9141211bf11c9141211b611c911c911c911c911bf11c911c9141211b611b6141211b611b6141211b611bf11c9141213c213c21412141211b614121412141211c91409"; /// @dev The hash of the meta that describes the contract. -bytes32 constant DESCRIBED_BY_META_HASH = bytes32(0x0ae1ecb6c0f6314beaf4d4cd803ba14c900b0eecb1ecd39a52739cff9ae2c34a); +bytes32 constant DESCRIBED_BY_META_HASH = bytes32(0xc5a28e7d9dcddeae423dae076cbc7510e07229c5aac6e894727caa6ebf1353fa); /// @dev The function pointers for the integrity check fns. bytes constant INTEGRITY_FUNCTION_POINTERS = - hex"0e740ef00f5311ae11b711c111ca11e411b71289128912e413ad13ba11b711c113ba11b711c111c111b711b711b711ae11ae11ae11ae13c411b713e8140111b713c411b711b713ba11c111b711b711c1140a11b711c1140a11ae11c111c111c111c111b711c111c1140a11ae11ae140a11ae11ae140a11b711c1140a13ba13ba140a140a11ae140a140a140a11c11401"; + hex"0e7c0ef80f5b11b611bf11c911d211ec11bf1291129112ec13b513c211bf11c913c211bf11c911c911bf11bf11bf11b611b611b611b613cc11bf13f0140911bf13cc11bf11bf13c211c911bf11bf11c9141211bf11c9141211b611c911c911c911c911bf11c911c9141211b611b6141211b611b6141211b611bf11c9141213c213c21412141211b614121412141211c91409"; diff --git a/src/generated/RainlangInterpreter.pointers.sol b/src/generated/RainlangInterpreter.pointers.sol index b82710c94..920c85c34 100644 --- a/src/generated/RainlangInterpreter.pointers.sol +++ b/src/generated/RainlangInterpreter.pointers.sol @@ -10,23 +10,23 @@ pragma solidity ^0.8.25; // file needs the contract to exist so that it can be compiled. /// @dev Hash of the known bytecode. -bytes32 constant BYTECODE_HASH = bytes32(0x02e5502324b8ee7b4f31bbfd4cc167f480dfeffb6bdd4486c2caabad96ab0ae4); +bytes32 constant BYTECODE_HASH = bytes32(0x3069f10fd2956d0681277d4834e35e9fefaf6d3a079af0a44ccab979ffba052d); /// @dev The deterministic deploy address of the contract when deployed via /// the Zoltu factory. -address constant DEPLOYED_ADDRESS = address(0xb3A710b89A5569893dA4Ca0dB7D178593b5BE8a0); +address constant DEPLOYED_ADDRESS = address(0x7E694007Bb400ab2147a2060D2e48703F3FA1cef); /// @dev The creation bytecode of the contract. bytes constant CREATION_CODE = - hex"608060405234801561000f575f80fd5b5061001861003d565b515f0361003857604051632413c92160e01b815260040160405180910390fd5b61005d565b60606040518060c0016040528060908152602001615d7760909139905090565b615d0d8061006a5f395ff3fe608060405234801561000f575f80fd5b506004361061003f575f3560e01c806301ffc9a714610043578063514b5d4f1461006b578063d04dfe2314610080575b5f80fd5b6100566100513660046154a0565b6100a1565b60405190151581526020015b60405180910390f35b610073610185565b604051610062919061552b565b61009361008e36600461553d565b610194565b6040516100629291906155ae565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082167fd04dfe2300000000000000000000000000000000000000000000000000000000148061013357507fffffffff0000000000000000000000000000000000000000000000000000000082167f514b5d4f00000000000000000000000000000000000000000000000000000000145b8061017f57507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b92915050565b606061018f610390565b905090565b6060805f61021b84830135602086018035906101b09088615627565b6101bd6080890189615642565b6101c691615745565b6101ce61063c565b6101db60408b018b615808565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525092979695949392505061065c9050565b9050600261022c60c0860186615642565b610237929150615896565b156102895761024960c0850185615642565b6040517f01c71f3d000000000000000000000000000000000000000000000000000000008152610280925060040190815260200190565b60405180910390fd5b5f5b61029860c0860186615642565b905081101561031b576060820151610304906102b760c0880188615642565b848181106102c7576102c76158a9565b90506020020135878060c001906102de9190615642565b6102e9866001615903565b8181106102f8576102f86158a9565b905060200201356107a7565b6060830152610314600282615903565b905061028b565b5061038661032c60a0860186615642565b808060200260200160405190810160405280939291908181526020018383602002808284375f92019190915250859392507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff91505061087d565b9250925050915091565b6040805161092081018252604880825261097c60208301526109cb92820192909252610a0d606082810191909152610bce6080830152610c4e60a0830152610c6060c0830152610c7860e0830152610cba610100830152610d0f610120830152610d21610140830152610d33610160830152610d45610180830152610dea6101a0830152610e276101c0830152610ff36101e083015261115d6102008301526112486102208301526113ea61024083018190526115396102608401526116096102808401526116cd6102a084015261181c6102c08401526102e083015261190a6103008301526119396103208301819052610340830152611968610360830152611997610380830152611a1f6103a0830152611a336103c0830152611b206103e0830152611b84610400830152611b9c610420830152611c17610440830152611c2f610460830152611c47610480830152611c806104a0830152611caa6104c0830152611cc26104e0830152611cda610500830152611ce7610520830152611de2610540830152611e04610560830152611e11610580830152611ec96105a0830152611f186105c0830152611f5b6105e0830152611f7f610600830152611f8c610620830152611f9961064083015261203261066083015261207b6106808301526120886106a08301526121076106c08301526121566106e08301526121a56107008301526121f26107208301526122416107408301526122906107608301526123486107808301526123746107a08301526123966107c083015261244e6107e083015261248f6108008301526124b661082083015261250361084083015261255061086083015261259f6108808301526125ec6108a08301526126396108c08301526126866108e08301526127776109008301529190819080610633816127a9565b94505050505090565b60606040518060c0016040528060908152602001615c7d60909139905090565b6106bd60405180610120016040528060608152602001606081526020015f81526020015f81526020015f81526020015f73ffffffffffffffffffffffffffffffffffffffff1681526020016060815260200160608152602001606081525090565b602087810180516040600191820184028b018181015182515f91821a808252948501870281019093526041808301968381019593600285020190910191908401905b8381101561073d57875160f01c83015160408051600192831a80825283016020908102909101918290529084526002909901989290920191016106ff565b505050506040518061012001604052808281526020018481526020018b81526020015f81526020018a81526020018973ffffffffffffffffffffffffffffffffffffffff168152602001888152602001838152602001878152509450505050509695505050505050565b5f82815260208120600f900660100284811c61ffff1690815b82156107da57825186146107da57604083015192506107c0565b821580156108285760405193506060840160405286845285602085015281604085015260028860f01c0161ffff60f01b1989168160f01b1798505061ffff831b19881684841b17975061082f565b8560208501525b50505061ffff811115610871576040517fcadaf56d00000000000000000000000000000000000000000000000000000000815260048101829052602401610280565b849150505b9392505050565b6060805f806108948760e00151886040015161282d565b915091505f80885f01518960400151815181106108b3576108b36158a9565b60200260200101519150819050838851146109075787516040517fd628439f000000000000000000000000000000000000000000000000000000008152610280918691600401918252602082015260400190565b87511561092c575f60208951028203915060208901905061092a81838b51612850565b505b61093c898a60400151838561285c565b90505f83881061094c578361094e565b875b90506060602083039050818152806109698c60600151612aed565b975097505050505050505b935093915050565b604083015183516020600192830181029091015161ffff8516909201029003517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0909101908152809392505050565b60208084015161ffff841660010190910201517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0909101908152809392505050565b602083015180515f9161ffff851691600f601087901c811692601488901c9091169185919085908110610a4257610a426158a9565b602002602001015190505f80610a5b839060a082901c90565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08a0180518882526040517f58c07152000000000000000000000000000000000000000000000000000000008152939550919350915f9073ffffffffffffffffffffffffffffffffffffffff8616906358c0715290610ae09087908790600401615916565b5f60405180830381865afa158015610afa573d5f803e3d5ffd5b505050506040513d5f823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201604052610b3f9190810190615936565b905080518714610b885780516040517fc3385cb0000000000000000000000000000000000000000000000000000000008152610280918991600401918252602082015260400190565b818352602088028b019a50602081016020880281015b80821015610bbb5760208d039c5081518d52602082019150610b9e565b509a9d9c50505050505050505050505050565b60c083015180515f9160ff85811692600887901c90911691849184908110610bf857610bf86158a9565b60200260200101518281518110610c1157610c116158a9565b60209081029190910101517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0909501948552509295945050505050565b60208101805182511681529392505050565b80515f90610c6d81612d60565b835250909392505050565b80516001600884901c60ff9081169190911b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0193161c919091168152919050565b805160209091018051600160ff600886901c81169190911b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01941684811b199091169390921690911b919091178152919050565b60208101805182511781529392505050565b805161ffff83161b8152809392505050565b805161ffff83161c8152809392505050565b8251600161ffff841690810160209081028301515f93600f601088901c811693601489901c90911692908190850288015b80891015610d935760208203915088518252602089019850610d76565b5060408a01805190879052610daa8b82848661285c565b60408c0182905260208602998a9003999092508201895b81841015610dd9578351815260209384019301610dc1565b50989b9a5050505050505050505050565b60109190911c600f166020028082207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09190920101908152919050565b805160208201516040909201805190925f929173ffffffffffffffffffffffffffffffffffffffff83168314610e8c576040517f0255ddd800000000000000000000000000000000000000000000000000000000815260048101849052602401610280565b8173ffffffffffffffffffffffffffffffffffffffff168214610ede576040517f0255ddd800000000000000000000000000000000000000000000000000000000815260048101839052602401610280565b8073ffffffffffffffffffffffffffffffffffffffff168114610f30576040517f0255ddd800000000000000000000000000000000000000000000000000000000815260048101829052602401610280565b6040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff838116600483015282811660248301525f919085169063dd62ed3e90604401602060405180830381865afa158015610fa5573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610fc991906159b7565b90505f610fd585612e38565b90505f610fe28383612ee1565b508852509598975050505050505050565b80516020909101805190915f9173ffffffffffffffffffffffffffffffffffffffff82168214611052576040517f0255ddd800000000000000000000000000000000000000000000000000000000815260048101839052602401610280565b8073ffffffffffffffffffffffffffffffffffffffff1681146110a4576040517f0255ddd800000000000000000000000000000000000000000000000000000000815260048101829052602401610280565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff82811660048301525f91908416906370a0823190602401602060405180830381865afa158015611111573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061113591906159b7565b90505f61114184612e38565b90505f61114e8383612f22565b87525094979650505050505050565b80515f9073ffffffffffffffffffffffffffffffffffffffff811681146111b3576040517f0255ddd800000000000000000000000000000000000000000000000000000000815260048101829052602401610280565b5f8173ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156111fd573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061122191906159b7565b90505f61122d83612e38565b90505f61123a8383612f22565b865250939695505050505050565b805160208201516040909201805190925f929173ffffffffffffffffffffffffffffffffffffffff831683146112ad576040517f0255ddd800000000000000000000000000000000000000000000000000000000815260048101849052602401610280565b8173ffffffffffffffffffffffffffffffffffffffff1682146112ff576040517f0255ddd800000000000000000000000000000000000000000000000000000000815260048101839052602401610280565b8073ffffffffffffffffffffffffffffffffffffffff168114611351576040517f0255ddd800000000000000000000000000000000000000000000000000000000815260048101829052602401610280565b6040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff838116600483015282811660248301525f919085169063dd62ed3e90604401602060405180830381865afa1580156113c6573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061123a91906159b7565b80516020909101805190915f9173ffffffffffffffffffffffffffffffffffffffff82168214611449576040517f0255ddd800000000000000000000000000000000000000000000000000000000815260048101839052602401610280565b8073ffffffffffffffffffffffffffffffffffffffff16811461149b576040517f0255ddd800000000000000000000000000000000000000000000000000000000815260048101829052602401610280565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff82811660048301525f91908416906370a0823190602401602060405180830381865afa158015611508573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061152c91906159b7565b8552509295945050505050565b80515f9073ffffffffffffffffffffffffffffffffffffffff8116811461158f576040517f0255ddd800000000000000000000000000000000000000000000000000000000815260048101829052602401610280565b5f8173ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156115d9573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115fd91906159b7565b84525091949350505050565b80515f9073ffffffffffffffffffffffffffffffffffffffff8116811461165f576040517f0255ddd800000000000000000000000000000000000000000000000000000000815260048101829052602401610280565b5f8173ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156116a9573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115fd91906159ce565b80516020909101805190915f9173ffffffffffffffffffffffffffffffffffffffff8216821461172c576040517f0255ddd800000000000000000000000000000000000000000000000000000000815260048101839052602401610280565b8073ffffffffffffffffffffffffffffffffffffffff16811461177e576040517f0255ddd800000000000000000000000000000000000000000000000000000000815260048101829052602401610280565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff82811660048301525f91908416906370a0823190602401602060405180830381865afa1580156117eb573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061180f91906159b7565b90505f61123a825f612f22565b80516020909101805190915f9173ffffffffffffffffffffffffffffffffffffffff8216821461187b576040517f0255ddd800000000000000000000000000000000000000000000000000000000815260048101839052602401610280565b6040517f6352211e000000000000000000000000000000000000000000000000000000008152600481018290525f9073ffffffffffffffffffffffffffffffffffffffff841690636352211e90602401602060405180830381865afa1580156118e6573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061152c91906159ce565b437fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09190910190815292915050565b427fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09190910190815292915050565b467fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09190910190815292915050565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe06020600f601085901c1602828101918201925f928391905b80821015611a1357815192507bffffffffffffffffffffffffffffffffffffffffffffffffffffffff831615611a0857828652611a13565b8160200191506119d0565b50939695505050505050565b805160209091018051909114815292915050565b5f805f80805f80600f8960101c169350600284069250879150602083850302820190506020831502810397508215611a6a57805194505b5f5b81831015611ab55750815195507bffffffffffffffffffffffffffffffffffffffffffffffffffffffff86161580611aaa5760208301518952611ab5565b826040019250611a6c565b8015611b1157604080518082019091525f6020820152600887901c601f88168083019190915281525b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610280919061552b565b50969998505050505050505050565b805160208201516040909201915f91907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8216611b7a57604080518082019091525f6020820152600882901c601f8316808301919091528152611ade565b5091949350505050565b80516020909101805190915f918261152c8383612f46565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe06020600f601085901c1602828101918201925f928391905b80821015611a1357815192507bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8316611c0c575f8652611a13565b816020019150611bd5565b80516020909101805190915f918261152c8383612f94565b80516020909101805190915f918261152c8383612fe3565b805160407bffffffffffffffffffffffffffffffffffffffffffffffffffffffff90911615156020028203810151910190815292915050565b80515f90817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8216156115fd565b80516020909101805190915f918261152c8383613033565b80516020909101805190915f918261152c8383613082565b80515f90610c6d816130d2565b805160208201516040909201915f91907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff808316601b90810b9160e085811d9291851690910b9084901d611d398484848461311d565b9094509250600f60108a901c1660025b81811015611d9f5789516020909a019996507bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8716601b0b935060e087901d9250611d928686868661311d565b9096509450600101611d49565b5050611dab8484613253565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe098909801978852509598975050505050505050565b80516020909101805190915f916115fd6002611dfe8484613359565b906133bb565b80515f90610c6d81613400565b805160208201516040909201915f91907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff808316601b90810b9160e085811d9291851690910b9084901d611e63848484846134bc565b9094509250600f60108a901c1660025b81811015611d9f5789516020909a019996507bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8716601b0b935060e087901d9250611ebc868686866134bc565b9096509450600101611e73565b7fffffffbe19cfc6ef4f44cf88f14500d013df534fcaad48fca1d5ca47bea26fcc7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09190910190815292915050565b80515f90610c6d7fffffffbe19cfc6ef4f44cf88f14500d013df534fcaad48fca1d5ca47bea26fcc8273c51a14251b0dcf0ae24a96b7153991378938f5f5613ad7565b80515f90610c6d60028273c51a14251b0dcf0ae24a96b7153991378938f5f5613ad7565b80515f90610c6d81613d31565b80515f90610c6d81613dd7565b80516020909101805190915f9182611fb18382613033565b90505f611fbe8382613033565b90505f61201c7fffffffff0000000000000000000000000000000000000000000000000000000573c51a14251b0dcf0ae24a96b7153991378938f5f5612015612006886130d2565b61200f8a6130d2565b90613e22565b9190613ad7565b90508115158315151461123a5761114e81613e67565b80515f906120498161204381613400565b90613e99565b90507bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8116612072575060015b82525092915050565b80515f90610c6d81613ede565b805160208201516040909201915f91906120a28282613f10565b9150600f601086901c1660025b818110156120d557855160209096019592506120cb8484613f10565b93506001016120af565b5050507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0929092019182525092915050565b7f80000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09190910190815292915050565b7f7fffffff7fffffffffffffffffffffffffffffffffffffffffffffffffffffff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09190910190815292915050565b805160208201516040909201915f91906121bf8282613f2c565b9150600f601086901c1660025b818110156120d557855160209096019592506121e88484613f2c565b93506001016121cc565b7f7fffffff800000000000000000000000000000000000000000000000000000007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09190910190815292915050565b7f80000000000000000000000000000000000000000000000000000000000000017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09190910190815292915050565b805160208201516040909201915f91907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff808316601b90810b9160e085811d9291851690910b9084901d6122e284848484613f37565b9094509250600f60108a901c1660025b81811015611d9f5789516020909a019996507bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8716601b0b935060e087901d925061233b86868686613f37565b90965094506001016122f2565b80516020909101805190915f916115fd828273c51a14251b0dcf0ae24a96b7153991378938f5f5613ad7565b80515f90610c6d8173c51a14251b0dcf0ae24a96b7153991378938f5f5614056565b805160208201516040909201915f91907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff808316601b90810b9160e085811d9291851690910b9084901d6123e884848484614082565b9094509250600f60108a901c1660025b81811015611d9f5789516020909a019996507bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8716601b0b935060e087901d925061244186868686614082565b90965094506001016123f8565b805160208201516040909201805190925f929161152c6124888273c51a14251b0dcf0ae24a96b7153991378938f5f5612015866001613359565b8490613e22565b805160208201516040909201805190925f929161152c6124af8383613e22565b8490613359565b805160208201516040909201915f91906124d08183615903565b9150600f601086901c1660025b818110156120d557855160209096019592506124f98385615903565b93506001016124dd565b805160208201516040909201915f919061251d81836159e9565b9150600f601086901c1660025b818110156120d5578551602090960195925061254683856159e9565b935060010161252a565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09190910190815292915050565b805160208201516040909201915f91906125b981836159fc565b9150600f601086901c1660025b818110156120d557855160209096019592506125e283856159fc565b93506001016125c6565b805160208201516040909201915f91906126068183615b31565b9150600f601086901c1660025b818110156120d5578551602090960195925061262f8385615b31565b9350600101612613565b805160208201516040909201915f91906126538183615b3c565b9150600f601086901c1660025b818110156120d5578551602090960195925061267c8385615b3c565b9350600101612660565b805160608401515f91908290819061269e90846140ac565b91509150815f036127685760a087015160808801516040517f295f36d70000000000000000000000000000000000000000000000000000000081526004810191909152602481018590525f9173ffffffffffffffffffffffffffffffffffffffff169063295f36d790604401602060405180830381865afa158015612725573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061274991906159b7565b606089015190915061275c9085836107a7565b6060890152855261276c565b8085525b509295945050505050565b8051602082015160608501516040909301925f9291906127989083836107a7565b606087015250829150509392505050565b60605f825160020267ffffffffffffffff8111156127c9576127c96156a6565b6040519080825280601f01601f1916602001820160405280156127f3576020820181803683370190505b50905061ffff80196020850160208651028101600285015b81831015611a135780518351861690851617815260209092019160020161280b565b5f805f61283a85856140f3565b51600281901a9660039190911a95509350505050565b6020810283835e505050565b5f80856040015190505f805f805f60028b61010001515161287d91906159e9565b60e08c01516101008d0151602080830151600261ffff9b909b168b8102850160219081015160f01c5f93841a9d909d029095019b909b019384015160258086019b50600791831a91821691829003600402909501909401985092965001935090915061549890805b86881015612a675787519050600284825f1a060285015160f01c925062ffffff8160e01c16915061291b8e838e8663ffffffff16565b9b506002848260041a060285015160f01c925062ffffff8160c01c1691506129488e838e8663ffffffff16565b9b506002848260081a060285015160f01c925062ffffff8160a01c1691506129758e838e8663ffffffff16565b9b5060028482600c1a060285015160f01c925062ffffff8160801c1691506129a28e838e8663ffffffff16565b9b506002848260101a060285015160f01c925062ffffff8160601c1691506129cf8e838e8663ffffffff16565b9b506002848260141a060285015160f01c925062ffffff8160401c1691506129fc8e838e8663ffffffff16565b9b506002848260181a060285015160f01c925062ffffff8160201c169150612a298e838e8663ffffffff16565b9b5060028482601c1a060285015160f01c925062ffffff81169150612a538e838e8663ffffffff16565b9b50612a60602089615903565b97506128e5565b612a72601c89615b3c565b9750612a7f8660046159fc565b612a899089615903565b96505b86881015612acf5750508551601c81901a83900660020284015160f01c915062ffffff811690612abb8e838e86565b9b50612ac8600489615903565b9750612a8c565b612adb8d8a8e8e614122565b50999c9b505050505050505050505050565b6040805160f083901c602081810283010190925290815261ffff63ffffffff67ffffffffffffffff6fffffffffffffffffffffffffffffffff612b59565b5f5b8215612b5357825182526020830151602083015260408301519250604082019150612b2d565b50919050565b602085018660101b60901c8015612c49578060401c8015612bc7578060201c8015612b8b57612b888185612b2b565b93505b508086168015612bc5578060101c8015612bac57612ba98186612b2b565b94505b508088168015612bc357612bc08186612b2b565b94505b505b505b508084168015612c47578060201c8015612c0b578060101c8015612bf257612bef8186612b2b565b94505b508088168015612c0957612c068186612b2b565b94505b505b508086168015612c45578060101c8015612c2c57612c298186612b2b565b94505b508088168015612c4357612c408186612b2b565b94505b505b505b505b508682168015612d55578060401c8015612cd3578060201c8015612c97578060101c8015612c7e57612c7b8186612b2b565b94505b508088168015612c9557612c928186612b2b565b94505b505b508086168015612cd1578060101c8015612cb857612cb58186612b2b565b94505b508088168015612ccf57612ccc8186612b2b565b94505b505b505b508084168015612d53578060201c8015612d17578060101c8015612cfe57612cfb8186612b2b565b94505b508088168015612d1557612d128186612b2b565b94505b505b508086168015612d51578060101c8015612d3857612d358186612b2b565b94505b508088168015612d4f57612d4c8186612b2b565b94505b505b505b505b505050505050919050565b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203612d915750610100919050565b507f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f7f5555555555555555555555555555555555555555555555555555555555555555600183901c16909103600281901c7f3333333333333333333333333333333333333333333333333333333333333333908116911601600481901c01167f01010101010101010101010101010101010101010101010101010101010101010260f81c90565b5f612e416141b5565b6040517ff5c36eaf00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8316600482015273200e12d10bb0c5e4a17e7018f0f1161919bb93899063f5c36eaf90602401602060405180830381865afa158015612ebd573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061017f9190615b4f565b5f805f805f612ef0878761425b565b9250925092505f80612f028585613253565b9150915081838015612f115750815b9650965050505050505b9250929050565b5f805f612f2f85856142b7565b91509150612f3d8282614319565b95945050505050565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838116601b90810b9160e086811d9291861690910b9085901d612f8984848484614373565b979650505050505050565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838116601b90810b9160e086811d9291861690910b9085901d612fd78484848461438a565b12979650505050505050565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838116601b90810b9160e086811d9291861690910b9085901d6130268484848461438a565b1315979650505050505050565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838116601b90810b9160e086811d9291861690910b9085901d6130768484848461438a565b13979650505050505050565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838116601b90810b9160e086811d9291861690910b9085901d6130c58484848461438a565b1215979650505050505050565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8216601b0b60e083901d828212156131125761310c828261445e565b90925090505b5f612f3d8383614501565b5f808515841517801561314957865f0361313d578484925092505061324a565b8686925092505061324a565b613153878761455f565b9097509550613162858561455f565b909550935085841315613176579395929492935b838603604c81111561318f57878793509350505061324a565b80600a0a86816131a1576131a1615869565b0595505086850180881860ff90811c151589881890911c1516801561323c57877f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03613223576040517fd556b111000000000000000000000000000000000000000000000000000000008152600481018a905260248101899052604401610280565b600a968790059690980586019760019790970196613240565b8198505b5050868692509250505b94509492505050565b5f601b83900b83148383826132b7577d90e40fbeea1d3a4abc8955e946fe31cdcf66f634e100000000000000000086051561329757620186a0860595506005850194505b8586601b0b146132b257600a86059550846001019450613297565b6132cd565b855f036132cd57505f925060019150612f1b9050565b848560030b14613329575f8512156132ed57505f9250829150612f1b9050565b6040517fd556b1110000000000000000000000000000000000000000000000000000000081526004810183905260248101829052604401610280565b50507bffffffffffffffffffffffffffffffffffffffffffffffffffffffff841660e084901b1791509250929050565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838116601b90810b9160e086811d9291861690910b9085901d848061339e8686868661311d565b915091505f6133ad8383614501565b9a9950505050505050505050565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838116601b90810b9160e086811d9291861690910b9085901d848061339e868686866134bc565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8216601b0b60e083901d82811261343757509192915050565b5f8061344384846145b5565b91509150805f03613458575093949350505050565b5f8113156134b1576134ac82847f161bcca7119915b50764b4abe86529797775a5f17195100000000000000000007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb461311d565b935091505b5f612f898385614501565b5f80835f03613501576040517f7a97930f0000000000000000000000000000000000000000000000000000000081526004810187905260248101869052604401610280565b855f0361351257505f90508061324a565b5f805f806135208a8a61461d565b919b5099509150613531888861461d565b919950975090505f6135428b6148be565b90505f61354e8a6148be565b90507f161bcca7119915b50764b4abe86529797775a5f1719510000000000000000000604c8183101561396b5784156135ac57507f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee80000000000000000009050604b61392a565b6f4b3b4ca85a86c47a098a2240000000008310156136d857678ac7230489e8000083101561363c576402540be40083101561360a57620186a08310156135fa5750620186a0905060056138b3565b506402540be4009050600a6138b3565b655af3107a40008310156136295750655af3107a40009050600e6138b3565b50678ac7230489e80000905060136138b3565b6b204fce5e3e2502611000000083101561368e5769152d02c7e14af6800000831015613677575069152d02c7e14af6800000905060176138b3565b506b204fce5e3e250261100000009050601c6138b3565b6d314dc6448d9338c15b0a000000008310156136bd57506d314dc6448d9338c15b0a00000000905060216138b3565b506f4b3b4ca85a86c47a098a224000000000905060266138b3565b780197d4df19d605767337e9f14d3eec8920e4000000000000008310156137d05773af298d050e4395d69670b12b7f4100000000000083101561376b577172cb5bd86321e38cb6ce6682e8000000000083101561374c57507172cb5bd86321e38cb6ce6682e800000000009050602b6138b3565b5073af298d050e4395d69670b12b7f41000000000000905060306138b3565b76010b46c6cdd6e3e0828f4db456ff0c8ea00000000000008310156137ac575076010b46c6cdd6e3e0828f4db456ff0c8ea0000000000000905060356138b3565b50780197d4df19d605767337e9f14d3eec8920e4000000000000009050603a6138b3565b7c03b58e88c75313ec9d329eaaa18fb92f75215b17100000000000000000831015613866577a026e4d30eccc3215dd8f3157d27e23acbdcfe6800000000000000083101561383e57507a026e4d30eccc3215dd8f3157d27e23acbdcfe680000000000000009050603f6138b3565b507c03b58e88c75313ec9d329eaaa18fb92f75215b17100000000000000000905060446138b3565b7e05a8e89d75252446eb5d5d5b1cc5edf20a1a059e10ca0000000000000000008310156138b357507e05a8e89d75252446eb5d5d5b1cc5edf20a1a059e10ca000000000000000000905060495b8183116138e757600a820491507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff016138b3565b815f0361392a576040517f05e51ecb000000000000000000000000000000000000000000000000000000008152600481018d9052602481018c9052604401610280565b8561396b576040517f05e51ecb000000000000000000000000000000000000000000000000000000008152600481018f9052602481018e9052604401610280565b807f8000000000000000000000000000000000000000000000000000000000000000018d1261399e57808d039c50613a11565b7f80000000000000000000000000000000000000000000000000000000000000009c90038c015f811315613a1157807f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038b136139fe57998a0199613a11565b5f8099509950505050505050505061324a565b5f808e128015613a2057505f8c135b15613a5d577f80000000000000000000000000000000000000000000000000000000000000008e01808d13613a55575f613a59565b808d035b9150505b8b818f01039750613a7a8f8e613a7488878961491f565b8b614a04565b90995097505f811315613ac457604c811315613aa4575f809a509a5050505050505050505061324a565b80600a0a8981613ab657613ab6615869565b059850885f03613ac4575f97505b5096985094965061324a95505050505050565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff848116601b0b9060e086901d908516613b145750600191506108769050565b5f8213613bad57815f03613b7157613b2c855f613033565b15613b66576040517f8be8297200000000000000000000000000000000000000000000000000000000815260048101869052602401610280565b505f91506108769050565b6040517fcceba0f10000000000000000000000000000000000000000000000000000000081526004810183905260248101829052604401610280565b613bb8856001612f46565b8015613bc95750613bc9865f612f94565b15613bd8578592505050610876565b613be2855f613033565b15613c0b57613c02613bf387613ede565b613bfc87613e67565b86613ad7565b92505050610876565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8516601b0b60e086901d5f80613c3e84846145b5565b915091505f613c4e83855f614b0b565b905060015f8080613c858f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8116601b0b9160e09190911d90565b915091505b60018510613ccc5784600116600103613caf57613ca984848484613f37565b90945092505b600185901c9450613cc282828484613f37565b9092509050613c8a565b5f80613cd98f8e8e614c22565b91509150613ce982828a8d613f37565b9092509050613cf98f8383614f57565b9092509050613d0a82828888613f37565b90925090505f613d1a8383614501565b9e5050505050505050505050505050509392505050565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8216601b0b60e083901d828112613d6857509192915050565b5f80613d7484846145b5565b915091505f84128015613d8657508015155b156134b1576134ac82847f161bcca7119915b50764b4abe86529797775a5f17195100000000000000000007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb4614082565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8216601b0b60e083901d82613e0a83836145b5565b9150505f613e188284614501565b9695505050505050565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838116601b90810b9160e086811d9291861690910b9085901d848061339e86868686613f37565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8216601b0b60e083901d61310c828261445e565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838116601b90810b9160e086811d9291861690910b9085901d848061339e86868686614082565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8216601b0b60e083901d61310c82826150c8565b5f613f1b8383612f94565b613f255781610876565b5090919050565b5f613f1b8383613033565b5f8085158415178015613f4f575f92505f915061404c565b613f598487615b6f565b91505f613f65886148be565b90505f613f71876148be565b90505f613f7e8383615121565b5090505f6f0785ee10d5da46d900f436a000000000821115613fb3576f0785ee10d5da46d900f436a000000000820491506025015b670de0b6b3a7640000821115613fd457670de0b6b3a7640000820491506012015b633b9aca00821115613fed57633b9aca00820491506009015b61271082111561400257612710820491506004015b811561401657600a82049150600101614002565b6140208187615b6f565b95506140428b8a61403c878761403787600a615b31565b61491f565b89614a04565b9097509550505050505b5094509492505050565b5f610876837fffffffff0000000000000000000000000000000000000000000000000000000584613ad7565b5f8061408e848461445e565b909450925061409f8686868661311d565b9150915094509492505050565b5f80825f526010600f60205f20060261ffff85821c165b80156140ea57805185036140e15760019350602081015192506140ea565b604001516140c3565b50509250929050565b5f806140fe8461515c565b60020260010190505f6141118585615176565b949091019093016020019392505050565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08201805163ffff0000601087901b1661ffff86161782527f312f5ae588c6ff62cd3f006af06cd48c98d7321649db7d8b2c396a81a204655591905f808686036004017ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8801865afa5090525050505050565b73200e12d10bb0c5e4a17e7018f0f1161919bb93893b158061420c575073200e12d10bb0c5e4a17e7018f0f1161919bb93893f7f1de7d717526cba131d684e312dedbf0852adef9cced9e36798ae4937f7145d4114155b15614259576040517f73e6d7b300000000000000000000000000000000000000000000000000000000815273200e12d10bb0c5e4a17e7018f0f1161919bb93896004820152602401610280565b565b5f808060ff841681037f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8611156142a657600a860460018201600a88065f14935093509350506142b0565b8593509150600190505b9250925092565b5f805f805f6142c6878761425b565b9250925092508061430d576040517fc47179660000000000000000000000000000000000000000000000000000000081526004810184905260248101839052604401610280565b50909590945092505050565b5f805f6143268585613253565b915091508061436b576040517f22c9f7bb0000000000000000000000000000000000000000000000000000000081526004810186905260248101859052604401610280565b509392505050565b5f6143808585858561438a565b1495945050505050565b5f80851584151781871282861218178584141780156143af578685925092505061324a565b505f858413156143c3575092949193919260015b8386035f8112604c82131780156143f65782156143e8575f899450945050505061324a565b885f9450945050505061324a565b600a82900a8981028a82828161440e5761440e615869565b051461443a57841561442a575f8b96509650505050505061324a565b8a5f96509650505050505061324a565b841561444f57889650945061324a9350505050565b955087945061324a9350505050565b5f807f800000000000000000000000000000000000000000000000000000000000000084036144f7577f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83036144ea576040517fd556b1110000000000000000000000000000000000000000000000000000000081526004810185905260248101849052604401610280565b600a840593508260010192505b50505f9190910391565b5f805f61450e8585613253565b915091508015801561451e575081155b1561436b576040517f8eba4d070000000000000000000000000000000000000000000000000000000081526004810186905260248101859052604401610280565b5f805f805f61456e878761461d565b9250925092508061430d576040517f05e51ecb0000000000000000000000000000000000000000000000000000000081526004810188905260248101879052604401610280565b5f805f83126145c857508290505f612f1b565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb48312156145fa57505f905082612f1b565b5f839003600a0a80858161461057614610615869565b0794859003959350505050565b5f805f845f0361463557505f915081905060016142b0565b7f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee800000000000000000085055f03614849576f4b3b4ca85a86c47a098a224000000000850515801561469e57507f80000000000000000000000000000000000000000000000000000000000000268412155b156146bf576f4b3b4ca85a86c47a098a224000000000850294506026840393505b7728c87cb5c89a2571ebfdcb54864ada834a00000000000000850515801561470757507f80000000000000000000000000000000000000000000000000000000000000138412155b1561472057678ac7230489e80000850294506013840393505b7b097edd871cfda3a5697758bf0e3cbb5ac5741c640000000000000000850515801561476c57507f800000000000000000000000000000000000000000000000000000000000000a8412155b15614782576402540be40085029450600a840393505b7e3899162693736ac531a5a58f1fbb4b746504382ca7e400000000000000000085051580156147d157507f80000000000000000000000000000000000000000000000000000000000000028412155b156147e757606485029450600284039350614782565b7f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee8000000000000000000850515801561483757507f80000000000000000000000000000000000000000000000000000000000000018412155b1561484957600a850294506001840393505b600a8086029081058614801561487f57507f80000000000000000000000000000000000000000000000000000000000000018512155b1561488e578095506001850394505b50939492935050507f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee80000000000000000008305151590565b5f8082121561491b577f8000000000000000000000000000000000000000000000000000000000000000820361491557507f8000000000000000000000000000000000000000000000000000000000000000919050565b505f0390565b5090565b5f805f61492c8686615121565b91509150815f036149505783818161494657614946615869565b0492505050610876565b83821061499a576040517f6c59da12000000000000000000000000000000000000000000000000000000008152600481018790526024810186905260448101859052606401610280565b5f84868809600186198101871696879004966002600389028118808a02820302808a02820302808a02820302808a02820302808a02820302808a02909103025f82900382900490920185841190960395909502919093039390930492909217029150509392505050565b5f805f8587181215614ace577f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff841115614abb57614a637f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6001615903565b8403614a9357507f800000000000000000000000000000000000000000000000000000000000000090508161324a565b614a9e600a856159e9565b614aa790615b96565b614ab2846001615b6f565b9150915061324a565b614ac484615b96565b839150915061324a565b7f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff841115614b0157614aa7600a856159e9565b508290508161324a565b5f818303614b1a575082610876565b82821315614b5d57828203604c811380614b3457505f8113155b15614b42575f915050610876565b80600a0a8581614b5457614b54615869565b05915050610876565b818303604c811380614b6f57505f8113155b15614bb7576040517f1d5d6d10000000000000000000000000000000000000000000000000000000008152600481018690526024810185905260448101849052606401610280565b600a81900a85810286828281614bcf57614bcf615869565b0514614c18576040517f1d5d6d10000000000000000000000000000000000000000000000000000000008152600481018890526024810187905260448101869052606401610280565b9250610876915050565b5f808383614c30828261455f565b90965094505f8613614cb157855f03614c75576040517f561fc7b500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517f5d3fd4db0000000000000000000000000000000000000000000000000000000081526004810183905260248101829052604401610280565b5050837f161bcca7119915b50764b4abe86529797775a5f171951000000000000000000003614cef57614ce583604c615b6f565b5f91509150610974565b7f161bcca7119915b50764b4abe86529797775a5f171951000000000000000000084121580614d3e577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb5614d60565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb45b5f0b8412614f1b575f805f805f85614d7957604b614d7c565b604c5b614d86908a615b6f565b90505f8087614db3577d90e40fbeea1d3a4abc8955e946fe31cdcf66f634e1000000000000000000614dd4565b7e05a8e89d75252446eb5d5d5b1cc5edf20a1a059e10ca0000000000000000005b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff169050808c81614e0657614e06615869565b05818102955090850193507ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc18019050614e3f8c826151cc565b7d90e40fbeea1d3a4abc8955e946fe31cdcf66f634e10000000000000000000295508594508a8414614ecb576123278114614ea657614e818c826001016151cc565b7d90e40fbeea1d3a4abc8955e946fe31cdcf66f634e100000000000000000002614ec8565b7f161bcca7119915b50764b4abe86529797775a5f17195100000000000000000005b94505b50614efb838b848c89897fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb4615253565b909a509850614f0c8a8a835f61311d565b97509750505050505050610974565b614f2585856150c8565b9095509350614f35868686614c22565b9095509350614f44858561445e565b9250925050610974565b50935093915050565b5f805f841215614f9357614f6b848461445e565b9094509250614f7b858585614f57565b9094509250614f8a84846150c8565b91509150610974565b5f80614f9f86866145b5565b9092509050845f8080614fb285856152f0565b9194509250905061270d612710614fca600182615bc6565b8514614fe157614fdb8d86866153df565b90925090505b831561506c575f614ff3866001615b6f565b90505b80848583028161500857615008615869565b051461501f57600a84059350600a88059750614ff6565b61506061502c8588615bec565b896150378785615bec565b8f87877ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc615253565b909d509b506150939050565b819b507ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc9a505b5050505050866150a484835f614b0b565b6150af886001615b6f565b6150b99190615b6f565b94509450505050935093915050565b5f806151167f161bcca7119915b50764b4abe86529797775a5f17195100000000000000000007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb486866134bc565b915091509250929050565b5f807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83850993909202808410938190039390930393915050565b5f81515f0361516c57505f919050565b50602001515f1a90565b5f6151808361515c565b82106151bc5781836040517ffcfaeff1000000000000000000000000000000000000000000000000000000008152600401610280929190615c37565b50600202016003015161ffff1690565b5f806151db600a6123286159e9565b6151e69060026159fc565b6151f1906001615903565b90505f615201600a6123286159e9565b90506002600a8504026001015f8052600281601e883c505f51617fff8116935061800081161561523057918101915b505f80526001600a8506600a6064870402018301601f873c50505f510192915050565b5f808888036152665750839050816152e4565b5f805f806152768c8b8f8d614082565b915091505f806152888a8a8d8c614082565b9150915061529884848484613f37565b8096508197505050505050505f806152b28b8b8f8d614082565b915091505f806152c4868686866134bc565b915091505f806152d684848f8e61311d565b909a50985050505050505050505b97509795505050505050565b5f805f837ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0361532857508391505f905060016142b0565b7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8412156153b6577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb084121561538757505f91505082151560016142b0565b5f846004015f03600a0a90505f8187816153a3576153a3615869565b05945050808402861415925090506142b0565b5f84126153cb57505f915081905060016142b0565b50505060048101600a0a82025f60016142b0565b5f808060646153f1600a6123286159e9565b6153fe600a6123286159e9565b6154099060026159fc565b615414906001615903565b61541e9190615903565b6154289190615903565b905061546c565b5f8052600280600a8504028301601e833c5f80516107d0840193505f80526001600a8606600a6064880402018501601f853c5f5101949350505050565b61547785828861542f565b92508315614f4e5761548d60018601828861542f565b915050935093915050565b614259615c4f565b5f602082840312156154b0575f80fd5b81357fffffffff0000000000000000000000000000000000000000000000000000000081168114610876575f80fd5b5f81518084528060208401602086015e5f6020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b602081525f61087660208301846154df565b5f6020828403121561554d575f80fd5b813567ffffffffffffffff811115615563575f80fd5b820160e08185031215610876575f80fd5b5f815180845260208085019450602084015f5b838110156155a357815187529582019590820190600101615587565b509495945050505050565b604081525f6155c06040830185615574565b8281036020848101919091528451808352858201928201905f5b818110156155f6578451835293830193918301916001016155da565b5090979650505050505050565b73ffffffffffffffffffffffffffffffffffffffff81168114615624575f80fd5b50565b5f60208284031215615637575f80fd5b813561087681615603565b5f8083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112615675575f80fd5b83018035915067ffffffffffffffff82111561568f575f80fd5b6020019150600581901b3603821315612f1b575f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff8111828210171561571a5761571a6156a6565b604052919050565b5f67ffffffffffffffff82111561573b5761573b6156a6565b5060051b60200190565b5f61575761575284615722565b6156d3565b83815260208082019190600586811b860136811115615774575f80fd5b865b818110156157fb57803567ffffffffffffffff811115615794575f80fd5b880136601f8201126157a4575f80fd5b80356157b261575282615722565b81815290851b820186019086810190368311156157cd575f80fd5b928701925b828410156157eb578335825292870192908701906157d2565b8952505050948301948301615776565b5092979650505050505050565b5f8083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261583b575f80fd5b83018035915067ffffffffffffffff821115615855575f80fd5b602001915036819003821315612f1b575f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f826158a4576158a4615869565b500690565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b8082018082111561017f5761017f6158d6565b828152604060208201525f61592e6040830184615574565b949350505050565b5f6020808385031215615947575f80fd5b825167ffffffffffffffff81111561595d575f80fd5b8301601f8101851361596d575f80fd5b805161597b61575282615722565b81815260059190911b82018301908381019087831115615999575f80fd5b928401925b82841015612f895783518252928401929084019061599e565b5f602082840312156159c7575f80fd5b5051919050565b5f602082840312156159de575f80fd5b815161087681615603565b5f826159f7576159f7615869565b500490565b808202811582820484141761017f5761017f6158d6565b600181815b80851115615a6c57817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115615a5257615a526158d6565b80851615615a5f57918102915b93841c9390800290615a18565b509250929050565b5f82615a825750600161017f565b81615a8e57505f61017f565b8160018114615aa45760028114615aae57615aca565b600191505061017f565b60ff841115615abf57615abf6158d6565b50506001821b61017f565b5060208310610133831016604e8410600b8410161715615aed575081810a61017f565b615af78383615a13565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115615b2957615b296158d6565b029392505050565b5f6108768383615a74565b8181038181111561017f5761017f6158d6565b5f60208284031215615b5f575f80fd5b815160ff81168114610876575f80fd5b8082018281125f831280158216821582161715615b8e57615b8e6158d6565b505092915050565b5f7f80000000000000000000000000000000000000000000000000000000000000008203614915576149156158d6565b8181035f831280158383131683831282161715615be557615be56158d6565b5092915050565b8082025f82127f800000000000000000000000000000000000000000000000000000000000000084141615615c2357615c236158d6565b818105831482151761017f5761017f6158d6565b828152604060208201525f61592e60408301846154df565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52605160045260245ffdfe097c09cb0a0d0bce0c4e0c600c780cba0d0f0d210d330d450dea0e270ff3115d124813ea1539160916cd181c13ea190a19391939196819971a1f1a331b201b841b9c1c171c2f1c471c801caa1cc21cda1ce71de21e041e111ec91f181f5b1f7f1f8c1f992032207b20882107215621a521f222412290234823742396244e248f24b625032550259f25ec263926862777097c09cb0a0d0bce0c4e0c600c780cba0d0f0d210d330d450dea0e270ff3115d124813ea1539160916cd181c13ea190a19391939196819971a1f1a331b201b841b9c1c171c2f1c471c801caa1cc21cda1ce71de21e041e111ec91f181f5b1f7f1f8c1f992032207b20882107215621a521f222412290234823742396244e248f24b625032550259f25ec263926862777"; + hex"608060405234801561000f575f80fd5b5061001861003d565b515f0361003857604051632413c92160e01b815260040160405180910390fd5b61005d565b60606040518060c0016040528060928152602001615dd160929139905090565b615d678061006a5f395ff3fe608060405234801561000f575f80fd5b506004361061003f575f3560e01c806301ffc9a714610043578063514b5d4f1461006b578063d04dfe2314610080575b5f80fd5b6100566100513660046154f8565b6100a1565b60405190151581526020015b60405180910390f35b610073610185565b6040516100629190615583565b61009361008e366004615595565b610194565b604051610062929190615606565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082167fd04dfe2300000000000000000000000000000000000000000000000000000000148061013357507fffffffff0000000000000000000000000000000000000000000000000000000082167f514b5d4f00000000000000000000000000000000000000000000000000000000145b8061017f57507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b92915050565b606061018f610390565b905090565b6060805f61021b84830135602086018035906101b0908861567f565b6101bd608089018961569a565b6101c69161579d565b6101ce610645565b6101db60408b018b615860565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152509297969594939250506106659050565b9050600261022c60c086018661569a565b6102379291506158ee565b156102895761024960c085018561569a565b6040517f01c71f3d000000000000000000000000000000000000000000000000000000008152610280925060040190815260200190565b60405180910390fd5b5f5b61029860c086018661569a565b905081101561031b576060820151610304906102b760c088018861569a565b848181106102c7576102c7615901565b90506020020135878060c001906102de919061569a565b6102e986600161595b565b8181106102f8576102f8615901565b905060200201356107b0565b606083015261031460028261595b565b905061028b565b5061038661032c60a086018661569a565b808060200260200160405190810160405280939291908181526020018383602002808284375f92019190915250859392507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff915050610886565b9250925050915091565b6040805161094081018252604980825261098560208301526109d492820192909252610a16606082810191909152610bd76080830152610c5760a0830152610c6960c0830152610c8160e0830152610cc3610100830152610d18610120830152610d2a610140830152610d3c610160830152610d4e610180830152610df36101a0830152610e306101c0830152610ffc6101e08301526111666102008301526112516102208301526113f361024083018190526115426102608401526116126102808401526116d66102a08401526118256102c08401526102e083015261191361030083015261194261032083018190526103408301526119716103608301526119a0610380830152611a286103a0830152611a3c6103c0830152611b296103e0830152611b8d610400830152611ba5610420830152611c20610440830152611c38610460830152611c50610480830152611c896104a0830152611cb36104c0830152611ccb6104e0830152611ce3610500830152611cf0610520830152611deb610540830152611e0d610560830152611e1a610580830152611ed26105a0830152611f216105c0830152611f646105e0830152611f88610600830152611f95610620830152611fa261064083015261203b6106608301526120846106808301526120916106a08301526121106106c083015261215f6106e08301526121ae6107008301526121fb61072083015261224a6107408301526122996107608301526123516107808301526123a06107a08301526123cc6107c08301526123ee6107e08301526124a66108008301526124e761082083015261250e61084083015261255b6108608301526125a86108808301526125f76108a08301526126446108c08301526126916108e08301526126de6109008301526127cf610920830152919081908061063c81612801565b94505050505090565b60606040518060c0016040528060928152602001615cd560929139905090565b6106c660405180610120016040528060608152602001606081526020015f81526020015f81526020015f81526020015f73ffffffffffffffffffffffffffffffffffffffff1681526020016060815260200160608152602001606081525090565b602087810180516040600191820184028b018181015182515f91821a808252948501870281019093526041808301968381019593600285020190910191908401905b8381101561074657875160f01c83015160408051600192831a8082528301602090810290910191829052908452600290990198929092019101610708565b505050506040518061012001604052808281526020018481526020018b81526020015f81526020018a81526020018973ffffffffffffffffffffffffffffffffffffffff168152602001888152602001838152602001878152509450505050509695505050505050565b5f82815260208120600f900660100284811c61ffff1690815b82156107e357825186146107e357604083015192506107c9565b821580156108315760405193506060840160405286845285602085015281604085015260028860f01c0161ffff60f01b1989168160f01b1798505061ffff831b19881684841b179750610838565b8560208501525b50505061ffff81111561087a576040517fcadaf56d00000000000000000000000000000000000000000000000000000000815260048101829052602401610280565b849150505b9392505050565b6060805f8061089d8760e001518860400151612885565b915091505f80885f01518960400151815181106108bc576108bc615901565b60200260200101519150819050838851146109105787516040517fd628439f000000000000000000000000000000000000000000000000000000008152610280918691600401918252602082015260400190565b875115610935575f60208951028203915060208901905061093381838b516128a8565b505b610945898a6040015183856128b4565b90505f8388106109555783610957565b875b90506060602083039050818152806109728c60600151612b45565b975097505050505050505b935093915050565b604083015183516020600192830181029091015161ffff8516909201029003517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0909101908152809392505050565b60208084015161ffff841660010190910201517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0909101908152809392505050565b602083015180515f9161ffff851691600f601087901c811692601488901c9091169185919085908110610a4b57610a4b615901565b602002602001015190505f80610a64839060a082901c90565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08a0180518882526040517f58c07152000000000000000000000000000000000000000000000000000000008152939550919350915f9073ffffffffffffffffffffffffffffffffffffffff8616906358c0715290610ae9908790879060040161596e565b5f60405180830381865afa158015610b03573d5f803e3d5ffd5b505050506040513d5f823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201604052610b48919081019061598e565b905080518714610b915780516040517fc3385cb0000000000000000000000000000000000000000000000000000000008152610280918991600401918252602082015260400190565b818352602088028b019a50602081016020880281015b80821015610bc45760208d039c5081518d52602082019150610ba7565b509a9d9c50505050505050505050505050565b60c083015180515f9160ff85811692600887901c90911691849184908110610c0157610c01615901565b60200260200101518281518110610c1a57610c1a615901565b60209081029190910101517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0909501948552509295945050505050565b60208101805182511681529392505050565b80515f90610c7681612db8565b835250909392505050565b80516001600884901c60ff9081169190911b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0193161c919091168152919050565b805160209091018051600160ff600886901c81169190911b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01941684811b199091169390921690911b919091178152919050565b60208101805182511781529392505050565b805161ffff83161b8152809392505050565b805161ffff83161c8152809392505050565b8251600161ffff841690810160209081028301515f93600f601088901c811693601489901c90911692908190850288015b80891015610d9c5760208203915088518252602089019850610d7f565b5060408a01805190879052610db38b8284866128b4565b60408c0182905260208602998a9003999092508201895b81841015610de2578351815260209384019301610dca565b50989b9a5050505050505050505050565b60109190911c600f166020028082207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09190920101908152919050565b805160208201516040909201805190925f929173ffffffffffffffffffffffffffffffffffffffff83168314610e95576040517f0255ddd800000000000000000000000000000000000000000000000000000000815260048101849052602401610280565b8173ffffffffffffffffffffffffffffffffffffffff168214610ee7576040517f0255ddd800000000000000000000000000000000000000000000000000000000815260048101839052602401610280565b8073ffffffffffffffffffffffffffffffffffffffff168114610f39576040517f0255ddd800000000000000000000000000000000000000000000000000000000815260048101829052602401610280565b6040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff838116600483015282811660248301525f919085169063dd62ed3e90604401602060405180830381865afa158015610fae573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610fd29190615a0f565b90505f610fde85612e90565b90505f610feb8383612f39565b508852509598975050505050505050565b80516020909101805190915f9173ffffffffffffffffffffffffffffffffffffffff8216821461105b576040517f0255ddd800000000000000000000000000000000000000000000000000000000815260048101839052602401610280565b8073ffffffffffffffffffffffffffffffffffffffff1681146110ad576040517f0255ddd800000000000000000000000000000000000000000000000000000000815260048101829052602401610280565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff82811660048301525f91908416906370a0823190602401602060405180830381865afa15801561111a573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061113e9190615a0f565b90505f61114a84612e90565b90505f6111578383612f7a565b87525094979650505050505050565b80515f9073ffffffffffffffffffffffffffffffffffffffff811681146111bc576040517f0255ddd800000000000000000000000000000000000000000000000000000000815260048101829052602401610280565b5f8173ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611206573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061122a9190615a0f565b90505f61123683612e90565b90505f6112438383612f7a565b865250939695505050505050565b805160208201516040909201805190925f929173ffffffffffffffffffffffffffffffffffffffff831683146112b6576040517f0255ddd800000000000000000000000000000000000000000000000000000000815260048101849052602401610280565b8173ffffffffffffffffffffffffffffffffffffffff168214611308576040517f0255ddd800000000000000000000000000000000000000000000000000000000815260048101839052602401610280565b8073ffffffffffffffffffffffffffffffffffffffff16811461135a576040517f0255ddd800000000000000000000000000000000000000000000000000000000815260048101829052602401610280565b6040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff838116600483015282811660248301525f919085169063dd62ed3e90604401602060405180830381865afa1580156113cf573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906112439190615a0f565b80516020909101805190915f9173ffffffffffffffffffffffffffffffffffffffff82168214611452576040517f0255ddd800000000000000000000000000000000000000000000000000000000815260048101839052602401610280565b8073ffffffffffffffffffffffffffffffffffffffff1681146114a4576040517f0255ddd800000000000000000000000000000000000000000000000000000000815260048101829052602401610280565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff82811660048301525f91908416906370a0823190602401602060405180830381865afa158015611511573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115359190615a0f565b8552509295945050505050565b80515f9073ffffffffffffffffffffffffffffffffffffffff81168114611598576040517f0255ddd800000000000000000000000000000000000000000000000000000000815260048101829052602401610280565b5f8173ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156115e2573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906116069190615a0f565b84525091949350505050565b80515f9073ffffffffffffffffffffffffffffffffffffffff81168114611668576040517f0255ddd800000000000000000000000000000000000000000000000000000000815260048101829052602401610280565b5f8173ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156116b2573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906116069190615a26565b80516020909101805190915f9173ffffffffffffffffffffffffffffffffffffffff82168214611735576040517f0255ddd800000000000000000000000000000000000000000000000000000000815260048101839052602401610280565b8073ffffffffffffffffffffffffffffffffffffffff168114611787576040517f0255ddd800000000000000000000000000000000000000000000000000000000815260048101829052602401610280565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff82811660048301525f91908416906370a0823190602401602060405180830381865afa1580156117f4573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906118189190615a0f565b90505f611243825f612f7a565b80516020909101805190915f9173ffffffffffffffffffffffffffffffffffffffff82168214611884576040517f0255ddd800000000000000000000000000000000000000000000000000000000815260048101839052602401610280565b6040517f6352211e000000000000000000000000000000000000000000000000000000008152600481018290525f9073ffffffffffffffffffffffffffffffffffffffff841690636352211e90602401602060405180830381865afa1580156118ef573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115359190615a26565b437fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09190910190815292915050565b427fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09190910190815292915050565b467fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09190910190815292915050565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe06020600f601085901c1602828101918201925f928391905b80821015611a1c57815192507bffffffffffffffffffffffffffffffffffffffffffffffffffffffff831615611a1157828652611a1c565b8160200191506119d9565b50939695505050505050565b805160209091018051909114815292915050565b5f805f80805f80600f8960101c169350600284069250879150602083850302820190506020831502810397508215611a7357805194505b5f5b81831015611abe5750815195507bffffffffffffffffffffffffffffffffffffffffffffffffffffffff86161580611ab35760208301518952611abe565b826040019250611a75565b8015611b1a57604080518082019091525f6020820152600887901c601f88168083019190915281525b6040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102809190615583565b50969998505050505050505050565b805160208201516040909201915f91907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8216611b8357604080518082019091525f6020820152600882901c601f8316808301919091528152611ae7565b5091949350505050565b80516020909101805190915f91826115358383612f9e565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe06020600f601085901c1602828101918201925f928391905b80821015611a1c57815192507bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8316611c15575f8652611a1c565b816020019150611bde565b80516020909101805190915f91826115358383612fec565b80516020909101805190915f9182611535838361303b565b805160407bffffffffffffffffffffffffffffffffffffffffffffffffffffffff90911615156020028203810151910190815292915050565b80515f90817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff821615611606565b80516020909101805190915f9182611535838361308b565b80516020909101805190915f918261153583836130da565b80515f90610c768161312a565b805160208201516040909201915f91907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff808316601b90810b9160e085811d9291851690910b9084901d611d4284848484613175565b9094509250600f60108a901c1660025b81811015611da85789516020909a019996507bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8716601b0b935060e087901d9250611d9b86868686613175565b9096509450600101611d52565b5050611db484846132ab565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe098909801978852509598975050505050505050565b80516020909101805190915f916116066002611e0784846133b1565b90613413565b80515f90610c7681613458565b805160208201516040909201915f91907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff808316601b90810b9160e085811d9291851690910b9084901d611e6c84848484613514565b9094509250600f60108a901c1660025b81811015611da85789516020909a019996507bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8716601b0b935060e087901d9250611ec586868686613514565b9096509450600101611e7c565b7fffffffbe19cfc6ef4f44cf88f14500d013df534fcaad48fca1d5ca47bea26fcc7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09190910190815292915050565b80515f90610c767fffffffbe19cfc6ef4f44cf88f14500d013df534fcaad48fca1d5ca47bea26fcc8273c51a14251b0dcf0ae24a96b7153991378938f5f5613b2f565b80515f90610c7660028273c51a14251b0dcf0ae24a96b7153991378938f5f5613b2f565b80515f90610c7681613d89565b80515f90610c7681613e2f565b80516020909101805190915f9182611fba838261308b565b90505f611fc7838261308b565b90505f6120257fffffffff0000000000000000000000000000000000000000000000000000000573c51a14251b0dcf0ae24a96b7153991378938f5f561201e61200f8861312a565b6120188a61312a565b90613e7a565b9190613b2f565b9050811515831515146112435761115781613ebf565b80515f906120528161204c81613458565b90613ef1565b90507bffffffffffffffffffffffffffffffffffffffffffffffffffffffff811661207b575060015b82525092915050565b80515f90610c7681613f36565b805160208201516040909201915f91906120ab8282613f68565b9150600f601086901c1660025b818110156120de57855160209096019592506120d48484613f68565b93506001016120b8565b5050507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0929092019182525092915050565b7f80000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09190910190815292915050565b7f7fffffff7fffffffffffffffffffffffffffffffffffffffffffffffffffffff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09190910190815292915050565b805160208201516040909201915f91906121c88282613f84565b9150600f601086901c1660025b818110156120de57855160209096019592506121f18484613f84565b93506001016121d5565b7f7fffffff800000000000000000000000000000000000000000000000000000007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09190910190815292915050565b7f80000000000000000000000000000000000000000000000000000000000000017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09190910190815292915050565b805160208201516040909201915f91907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff808316601b90810b9160e085811d9291851690910b9084901d6122eb84848484613f8f565b9094509250600f60108a901c1660025b81811015611da85789516020909a019996507bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8716601b0b935060e087901d925061234486868686613f8f565b90965094506001016122fb565b7fffffffbe1dd4c9e873614f593bba9c6007d9a7ac8d03a4b6c700a65cb537a1b47fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09190910190815292915050565b80516020909101805190915f91611606828273c51a14251b0dcf0ae24a96b7153991378938f5f5613b2f565b80515f90610c768173c51a14251b0dcf0ae24a96b7153991378938f5f56140ae565b805160208201516040909201915f91907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff808316601b90810b9160e085811d9291851690910b9084901d612440848484846140da565b9094509250600f60108a901c1660025b81811015611da85789516020909a019996507bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8716601b0b935060e087901d9250612499868686866140da565b9096509450600101612450565b805160208201516040909201805190925f92916115356124e08273c51a14251b0dcf0ae24a96b7153991378938f5f561201e8660016133b1565b8490613e7a565b805160208201516040909201805190925f92916115356125078383613e7a565b84906133b1565b805160208201516040909201915f9190612528818361595b565b9150600f601086901c1660025b818110156120de5785516020909601959250612551838561595b565b9350600101612535565b805160208201516040909201915f91906125758183615a41565b9150600f601086901c1660025b818110156120de578551602090960195925061259e8385615a41565b9350600101612582565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09190910190815292915050565b805160208201516040909201915f91906126118183615a54565b9150600f601086901c1660025b818110156120de578551602090960195925061263a8385615a54565b935060010161261e565b805160208201516040909201915f919061265e8183615b89565b9150600f601086901c1660025b818110156120de57855160209096019592506126878385615b89565b935060010161266b565b805160208201516040909201915f91906126ab8183615b94565b9150600f601086901c1660025b818110156120de57855160209096019592506126d48385615b94565b93506001016126b8565b805160608401515f9190829081906126f69084614104565b91509150815f036127c05760a087015160808801516040517f295f36d70000000000000000000000000000000000000000000000000000000081526004810191909152602481018590525f9173ffffffffffffffffffffffffffffffffffffffff169063295f36d790604401602060405180830381865afa15801561277d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906127a19190615a0f565b60608901519091506127b49085836107b0565b606089015285526127c4565b8085525b509295945050505050565b8051602082015160608501516040909301925f9291906127f09083836107b0565b606087015250829150509392505050565b60605f825160020267ffffffffffffffff811115612821576128216156fe565b6040519080825280601f01601f19166020018201604052801561284b576020820181803683370190505b50905061ffff80196020850160208651028101600285015b81831015611a1c57805183518616908516178152602090920191600201612863565b5f805f612892858561414b565b51600281901a9660039190911a95509350505050565b6020810283835e505050565b5f80856040015190505f805f805f60028b6101000151516128d59190615a41565b60e08c01516101008d0151602080830151600261ffff9b909b168b8102850160219081015160f01c5f93841a9d909d029095019b909b019384015160258086019b50600791831a9182169182900360040290950190940198509296500193509091506154f090805b86881015612abf5787519050600284825f1a060285015160f01c925062ffffff8160e01c1691506129738e838e8663ffffffff16565b9b506002848260041a060285015160f01c925062ffffff8160c01c1691506129a08e838e8663ffffffff16565b9b506002848260081a060285015160f01c925062ffffff8160a01c1691506129cd8e838e8663ffffffff16565b9b5060028482600c1a060285015160f01c925062ffffff8160801c1691506129fa8e838e8663ffffffff16565b9b506002848260101a060285015160f01c925062ffffff8160601c169150612a278e838e8663ffffffff16565b9b506002848260141a060285015160f01c925062ffffff8160401c169150612a548e838e8663ffffffff16565b9b506002848260181a060285015160f01c925062ffffff8160201c169150612a818e838e8663ffffffff16565b9b5060028482601c1a060285015160f01c925062ffffff81169150612aab8e838e8663ffffffff16565b9b50612ab860208961595b565b975061293d565b612aca601c89615b94565b9750612ad7866004615a54565b612ae1908961595b565b96505b86881015612b275750508551601c81901a83900660020284015160f01c915062ffffff811690612b138e838e86565b9b50612b2060048961595b565b9750612ae4565b612b338d8a8e8e61417a565b50999c9b505050505050505050505050565b6040805160f083901c602081810283010190925290815261ffff63ffffffff67ffffffffffffffff6fffffffffffffffffffffffffffffffff612bb1565b5f5b8215612bab57825182526020830151602083015260408301519250604082019150612b85565b50919050565b602085018660101b60901c8015612ca1578060401c8015612c1f578060201c8015612be357612be08185612b83565b93505b508086168015612c1d578060101c8015612c0457612c018186612b83565b94505b508088168015612c1b57612c188186612b83565b94505b505b505b508084168015612c9f578060201c8015612c63578060101c8015612c4a57612c478186612b83565b94505b508088168015612c6157612c5e8186612b83565b94505b505b508086168015612c9d578060101c8015612c8457612c818186612b83565b94505b508088168015612c9b57612c988186612b83565b94505b505b505b505b508682168015612dad578060401c8015612d2b578060201c8015612cef578060101c8015612cd657612cd38186612b83565b94505b508088168015612ced57612cea8186612b83565b94505b505b508086168015612d29578060101c8015612d1057612d0d8186612b83565b94505b508088168015612d2757612d248186612b83565b94505b505b505b508084168015612dab578060201c8015612d6f578060101c8015612d5657612d538186612b83565b94505b508088168015612d6d57612d6a8186612b83565b94505b505b508086168015612da9578060101c8015612d9057612d8d8186612b83565b94505b508088168015612da757612da48186612b83565b94505b505b505b505b505050505050919050565b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203612de95750610100919050565b507f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f7f5555555555555555555555555555555555555555555555555555555555555555600183901c16909103600281901c7f3333333333333333333333333333333333333333333333333333333333333333908116911601600481901c01167f01010101010101010101010101010101010101010101010101010101010101010260f81c90565b5f612e9961420d565b6040517ff5c36eaf00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8316600482015273200e12d10bb0c5e4a17e7018f0f1161919bb93899063f5c36eaf90602401602060405180830381865afa158015612f15573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061017f9190615ba7565b5f805f805f612f4887876142b3565b9250925092505f80612f5a85856132ab565b9150915081838015612f695750815b9650965050505050505b9250929050565b5f805f612f87858561430f565b91509150612f958282614371565b95945050505050565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838116601b90810b9160e086811d9291861690910b9085901d612fe1848484846143cb565b979650505050505050565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838116601b90810b9160e086811d9291861690910b9085901d61302f848484846143e2565b12979650505050505050565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838116601b90810b9160e086811d9291861690910b9085901d61307e848484846143e2565b1315979650505050505050565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838116601b90810b9160e086811d9291861690910b9085901d6130ce848484846143e2565b13979650505050505050565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838116601b90810b9160e086811d9291861690910b9085901d61311d848484846143e2565b1215979650505050505050565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8216601b0b60e083901d8282121561316a5761316482826144b6565b90925090505b5f612f958383614559565b5f80851584151780156131a157865f0361319557848492509250506132a2565b868692509250506132a2565b6131ab87876145b7565b90975095506131ba85856145b7565b9095509350858413156131ce579395929492935b838603604c8111156131e75787879350935050506132a2565b80600a0a86816131f9576131f96158c1565b0595505086850180881860ff90811c151589881890911c1516801561329457877f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0361327b576040517fd556b111000000000000000000000000000000000000000000000000000000008152600481018a905260248101899052604401610280565b600a968790059690980586019760019790970196613298565b8198505b5050868692509250505b94509492505050565b5f601b83900b831483838261330f577d90e40fbeea1d3a4abc8955e946fe31cdcf66f634e10000000000000000008605156132ef57620186a0860595506005850194505b8586601b0b1461330a57600a860595508460010194506132ef565b613325565b855f0361332557505f925060019150612f739050565b848560030b14613381575f85121561334557505f9250829150612f739050565b6040517fd556b1110000000000000000000000000000000000000000000000000000000081526004810183905260248101829052604401610280565b50507bffffffffffffffffffffffffffffffffffffffffffffffffffffffff841660e084901b1791509250929050565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838116601b90810b9160e086811d9291861690910b9085901d84806133f686868686613175565b915091505f6134058383614559565b9a9950505050505050505050565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838116601b90810b9160e086811d9291861690910b9085901d84806133f686868686613514565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8216601b0b60e083901d82811261348f57509192915050565b5f8061349b848461460d565b91509150805f036134b0575093949350505050565b5f8113156135095761350482847f161bcca7119915b50764b4abe86529797775a5f17195100000000000000000007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb4613175565b935091505b5f612fe18385614559565b5f80835f03613559576040517f7a97930f0000000000000000000000000000000000000000000000000000000081526004810187905260248101869052604401610280565b855f0361356a57505f9050806132a2565b5f805f806135788a8a614675565b919b50995091506135898888614675565b919950975090505f61359a8b614916565b90505f6135a68a614916565b90507f161bcca7119915b50764b4abe86529797775a5f1719510000000000000000000604c818310156139c357841561360457507f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee80000000000000000009050604b613982565b6f4b3b4ca85a86c47a098a22400000000083101561373057678ac7230489e80000831015613694576402540be40083101561366257620186a08310156136525750620186a09050600561390b565b506402540be4009050600a61390b565b655af3107a40008310156136815750655af3107a40009050600e61390b565b50678ac7230489e800009050601361390b565b6b204fce5e3e250261100000008310156136e65769152d02c7e14af68000008310156136cf575069152d02c7e14af68000009050601761390b565b506b204fce5e3e250261100000009050601c61390b565b6d314dc6448d9338c15b0a0000000083101561371557506d314dc6448d9338c15b0a000000009050602161390b565b506f4b3b4ca85a86c47a098a2240000000009050602661390b565b780197d4df19d605767337e9f14d3eec8920e4000000000000008310156138285773af298d050e4395d69670b12b7f410000000000008310156137c3577172cb5bd86321e38cb6ce6682e800000000008310156137a457507172cb5bd86321e38cb6ce6682e800000000009050602b61390b565b5073af298d050e4395d69670b12b7f410000000000009050603061390b565b76010b46c6cdd6e3e0828f4db456ff0c8ea0000000000000831015613804575076010b46c6cdd6e3e0828f4db456ff0c8ea00000000000009050603561390b565b50780197d4df19d605767337e9f14d3eec8920e4000000000000009050603a61390b565b7c03b58e88c75313ec9d329eaaa18fb92f75215b171000000000000000008310156138be577a026e4d30eccc3215dd8f3157d27e23acbdcfe6800000000000000083101561389657507a026e4d30eccc3215dd8f3157d27e23acbdcfe680000000000000009050603f61390b565b507c03b58e88c75313ec9d329eaaa18fb92f75215b171000000000000000009050604461390b565b7e05a8e89d75252446eb5d5d5b1cc5edf20a1a059e10ca00000000000000000083101561390b57507e05a8e89d75252446eb5d5d5b1cc5edf20a1a059e10ca000000000000000000905060495b81831161393f57600a820491507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0161390b565b815f03613982576040517f05e51ecb000000000000000000000000000000000000000000000000000000008152600481018d9052602481018c9052604401610280565b856139c3576040517f05e51ecb000000000000000000000000000000000000000000000000000000008152600481018f9052602481018e9052604401610280565b807f8000000000000000000000000000000000000000000000000000000000000000018d126139f657808d039c50613a69565b7f80000000000000000000000000000000000000000000000000000000000000009c90038c015f811315613a6957807f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038b13613a5657998a0199613a69565b5f809950995050505050505050506132a2565b5f808e128015613a7857505f8c135b15613ab5577f80000000000000000000000000000000000000000000000000000000000000008e01808d13613aad575f613ab1565b808d035b9150505b8b818f01039750613ad28f8e613acc888789614977565b8b614a5c565b90995097505f811315613b1c57604c811315613afc575f809a509a505050505050505050506132a2565b80600a0a8981613b0e57613b0e6158c1565b059850885f03613b1c575f97505b509698509496506132a295505050505050565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff848116601b0b9060e086901d908516613b6c57506001915061087f9050565b5f8213613c0557815f03613bc957613b84855f61308b565b15613bbe576040517f8be8297200000000000000000000000000000000000000000000000000000000815260048101869052602401610280565b505f915061087f9050565b6040517fcceba0f10000000000000000000000000000000000000000000000000000000081526004810183905260248101829052604401610280565b613c10856001612f9e565b8015613c215750613c21865f612fec565b15613c3057859250505061087f565b613c3a855f61308b565b15613c6357613c5a613c4b87613f36565b613c5487613ebf565b86613b2f565b9250505061087f565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8516601b0b60e086901d5f80613c96848461460d565b915091505f613ca683855f614b63565b905060015f8080613cdd8f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8116601b0b9160e09190911d90565b915091505b60018510613d245784600116600103613d0757613d0184848484613f8f565b90945092505b600185901c9450613d1a82828484613f8f565b9092509050613ce2565b5f80613d318f8e8e614c7a565b91509150613d4182828a8d613f8f565b9092509050613d518f8383614faf565b9092509050613d6282828888613f8f565b90925090505f613d728383614559565b9e5050505050505050505050505050509392505050565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8216601b0b60e083901d828112613dc057509192915050565b5f80613dcc848461460d565b915091505f84128015613dde57508015155b156135095761350482847f161bcca7119915b50764b4abe86529797775a5f17195100000000000000000007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb46140da565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8216601b0b60e083901d82613e62838361460d565b9150505f613e708284614559565b9695505050505050565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838116601b90810b9160e086811d9291861690910b9085901d84806133f686868686613f8f565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8216601b0b60e083901d61316482826144b6565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838116601b90810b9160e086811d9291861690910b9085901d84806133f6868686866140da565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8216601b0b60e083901d6131648282615120565b5f613f738383612fec565b613f7d578161087f565b5090919050565b5f613f73838361308b565b5f8085158415178015613fa7575f92505f91506140a4565b613fb18487615bc7565b91505f613fbd88614916565b90505f613fc987614916565b90505f613fd68383615179565b5090505f6f0785ee10d5da46d900f436a00000000082111561400b576f0785ee10d5da46d900f436a000000000820491506025015b670de0b6b3a764000082111561402c57670de0b6b3a7640000820491506012015b633b9aca0082111561404557633b9aca00820491506009015b61271082111561405a57612710820491506004015b811561406e57600a8204915060010161405a565b6140788187615bc7565b955061409a8b8a614094878761408f87600a615b89565b614977565b89614a5c565b9097509550505050505b5094509492505050565b5f61087f837fffffffff0000000000000000000000000000000000000000000000000000000584613b2f565b5f806140e684846144b6565b90945092506140f786868686613175565b9150915094509492505050565b5f80825f526010600f60205f20060261ffff85821c165b80156141425780518503614139576001935060208101519250614142565b6040015161411b565b50509250929050565b5f80614156846151b4565b60020260010190505f61416985856151ce565b949091019093016020019392505050565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08201805163ffff0000601087901b1661ffff86161782527f312f5ae588c6ff62cd3f006af06cd48c98d7321649db7d8b2c396a81a204655591905f808686036004017ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8801865afa5090525050505050565b73200e12d10bb0c5e4a17e7018f0f1161919bb93893b1580614264575073200e12d10bb0c5e4a17e7018f0f1161919bb93893f7f1de7d717526cba131d684e312dedbf0852adef9cced9e36798ae4937f7145d4114155b156142b1576040517f73e6d7b300000000000000000000000000000000000000000000000000000000815273200e12d10bb0c5e4a17e7018f0f1161919bb93896004820152602401610280565b565b5f808060ff841681037f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8611156142fe57600a860460018201600a88065f1493509350935050614308565b8593509150600190505b9250925092565b5f805f805f61431e87876142b3565b92509250925080614365576040517fc47179660000000000000000000000000000000000000000000000000000000081526004810184905260248101839052604401610280565b50909590945092505050565b5f805f61437e85856132ab565b91509150806143c3576040517f22c9f7bb0000000000000000000000000000000000000000000000000000000081526004810186905260248101859052604401610280565b509392505050565b5f6143d8858585856143e2565b1495945050505050565b5f808515841517818712828612181785841417801561440757868592509250506132a2565b505f8584131561441b575092949193919260015b8386035f8112604c821317801561444e578215614440575f89945094505050506132a2565b885f945094505050506132a2565b600a82900a8981028a828281614466576144666158c1565b0514614492578415614482575f8b9650965050505050506132a2565b8a5f9650965050505050506132a2565b84156144a75788965094506132a29350505050565b95508794506132a29350505050565b5f807f8000000000000000000000000000000000000000000000000000000000000000840361454f577f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8303614542576040517fd556b1110000000000000000000000000000000000000000000000000000000081526004810185905260248101849052604401610280565b600a840593508260010192505b50505f9190910391565b5f805f61456685856132ab565b9150915080158015614576575081155b156143c3576040517f8eba4d070000000000000000000000000000000000000000000000000000000081526004810186905260248101859052604401610280565b5f805f805f6145c68787614675565b92509250925080614365576040517f05e51ecb0000000000000000000000000000000000000000000000000000000081526004810188905260248101879052604401610280565b5f805f831261462057508290505f612f73565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb483121561465257505f905082612f73565b5f839003600a0a808581614668576146686158c1565b0794859003959350505050565b5f805f845f0361468d57505f91508190506001614308565b7f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee800000000000000000085055f036148a1576f4b3b4ca85a86c47a098a22400000000085051580156146f657507f80000000000000000000000000000000000000000000000000000000000000268412155b15614717576f4b3b4ca85a86c47a098a224000000000850294506026840393505b7728c87cb5c89a2571ebfdcb54864ada834a00000000000000850515801561475f57507f80000000000000000000000000000000000000000000000000000000000000138412155b1561477857678ac7230489e80000850294506013840393505b7b097edd871cfda3a5697758bf0e3cbb5ac5741c64000000000000000085051580156147c457507f800000000000000000000000000000000000000000000000000000000000000a8412155b156147da576402540be40085029450600a840393505b7e3899162693736ac531a5a58f1fbb4b746504382ca7e4000000000000000000850515801561482957507f80000000000000000000000000000000000000000000000000000000000000028412155b1561483f576064850294506002840393506147da565b7f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee8000000000000000000850515801561488f57507f80000000000000000000000000000000000000000000000000000000000000018412155b156148a157600a850294506001840393505b600a808602908105861480156148d757507f80000000000000000000000000000000000000000000000000000000000000018512155b156148e6578095506001850394505b50939492935050507f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee80000000000000000008305151590565b5f80821215614973577f8000000000000000000000000000000000000000000000000000000000000000820361496d57507f8000000000000000000000000000000000000000000000000000000000000000919050565b505f0390565b5090565b5f805f6149848686615179565b91509150815f036149a85783818161499e5761499e6158c1565b049250505061087f565b8382106149f2576040517f6c59da12000000000000000000000000000000000000000000000000000000008152600481018790526024810186905260448101859052606401610280565b5f84868809600186198101871696879004966002600389028118808a02820302808a02820302808a02820302808a02820302808a02820302808a02909103025f82900382900490920185841190960395909502919093039390930492909217029150509392505050565b5f805f8587181215614b26577f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff841115614b1357614abb7f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600161595b565b8403614aeb57507f80000000000000000000000000000000000000000000000000000000000000009050816132a2565b614af6600a85615a41565b614aff90615bee565b614b0a846001615bc7565b915091506132a2565b614b1c84615bee565b83915091506132a2565b7f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff841115614b5957614aff600a85615a41565b50829050816132a2565b5f818303614b7257508261087f565b82821315614bb557828203604c811380614b8c57505f8113155b15614b9a575f91505061087f565b80600a0a8581614bac57614bac6158c1565b0591505061087f565b818303604c811380614bc757505f8113155b15614c0f576040517f1d5d6d10000000000000000000000000000000000000000000000000000000008152600481018690526024810185905260448101849052606401610280565b600a81900a85810286828281614c2757614c276158c1565b0514614c70576040517f1d5d6d10000000000000000000000000000000000000000000000000000000008152600481018890526024810187905260448101869052606401610280565b925061087f915050565b5f808383614c8882826145b7565b90965094505f8613614d0957855f03614ccd576040517f561fc7b500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517f5d3fd4db0000000000000000000000000000000000000000000000000000000081526004810183905260248101829052604401610280565b5050837f161bcca7119915b50764b4abe86529797775a5f171951000000000000000000003614d4757614d3d83604c615bc7565b5f9150915061097d565b7f161bcca7119915b50764b4abe86529797775a5f171951000000000000000000084121580614d96577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb5614db8565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb45b5f0b8412614f73575f805f805f85614dd157604b614dd4565b604c5b614dde908a615bc7565b90505f8087614e0b577d90e40fbeea1d3a4abc8955e946fe31cdcf66f634e1000000000000000000614e2c565b7e05a8e89d75252446eb5d5d5b1cc5edf20a1a059e10ca0000000000000000005b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff169050808c81614e5e57614e5e6158c1565b05818102955090850193507ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc18019050614e978c82615224565b7d90e40fbeea1d3a4abc8955e946fe31cdcf66f634e10000000000000000000295508594508a8414614f23576123278114614efe57614ed98c82600101615224565b7d90e40fbeea1d3a4abc8955e946fe31cdcf66f634e100000000000000000002614f20565b7f161bcca7119915b50764b4abe86529797775a5f17195100000000000000000005b94505b50614f53838b848c89897fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb46152ab565b909a509850614f648a8a835f613175565b9750975050505050505061097d565b614f7d8585615120565b9095509350614f8d868686614c7a565b9095509350614f9c85856144b6565b925092505061097d565b50935093915050565b5f805f841215614feb57614fc384846144b6565b9094509250614fd3858585614faf565b9094509250614fe28484615120565b9150915061097d565b5f80614ff7868661460d565b9092509050845f808061500a8585615348565b9194509250905061270d612710615022600182615c1e565b8514615039576150338d8686615437565b90925090505b83156150c4575f61504b866001615bc7565b90505b808485830281615060576150606158c1565b051461507757600a84059350600a8805975061504e565b6150b86150848588615c44565b8961508f8785615c44565b8f87877ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc6152ab565b909d509b506150eb9050565b819b507ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc9a505b5050505050866150fc84835f614b63565b615107886001615bc7565b6151119190615bc7565b94509450505050935093915050565b5f8061516e7f161bcca7119915b50764b4abe86529797775a5f17195100000000000000000007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb48686613514565b915091509250929050565b5f807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83850993909202808410938190039390930393915050565b5f81515f036151c457505f919050565b50602001515f1a90565b5f6151d8836151b4565b82106152145781836040517ffcfaeff1000000000000000000000000000000000000000000000000000000008152600401610280929190615c8f565b50600202016003015161ffff1690565b5f80615233600a612328615a41565b61523e906002615a54565b61524990600161595b565b90505f615259600a612328615a41565b90506002600a8504026001015f8052600281601e883c505f51617fff8116935061800081161561528857918101915b505f80526001600a8506600a6064870402018301601f873c50505f510192915050565b5f808888036152be57508390508161533c565b5f805f806152ce8c8b8f8d6140da565b915091505f806152e08a8a8d8c6140da565b915091506152f084848484613f8f565b8096508197505050505050505f8061530a8b8b8f8d6140da565b915091505f8061531c86868686613514565b915091505f8061532e84848f8e613175565b909a50985050505050505050505b97509795505050505050565b5f805f837ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0361538057508391505f90506001614308565b7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc84121561540e577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb08412156153df57505f9150508215156001614308565b5f846004015f03600a0a90505f8187816153fb576153fb6158c1565b0594505080840286141592509050614308565b5f841261542357505f91508190506001614308565b50505060048101600a0a82025f6001614308565b5f80806064615449600a612328615a41565b615456600a612328615a41565b615461906002615a54565b61546c90600161595b565b615476919061595b565b615480919061595b565b90506154c4565b5f8052600280600a8504028301601e833c5f80516107d0840193505f80526001600a8606600a6064880402018501601f853c5f5101949350505050565b6154cf858288615487565b92508315614fa6576154e5600186018288615487565b915050935093915050565b6142b1615ca7565b5f60208284031215615508575f80fd5b81357fffffffff000000000000000000000000000000000000000000000000000000008116811461087f575f80fd5b5f81518084528060208401602086015e5f6020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b602081525f61087f6020830184615537565b5f602082840312156155a5575f80fd5b813567ffffffffffffffff8111156155bb575f80fd5b820160e0818503121561087f575f80fd5b5f815180845260208085019450602084015f5b838110156155fb578151875295820195908201906001016155df565b509495945050505050565b604081525f61561860408301856155cc565b8281036020848101919091528451808352858201928201905f5b8181101561564e57845183529383019391830191600101615632565b5090979650505050505050565b73ffffffffffffffffffffffffffffffffffffffff8116811461567c575f80fd5b50565b5f6020828403121561568f575f80fd5b813561087f8161565b565b5f8083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18436030181126156cd575f80fd5b83018035915067ffffffffffffffff8211156156e7575f80fd5b6020019150600581901b3603821315612f73575f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715615772576157726156fe565b604052919050565b5f67ffffffffffffffff821115615793576157936156fe565b5060051b60200190565b5f6157af6157aa8461577a565b61572b565b83815260208082019190600586811b8601368111156157cc575f80fd5b865b8181101561585357803567ffffffffffffffff8111156157ec575f80fd5b880136601f8201126157fc575f80fd5b803561580a6157aa8261577a565b81815290851b82018601908681019036831115615825575f80fd5b928701925b828410156158435783358252928701929087019061582a565b89525050509483019483016157ce565b5092979650505050505050565b5f8083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112615893575f80fd5b83018035915067ffffffffffffffff8211156158ad575f80fd5b602001915036819003821315612f73575f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f826158fc576158fc6158c1565b500690565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b8082018082111561017f5761017f61592e565b828152604060208201525f61598660408301846155cc565b949350505050565b5f602080838503121561599f575f80fd5b825167ffffffffffffffff8111156159b5575f80fd5b8301601f810185136159c5575f80fd5b80516159d36157aa8261577a565b81815260059190911b820183019083810190878311156159f1575f80fd5b928401925b82841015612fe1578351825292840192908401906159f6565b5f60208284031215615a1f575f80fd5b5051919050565b5f60208284031215615a36575f80fd5b815161087f8161565b565b5f82615a4f57615a4f6158c1565b500490565b808202811582820484141761017f5761017f61592e565b600181815b80851115615ac457817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115615aaa57615aaa61592e565b80851615615ab757918102915b93841c9390800290615a70565b509250929050565b5f82615ada5750600161017f565b81615ae657505f61017f565b8160018114615afc5760028114615b0657615b22565b600191505061017f565b60ff841115615b1757615b1761592e565b50506001821b61017f565b5060208310610133831016604e8410600b8410161715615b45575081810a61017f565b615b4f8383615a6b565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115615b8157615b8161592e565b029392505050565b5f61087f8383615acc565b8181038181111561017f5761017f61592e565b5f60208284031215615bb7575f80fd5b815160ff8116811461087f575f80fd5b8082018281125f831280158216821582161715615be657615be661592e565b505092915050565b5f7f8000000000000000000000000000000000000000000000000000000000000000820361496d5761496d61592e565b8181035f831280158383131683831282161715615c3d57615c3d61592e565b5092915050565b8082025f82127f800000000000000000000000000000000000000000000000000000000000000084141615615c7b57615c7b61592e565b818105831482151761017f5761017f61592e565b828152604060208201525f6159866040830184615537565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52605160045260245ffdfe098509d40a160bd70c570c690c810cc30d180d2a0d3c0d4e0df30e300ffc1166125113f31542161216d6182513f3191319421942197119a01a281a3c1b291b8d1ba51c201c381c501c891cb31ccb1ce31cf01deb1e0d1e1a1ed21f211f641f881f951fa2203b208420912110215f21ae21fb224a2299235123a023cc23ee24a624e7250e255b25a825f72644269126de27cf098509d40a160bd70c570c690c810cc30d180d2a0d3c0d4e0df30e300ffc1166125113f31542161216d6182513f3191319421942197119a01a281a3c1b291b8d1ba51c201c381c501c891cb31ccb1ce31cf01deb1e0d1e1a1ed21f211f641f881f951fa2203b208420912110215f21ae21fb224a2299235123a023cc23ee24a624e7250e255b25a825f72644269126de27cf"; /// @dev The runtime bytecode of the contract. bytes constant RUNTIME_CODE = - hex"608060405234801561000f575f80fd5b506004361061003f575f3560e01c806301ffc9a714610043578063514b5d4f1461006b578063d04dfe2314610080575b5f80fd5b6100566100513660046154a0565b6100a1565b60405190151581526020015b60405180910390f35b610073610185565b604051610062919061552b565b61009361008e36600461553d565b610194565b6040516100629291906155ae565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082167fd04dfe2300000000000000000000000000000000000000000000000000000000148061013357507fffffffff0000000000000000000000000000000000000000000000000000000082167f514b5d4f00000000000000000000000000000000000000000000000000000000145b8061017f57507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b92915050565b606061018f610390565b905090565b6060805f61021b84830135602086018035906101b09088615627565b6101bd6080890189615642565b6101c691615745565b6101ce61063c565b6101db60408b018b615808565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525092979695949392505061065c9050565b9050600261022c60c0860186615642565b610237929150615896565b156102895761024960c0850185615642565b6040517f01c71f3d000000000000000000000000000000000000000000000000000000008152610280925060040190815260200190565b60405180910390fd5b5f5b61029860c0860186615642565b905081101561031b576060820151610304906102b760c0880188615642565b848181106102c7576102c76158a9565b90506020020135878060c001906102de9190615642565b6102e9866001615903565b8181106102f8576102f86158a9565b905060200201356107a7565b6060830152610314600282615903565b905061028b565b5061038661032c60a0860186615642565b808060200260200160405190810160405280939291908181526020018383602002808284375f92019190915250859392507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff91505061087d565b9250925050915091565b6040805161092081018252604880825261097c60208301526109cb92820192909252610a0d606082810191909152610bce6080830152610c4e60a0830152610c6060c0830152610c7860e0830152610cba610100830152610d0f610120830152610d21610140830152610d33610160830152610d45610180830152610dea6101a0830152610e276101c0830152610ff36101e083015261115d6102008301526112486102208301526113ea61024083018190526115396102608401526116096102808401526116cd6102a084015261181c6102c08401526102e083015261190a6103008301526119396103208301819052610340830152611968610360830152611997610380830152611a1f6103a0830152611a336103c0830152611b206103e0830152611b84610400830152611b9c610420830152611c17610440830152611c2f610460830152611c47610480830152611c806104a0830152611caa6104c0830152611cc26104e0830152611cda610500830152611ce7610520830152611de2610540830152611e04610560830152611e11610580830152611ec96105a0830152611f186105c0830152611f5b6105e0830152611f7f610600830152611f8c610620830152611f9961064083015261203261066083015261207b6106808301526120886106a08301526121076106c08301526121566106e08301526121a56107008301526121f26107208301526122416107408301526122906107608301526123486107808301526123746107a08301526123966107c083015261244e6107e083015261248f6108008301526124b661082083015261250361084083015261255061086083015261259f6108808301526125ec6108a08301526126396108c08301526126866108e08301526127776109008301529190819080610633816127a9565b94505050505090565b60606040518060c0016040528060908152602001615c7d60909139905090565b6106bd60405180610120016040528060608152602001606081526020015f81526020015f81526020015f81526020015f73ffffffffffffffffffffffffffffffffffffffff1681526020016060815260200160608152602001606081525090565b602087810180516040600191820184028b018181015182515f91821a808252948501870281019093526041808301968381019593600285020190910191908401905b8381101561073d57875160f01c83015160408051600192831a80825283016020908102909101918290529084526002909901989290920191016106ff565b505050506040518061012001604052808281526020018481526020018b81526020015f81526020018a81526020018973ffffffffffffffffffffffffffffffffffffffff168152602001888152602001838152602001878152509450505050509695505050505050565b5f82815260208120600f900660100284811c61ffff1690815b82156107da57825186146107da57604083015192506107c0565b821580156108285760405193506060840160405286845285602085015281604085015260028860f01c0161ffff60f01b1989168160f01b1798505061ffff831b19881684841b17975061082f565b8560208501525b50505061ffff811115610871576040517fcadaf56d00000000000000000000000000000000000000000000000000000000815260048101829052602401610280565b849150505b9392505050565b6060805f806108948760e00151886040015161282d565b915091505f80885f01518960400151815181106108b3576108b36158a9565b60200260200101519150819050838851146109075787516040517fd628439f000000000000000000000000000000000000000000000000000000008152610280918691600401918252602082015260400190565b87511561092c575f60208951028203915060208901905061092a81838b51612850565b505b61093c898a60400151838561285c565b90505f83881061094c578361094e565b875b90506060602083039050818152806109698c60600151612aed565b975097505050505050505b935093915050565b604083015183516020600192830181029091015161ffff8516909201029003517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0909101908152809392505050565b60208084015161ffff841660010190910201517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0909101908152809392505050565b602083015180515f9161ffff851691600f601087901c811692601488901c9091169185919085908110610a4257610a426158a9565b602002602001015190505f80610a5b839060a082901c90565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08a0180518882526040517f58c07152000000000000000000000000000000000000000000000000000000008152939550919350915f9073ffffffffffffffffffffffffffffffffffffffff8616906358c0715290610ae09087908790600401615916565b5f60405180830381865afa158015610afa573d5f803e3d5ffd5b505050506040513d5f823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201604052610b3f9190810190615936565b905080518714610b885780516040517fc3385cb0000000000000000000000000000000000000000000000000000000008152610280918991600401918252602082015260400190565b818352602088028b019a50602081016020880281015b80821015610bbb5760208d039c5081518d52602082019150610b9e565b509a9d9c50505050505050505050505050565b60c083015180515f9160ff85811692600887901c90911691849184908110610bf857610bf86158a9565b60200260200101518281518110610c1157610c116158a9565b60209081029190910101517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0909501948552509295945050505050565b60208101805182511681529392505050565b80515f90610c6d81612d60565b835250909392505050565b80516001600884901c60ff9081169190911b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0193161c919091168152919050565b805160209091018051600160ff600886901c81169190911b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01941684811b199091169390921690911b919091178152919050565b60208101805182511781529392505050565b805161ffff83161b8152809392505050565b805161ffff83161c8152809392505050565b8251600161ffff841690810160209081028301515f93600f601088901c811693601489901c90911692908190850288015b80891015610d935760208203915088518252602089019850610d76565b5060408a01805190879052610daa8b82848661285c565b60408c0182905260208602998a9003999092508201895b81841015610dd9578351815260209384019301610dc1565b50989b9a5050505050505050505050565b60109190911c600f166020028082207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09190920101908152919050565b805160208201516040909201805190925f929173ffffffffffffffffffffffffffffffffffffffff83168314610e8c576040517f0255ddd800000000000000000000000000000000000000000000000000000000815260048101849052602401610280565b8173ffffffffffffffffffffffffffffffffffffffff168214610ede576040517f0255ddd800000000000000000000000000000000000000000000000000000000815260048101839052602401610280565b8073ffffffffffffffffffffffffffffffffffffffff168114610f30576040517f0255ddd800000000000000000000000000000000000000000000000000000000815260048101829052602401610280565b6040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff838116600483015282811660248301525f919085169063dd62ed3e90604401602060405180830381865afa158015610fa5573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610fc991906159b7565b90505f610fd585612e38565b90505f610fe28383612ee1565b508852509598975050505050505050565b80516020909101805190915f9173ffffffffffffffffffffffffffffffffffffffff82168214611052576040517f0255ddd800000000000000000000000000000000000000000000000000000000815260048101839052602401610280565b8073ffffffffffffffffffffffffffffffffffffffff1681146110a4576040517f0255ddd800000000000000000000000000000000000000000000000000000000815260048101829052602401610280565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff82811660048301525f91908416906370a0823190602401602060405180830381865afa158015611111573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061113591906159b7565b90505f61114184612e38565b90505f61114e8383612f22565b87525094979650505050505050565b80515f9073ffffffffffffffffffffffffffffffffffffffff811681146111b3576040517f0255ddd800000000000000000000000000000000000000000000000000000000815260048101829052602401610280565b5f8173ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156111fd573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061122191906159b7565b90505f61122d83612e38565b90505f61123a8383612f22565b865250939695505050505050565b805160208201516040909201805190925f929173ffffffffffffffffffffffffffffffffffffffff831683146112ad576040517f0255ddd800000000000000000000000000000000000000000000000000000000815260048101849052602401610280565b8173ffffffffffffffffffffffffffffffffffffffff1682146112ff576040517f0255ddd800000000000000000000000000000000000000000000000000000000815260048101839052602401610280565b8073ffffffffffffffffffffffffffffffffffffffff168114611351576040517f0255ddd800000000000000000000000000000000000000000000000000000000815260048101829052602401610280565b6040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff838116600483015282811660248301525f919085169063dd62ed3e90604401602060405180830381865afa1580156113c6573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061123a91906159b7565b80516020909101805190915f9173ffffffffffffffffffffffffffffffffffffffff82168214611449576040517f0255ddd800000000000000000000000000000000000000000000000000000000815260048101839052602401610280565b8073ffffffffffffffffffffffffffffffffffffffff16811461149b576040517f0255ddd800000000000000000000000000000000000000000000000000000000815260048101829052602401610280565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff82811660048301525f91908416906370a0823190602401602060405180830381865afa158015611508573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061152c91906159b7565b8552509295945050505050565b80515f9073ffffffffffffffffffffffffffffffffffffffff8116811461158f576040517f0255ddd800000000000000000000000000000000000000000000000000000000815260048101829052602401610280565b5f8173ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156115d9573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115fd91906159b7565b84525091949350505050565b80515f9073ffffffffffffffffffffffffffffffffffffffff8116811461165f576040517f0255ddd800000000000000000000000000000000000000000000000000000000815260048101829052602401610280565b5f8173ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156116a9573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115fd91906159ce565b80516020909101805190915f9173ffffffffffffffffffffffffffffffffffffffff8216821461172c576040517f0255ddd800000000000000000000000000000000000000000000000000000000815260048101839052602401610280565b8073ffffffffffffffffffffffffffffffffffffffff16811461177e576040517f0255ddd800000000000000000000000000000000000000000000000000000000815260048101829052602401610280565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff82811660048301525f91908416906370a0823190602401602060405180830381865afa1580156117eb573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061180f91906159b7565b90505f61123a825f612f22565b80516020909101805190915f9173ffffffffffffffffffffffffffffffffffffffff8216821461187b576040517f0255ddd800000000000000000000000000000000000000000000000000000000815260048101839052602401610280565b6040517f6352211e000000000000000000000000000000000000000000000000000000008152600481018290525f9073ffffffffffffffffffffffffffffffffffffffff841690636352211e90602401602060405180830381865afa1580156118e6573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061152c91906159ce565b437fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09190910190815292915050565b427fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09190910190815292915050565b467fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09190910190815292915050565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe06020600f601085901c1602828101918201925f928391905b80821015611a1357815192507bffffffffffffffffffffffffffffffffffffffffffffffffffffffff831615611a0857828652611a13565b8160200191506119d0565b50939695505050505050565b805160209091018051909114815292915050565b5f805f80805f80600f8960101c169350600284069250879150602083850302820190506020831502810397508215611a6a57805194505b5f5b81831015611ab55750815195507bffffffffffffffffffffffffffffffffffffffffffffffffffffffff86161580611aaa5760208301518952611ab5565b826040019250611a6c565b8015611b1157604080518082019091525f6020820152600887901c601f88168083019190915281525b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610280919061552b565b50969998505050505050505050565b805160208201516040909201915f91907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8216611b7a57604080518082019091525f6020820152600882901c601f8316808301919091528152611ade565b5091949350505050565b80516020909101805190915f918261152c8383612f46565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe06020600f601085901c1602828101918201925f928391905b80821015611a1357815192507bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8316611c0c575f8652611a13565b816020019150611bd5565b80516020909101805190915f918261152c8383612f94565b80516020909101805190915f918261152c8383612fe3565b805160407bffffffffffffffffffffffffffffffffffffffffffffffffffffffff90911615156020028203810151910190815292915050565b80515f90817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8216156115fd565b80516020909101805190915f918261152c8383613033565b80516020909101805190915f918261152c8383613082565b80515f90610c6d816130d2565b805160208201516040909201915f91907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff808316601b90810b9160e085811d9291851690910b9084901d611d398484848461311d565b9094509250600f60108a901c1660025b81811015611d9f5789516020909a019996507bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8716601b0b935060e087901d9250611d928686868661311d565b9096509450600101611d49565b5050611dab8484613253565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe098909801978852509598975050505050505050565b80516020909101805190915f916115fd6002611dfe8484613359565b906133bb565b80515f90610c6d81613400565b805160208201516040909201915f91907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff808316601b90810b9160e085811d9291851690910b9084901d611e63848484846134bc565b9094509250600f60108a901c1660025b81811015611d9f5789516020909a019996507bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8716601b0b935060e087901d9250611ebc868686866134bc565b9096509450600101611e73565b7fffffffbe19cfc6ef4f44cf88f14500d013df534fcaad48fca1d5ca47bea26fcc7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09190910190815292915050565b80515f90610c6d7fffffffbe19cfc6ef4f44cf88f14500d013df534fcaad48fca1d5ca47bea26fcc8273c51a14251b0dcf0ae24a96b7153991378938f5f5613ad7565b80515f90610c6d60028273c51a14251b0dcf0ae24a96b7153991378938f5f5613ad7565b80515f90610c6d81613d31565b80515f90610c6d81613dd7565b80516020909101805190915f9182611fb18382613033565b90505f611fbe8382613033565b90505f61201c7fffffffff0000000000000000000000000000000000000000000000000000000573c51a14251b0dcf0ae24a96b7153991378938f5f5612015612006886130d2565b61200f8a6130d2565b90613e22565b9190613ad7565b90508115158315151461123a5761114e81613e67565b80515f906120498161204381613400565b90613e99565b90507bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8116612072575060015b82525092915050565b80515f90610c6d81613ede565b805160208201516040909201915f91906120a28282613f10565b9150600f601086901c1660025b818110156120d557855160209096019592506120cb8484613f10565b93506001016120af565b5050507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0929092019182525092915050565b7f80000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09190910190815292915050565b7f7fffffff7fffffffffffffffffffffffffffffffffffffffffffffffffffffff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09190910190815292915050565b805160208201516040909201915f91906121bf8282613f2c565b9150600f601086901c1660025b818110156120d557855160209096019592506121e88484613f2c565b93506001016121cc565b7f7fffffff800000000000000000000000000000000000000000000000000000007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09190910190815292915050565b7f80000000000000000000000000000000000000000000000000000000000000017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09190910190815292915050565b805160208201516040909201915f91907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff808316601b90810b9160e085811d9291851690910b9084901d6122e284848484613f37565b9094509250600f60108a901c1660025b81811015611d9f5789516020909a019996507bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8716601b0b935060e087901d925061233b86868686613f37565b90965094506001016122f2565b80516020909101805190915f916115fd828273c51a14251b0dcf0ae24a96b7153991378938f5f5613ad7565b80515f90610c6d8173c51a14251b0dcf0ae24a96b7153991378938f5f5614056565b805160208201516040909201915f91907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff808316601b90810b9160e085811d9291851690910b9084901d6123e884848484614082565b9094509250600f60108a901c1660025b81811015611d9f5789516020909a019996507bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8716601b0b935060e087901d925061244186868686614082565b90965094506001016123f8565b805160208201516040909201805190925f929161152c6124888273c51a14251b0dcf0ae24a96b7153991378938f5f5612015866001613359565b8490613e22565b805160208201516040909201805190925f929161152c6124af8383613e22565b8490613359565b805160208201516040909201915f91906124d08183615903565b9150600f601086901c1660025b818110156120d557855160209096019592506124f98385615903565b93506001016124dd565b805160208201516040909201915f919061251d81836159e9565b9150600f601086901c1660025b818110156120d5578551602090960195925061254683856159e9565b935060010161252a565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09190910190815292915050565b805160208201516040909201915f91906125b981836159fc565b9150600f601086901c1660025b818110156120d557855160209096019592506125e283856159fc565b93506001016125c6565b805160208201516040909201915f91906126068183615b31565b9150600f601086901c1660025b818110156120d5578551602090960195925061262f8385615b31565b9350600101612613565b805160208201516040909201915f91906126538183615b3c565b9150600f601086901c1660025b818110156120d5578551602090960195925061267c8385615b3c565b9350600101612660565b805160608401515f91908290819061269e90846140ac565b91509150815f036127685760a087015160808801516040517f295f36d70000000000000000000000000000000000000000000000000000000081526004810191909152602481018590525f9173ffffffffffffffffffffffffffffffffffffffff169063295f36d790604401602060405180830381865afa158015612725573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061274991906159b7565b606089015190915061275c9085836107a7565b6060890152855261276c565b8085525b509295945050505050565b8051602082015160608501516040909301925f9291906127989083836107a7565b606087015250829150509392505050565b60605f825160020267ffffffffffffffff8111156127c9576127c96156a6565b6040519080825280601f01601f1916602001820160405280156127f3576020820181803683370190505b50905061ffff80196020850160208651028101600285015b81831015611a135780518351861690851617815260209092019160020161280b565b5f805f61283a85856140f3565b51600281901a9660039190911a95509350505050565b6020810283835e505050565b5f80856040015190505f805f805f60028b61010001515161287d91906159e9565b60e08c01516101008d0151602080830151600261ffff9b909b168b8102850160219081015160f01c5f93841a9d909d029095019b909b019384015160258086019b50600791831a91821691829003600402909501909401985092965001935090915061549890805b86881015612a675787519050600284825f1a060285015160f01c925062ffffff8160e01c16915061291b8e838e8663ffffffff16565b9b506002848260041a060285015160f01c925062ffffff8160c01c1691506129488e838e8663ffffffff16565b9b506002848260081a060285015160f01c925062ffffff8160a01c1691506129758e838e8663ffffffff16565b9b5060028482600c1a060285015160f01c925062ffffff8160801c1691506129a28e838e8663ffffffff16565b9b506002848260101a060285015160f01c925062ffffff8160601c1691506129cf8e838e8663ffffffff16565b9b506002848260141a060285015160f01c925062ffffff8160401c1691506129fc8e838e8663ffffffff16565b9b506002848260181a060285015160f01c925062ffffff8160201c169150612a298e838e8663ffffffff16565b9b5060028482601c1a060285015160f01c925062ffffff81169150612a538e838e8663ffffffff16565b9b50612a60602089615903565b97506128e5565b612a72601c89615b3c565b9750612a7f8660046159fc565b612a899089615903565b96505b86881015612acf5750508551601c81901a83900660020284015160f01c915062ffffff811690612abb8e838e86565b9b50612ac8600489615903565b9750612a8c565b612adb8d8a8e8e614122565b50999c9b505050505050505050505050565b6040805160f083901c602081810283010190925290815261ffff63ffffffff67ffffffffffffffff6fffffffffffffffffffffffffffffffff612b59565b5f5b8215612b5357825182526020830151602083015260408301519250604082019150612b2d565b50919050565b602085018660101b60901c8015612c49578060401c8015612bc7578060201c8015612b8b57612b888185612b2b565b93505b508086168015612bc5578060101c8015612bac57612ba98186612b2b565b94505b508088168015612bc357612bc08186612b2b565b94505b505b505b508084168015612c47578060201c8015612c0b578060101c8015612bf257612bef8186612b2b565b94505b508088168015612c0957612c068186612b2b565b94505b505b508086168015612c45578060101c8015612c2c57612c298186612b2b565b94505b508088168015612c4357612c408186612b2b565b94505b505b505b505b508682168015612d55578060401c8015612cd3578060201c8015612c97578060101c8015612c7e57612c7b8186612b2b565b94505b508088168015612c9557612c928186612b2b565b94505b505b508086168015612cd1578060101c8015612cb857612cb58186612b2b565b94505b508088168015612ccf57612ccc8186612b2b565b94505b505b505b508084168015612d53578060201c8015612d17578060101c8015612cfe57612cfb8186612b2b565b94505b508088168015612d1557612d128186612b2b565b94505b505b508086168015612d51578060101c8015612d3857612d358186612b2b565b94505b508088168015612d4f57612d4c8186612b2b565b94505b505b505b505b505050505050919050565b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203612d915750610100919050565b507f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f7f5555555555555555555555555555555555555555555555555555555555555555600183901c16909103600281901c7f3333333333333333333333333333333333333333333333333333333333333333908116911601600481901c01167f01010101010101010101010101010101010101010101010101010101010101010260f81c90565b5f612e416141b5565b6040517ff5c36eaf00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8316600482015273200e12d10bb0c5e4a17e7018f0f1161919bb93899063f5c36eaf90602401602060405180830381865afa158015612ebd573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061017f9190615b4f565b5f805f805f612ef0878761425b565b9250925092505f80612f028585613253565b9150915081838015612f115750815b9650965050505050505b9250929050565b5f805f612f2f85856142b7565b91509150612f3d8282614319565b95945050505050565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838116601b90810b9160e086811d9291861690910b9085901d612f8984848484614373565b979650505050505050565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838116601b90810b9160e086811d9291861690910b9085901d612fd78484848461438a565b12979650505050505050565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838116601b90810b9160e086811d9291861690910b9085901d6130268484848461438a565b1315979650505050505050565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838116601b90810b9160e086811d9291861690910b9085901d6130768484848461438a565b13979650505050505050565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838116601b90810b9160e086811d9291861690910b9085901d6130c58484848461438a565b1215979650505050505050565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8216601b0b60e083901d828212156131125761310c828261445e565b90925090505b5f612f3d8383614501565b5f808515841517801561314957865f0361313d578484925092505061324a565b8686925092505061324a565b613153878761455f565b9097509550613162858561455f565b909550935085841315613176579395929492935b838603604c81111561318f57878793509350505061324a565b80600a0a86816131a1576131a1615869565b0595505086850180881860ff90811c151589881890911c1516801561323c57877f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03613223576040517fd556b111000000000000000000000000000000000000000000000000000000008152600481018a905260248101899052604401610280565b600a968790059690980586019760019790970196613240565b8198505b5050868692509250505b94509492505050565b5f601b83900b83148383826132b7577d90e40fbeea1d3a4abc8955e946fe31cdcf66f634e100000000000000000086051561329757620186a0860595506005850194505b8586601b0b146132b257600a86059550846001019450613297565b6132cd565b855f036132cd57505f925060019150612f1b9050565b848560030b14613329575f8512156132ed57505f9250829150612f1b9050565b6040517fd556b1110000000000000000000000000000000000000000000000000000000081526004810183905260248101829052604401610280565b50507bffffffffffffffffffffffffffffffffffffffffffffffffffffffff841660e084901b1791509250929050565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838116601b90810b9160e086811d9291861690910b9085901d848061339e8686868661311d565b915091505f6133ad8383614501565b9a9950505050505050505050565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838116601b90810b9160e086811d9291861690910b9085901d848061339e868686866134bc565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8216601b0b60e083901d82811261343757509192915050565b5f8061344384846145b5565b91509150805f03613458575093949350505050565b5f8113156134b1576134ac82847f161bcca7119915b50764b4abe86529797775a5f17195100000000000000000007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb461311d565b935091505b5f612f898385614501565b5f80835f03613501576040517f7a97930f0000000000000000000000000000000000000000000000000000000081526004810187905260248101869052604401610280565b855f0361351257505f90508061324a565b5f805f806135208a8a61461d565b919b5099509150613531888861461d565b919950975090505f6135428b6148be565b90505f61354e8a6148be565b90507f161bcca7119915b50764b4abe86529797775a5f1719510000000000000000000604c8183101561396b5784156135ac57507f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee80000000000000000009050604b61392a565b6f4b3b4ca85a86c47a098a2240000000008310156136d857678ac7230489e8000083101561363c576402540be40083101561360a57620186a08310156135fa5750620186a0905060056138b3565b506402540be4009050600a6138b3565b655af3107a40008310156136295750655af3107a40009050600e6138b3565b50678ac7230489e80000905060136138b3565b6b204fce5e3e2502611000000083101561368e5769152d02c7e14af6800000831015613677575069152d02c7e14af6800000905060176138b3565b506b204fce5e3e250261100000009050601c6138b3565b6d314dc6448d9338c15b0a000000008310156136bd57506d314dc6448d9338c15b0a00000000905060216138b3565b506f4b3b4ca85a86c47a098a224000000000905060266138b3565b780197d4df19d605767337e9f14d3eec8920e4000000000000008310156137d05773af298d050e4395d69670b12b7f4100000000000083101561376b577172cb5bd86321e38cb6ce6682e8000000000083101561374c57507172cb5bd86321e38cb6ce6682e800000000009050602b6138b3565b5073af298d050e4395d69670b12b7f41000000000000905060306138b3565b76010b46c6cdd6e3e0828f4db456ff0c8ea00000000000008310156137ac575076010b46c6cdd6e3e0828f4db456ff0c8ea0000000000000905060356138b3565b50780197d4df19d605767337e9f14d3eec8920e4000000000000009050603a6138b3565b7c03b58e88c75313ec9d329eaaa18fb92f75215b17100000000000000000831015613866577a026e4d30eccc3215dd8f3157d27e23acbdcfe6800000000000000083101561383e57507a026e4d30eccc3215dd8f3157d27e23acbdcfe680000000000000009050603f6138b3565b507c03b58e88c75313ec9d329eaaa18fb92f75215b17100000000000000000905060446138b3565b7e05a8e89d75252446eb5d5d5b1cc5edf20a1a059e10ca0000000000000000008310156138b357507e05a8e89d75252446eb5d5d5b1cc5edf20a1a059e10ca000000000000000000905060495b8183116138e757600a820491507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff016138b3565b815f0361392a576040517f05e51ecb000000000000000000000000000000000000000000000000000000008152600481018d9052602481018c9052604401610280565b8561396b576040517f05e51ecb000000000000000000000000000000000000000000000000000000008152600481018f9052602481018e9052604401610280565b807f8000000000000000000000000000000000000000000000000000000000000000018d1261399e57808d039c50613a11565b7f80000000000000000000000000000000000000000000000000000000000000009c90038c015f811315613a1157807f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038b136139fe57998a0199613a11565b5f8099509950505050505050505061324a565b5f808e128015613a2057505f8c135b15613a5d577f80000000000000000000000000000000000000000000000000000000000000008e01808d13613a55575f613a59565b808d035b9150505b8b818f01039750613a7a8f8e613a7488878961491f565b8b614a04565b90995097505f811315613ac457604c811315613aa4575f809a509a5050505050505050505061324a565b80600a0a8981613ab657613ab6615869565b059850885f03613ac4575f97505b5096985094965061324a95505050505050565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff848116601b0b9060e086901d908516613b145750600191506108769050565b5f8213613bad57815f03613b7157613b2c855f613033565b15613b66576040517f8be8297200000000000000000000000000000000000000000000000000000000815260048101869052602401610280565b505f91506108769050565b6040517fcceba0f10000000000000000000000000000000000000000000000000000000081526004810183905260248101829052604401610280565b613bb8856001612f46565b8015613bc95750613bc9865f612f94565b15613bd8578592505050610876565b613be2855f613033565b15613c0b57613c02613bf387613ede565b613bfc87613e67565b86613ad7565b92505050610876565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8516601b0b60e086901d5f80613c3e84846145b5565b915091505f613c4e83855f614b0b565b905060015f8080613c858f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8116601b0b9160e09190911d90565b915091505b60018510613ccc5784600116600103613caf57613ca984848484613f37565b90945092505b600185901c9450613cc282828484613f37565b9092509050613c8a565b5f80613cd98f8e8e614c22565b91509150613ce982828a8d613f37565b9092509050613cf98f8383614f57565b9092509050613d0a82828888613f37565b90925090505f613d1a8383614501565b9e5050505050505050505050505050509392505050565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8216601b0b60e083901d828112613d6857509192915050565b5f80613d7484846145b5565b915091505f84128015613d8657508015155b156134b1576134ac82847f161bcca7119915b50764b4abe86529797775a5f17195100000000000000000007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb4614082565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8216601b0b60e083901d82613e0a83836145b5565b9150505f613e188284614501565b9695505050505050565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838116601b90810b9160e086811d9291861690910b9085901d848061339e86868686613f37565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8216601b0b60e083901d61310c828261445e565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838116601b90810b9160e086811d9291861690910b9085901d848061339e86868686614082565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8216601b0b60e083901d61310c82826150c8565b5f613f1b8383612f94565b613f255781610876565b5090919050565b5f613f1b8383613033565b5f8085158415178015613f4f575f92505f915061404c565b613f598487615b6f565b91505f613f65886148be565b90505f613f71876148be565b90505f613f7e8383615121565b5090505f6f0785ee10d5da46d900f436a000000000821115613fb3576f0785ee10d5da46d900f436a000000000820491506025015b670de0b6b3a7640000821115613fd457670de0b6b3a7640000820491506012015b633b9aca00821115613fed57633b9aca00820491506009015b61271082111561400257612710820491506004015b811561401657600a82049150600101614002565b6140208187615b6f565b95506140428b8a61403c878761403787600a615b31565b61491f565b89614a04565b9097509550505050505b5094509492505050565b5f610876837fffffffff0000000000000000000000000000000000000000000000000000000584613ad7565b5f8061408e848461445e565b909450925061409f8686868661311d565b9150915094509492505050565b5f80825f526010600f60205f20060261ffff85821c165b80156140ea57805185036140e15760019350602081015192506140ea565b604001516140c3565b50509250929050565b5f806140fe8461515c565b60020260010190505f6141118585615176565b949091019093016020019392505050565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08201805163ffff0000601087901b1661ffff86161782527f312f5ae588c6ff62cd3f006af06cd48c98d7321649db7d8b2c396a81a204655591905f808686036004017ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8801865afa5090525050505050565b73200e12d10bb0c5e4a17e7018f0f1161919bb93893b158061420c575073200e12d10bb0c5e4a17e7018f0f1161919bb93893f7f1de7d717526cba131d684e312dedbf0852adef9cced9e36798ae4937f7145d4114155b15614259576040517f73e6d7b300000000000000000000000000000000000000000000000000000000815273200e12d10bb0c5e4a17e7018f0f1161919bb93896004820152602401610280565b565b5f808060ff841681037f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8611156142a657600a860460018201600a88065f14935093509350506142b0565b8593509150600190505b9250925092565b5f805f805f6142c6878761425b565b9250925092508061430d576040517fc47179660000000000000000000000000000000000000000000000000000000081526004810184905260248101839052604401610280565b50909590945092505050565b5f805f6143268585613253565b915091508061436b576040517f22c9f7bb0000000000000000000000000000000000000000000000000000000081526004810186905260248101859052604401610280565b509392505050565b5f6143808585858561438a565b1495945050505050565b5f80851584151781871282861218178584141780156143af578685925092505061324a565b505f858413156143c3575092949193919260015b8386035f8112604c82131780156143f65782156143e8575f899450945050505061324a565b885f9450945050505061324a565b600a82900a8981028a82828161440e5761440e615869565b051461443a57841561442a575f8b96509650505050505061324a565b8a5f96509650505050505061324a565b841561444f57889650945061324a9350505050565b955087945061324a9350505050565b5f807f800000000000000000000000000000000000000000000000000000000000000084036144f7577f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83036144ea576040517fd556b1110000000000000000000000000000000000000000000000000000000081526004810185905260248101849052604401610280565b600a840593508260010192505b50505f9190910391565b5f805f61450e8585613253565b915091508015801561451e575081155b1561436b576040517f8eba4d070000000000000000000000000000000000000000000000000000000081526004810186905260248101859052604401610280565b5f805f805f61456e878761461d565b9250925092508061430d576040517f05e51ecb0000000000000000000000000000000000000000000000000000000081526004810188905260248101879052604401610280565b5f805f83126145c857508290505f612f1b565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb48312156145fa57505f905082612f1b565b5f839003600a0a80858161461057614610615869565b0794859003959350505050565b5f805f845f0361463557505f915081905060016142b0565b7f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee800000000000000000085055f03614849576f4b3b4ca85a86c47a098a224000000000850515801561469e57507f80000000000000000000000000000000000000000000000000000000000000268412155b156146bf576f4b3b4ca85a86c47a098a224000000000850294506026840393505b7728c87cb5c89a2571ebfdcb54864ada834a00000000000000850515801561470757507f80000000000000000000000000000000000000000000000000000000000000138412155b1561472057678ac7230489e80000850294506013840393505b7b097edd871cfda3a5697758bf0e3cbb5ac5741c640000000000000000850515801561476c57507f800000000000000000000000000000000000000000000000000000000000000a8412155b15614782576402540be40085029450600a840393505b7e3899162693736ac531a5a58f1fbb4b746504382ca7e400000000000000000085051580156147d157507f80000000000000000000000000000000000000000000000000000000000000028412155b156147e757606485029450600284039350614782565b7f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee8000000000000000000850515801561483757507f80000000000000000000000000000000000000000000000000000000000000018412155b1561484957600a850294506001840393505b600a8086029081058614801561487f57507f80000000000000000000000000000000000000000000000000000000000000018512155b1561488e578095506001850394505b50939492935050507f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee80000000000000000008305151590565b5f8082121561491b577f8000000000000000000000000000000000000000000000000000000000000000820361491557507f8000000000000000000000000000000000000000000000000000000000000000919050565b505f0390565b5090565b5f805f61492c8686615121565b91509150815f036149505783818161494657614946615869565b0492505050610876565b83821061499a576040517f6c59da12000000000000000000000000000000000000000000000000000000008152600481018790526024810186905260448101859052606401610280565b5f84868809600186198101871696879004966002600389028118808a02820302808a02820302808a02820302808a02820302808a02820302808a02909103025f82900382900490920185841190960395909502919093039390930492909217029150509392505050565b5f805f8587181215614ace577f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff841115614abb57614a637f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6001615903565b8403614a9357507f800000000000000000000000000000000000000000000000000000000000000090508161324a565b614a9e600a856159e9565b614aa790615b96565b614ab2846001615b6f565b9150915061324a565b614ac484615b96565b839150915061324a565b7f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff841115614b0157614aa7600a856159e9565b508290508161324a565b5f818303614b1a575082610876565b82821315614b5d57828203604c811380614b3457505f8113155b15614b42575f915050610876565b80600a0a8581614b5457614b54615869565b05915050610876565b818303604c811380614b6f57505f8113155b15614bb7576040517f1d5d6d10000000000000000000000000000000000000000000000000000000008152600481018690526024810185905260448101849052606401610280565b600a81900a85810286828281614bcf57614bcf615869565b0514614c18576040517f1d5d6d10000000000000000000000000000000000000000000000000000000008152600481018890526024810187905260448101869052606401610280565b9250610876915050565b5f808383614c30828261455f565b90965094505f8613614cb157855f03614c75576040517f561fc7b500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517f5d3fd4db0000000000000000000000000000000000000000000000000000000081526004810183905260248101829052604401610280565b5050837f161bcca7119915b50764b4abe86529797775a5f171951000000000000000000003614cef57614ce583604c615b6f565b5f91509150610974565b7f161bcca7119915b50764b4abe86529797775a5f171951000000000000000000084121580614d3e577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb5614d60565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb45b5f0b8412614f1b575f805f805f85614d7957604b614d7c565b604c5b614d86908a615b6f565b90505f8087614db3577d90e40fbeea1d3a4abc8955e946fe31cdcf66f634e1000000000000000000614dd4565b7e05a8e89d75252446eb5d5d5b1cc5edf20a1a059e10ca0000000000000000005b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff169050808c81614e0657614e06615869565b05818102955090850193507ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc18019050614e3f8c826151cc565b7d90e40fbeea1d3a4abc8955e946fe31cdcf66f634e10000000000000000000295508594508a8414614ecb576123278114614ea657614e818c826001016151cc565b7d90e40fbeea1d3a4abc8955e946fe31cdcf66f634e100000000000000000002614ec8565b7f161bcca7119915b50764b4abe86529797775a5f17195100000000000000000005b94505b50614efb838b848c89897fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb4615253565b909a509850614f0c8a8a835f61311d565b97509750505050505050610974565b614f2585856150c8565b9095509350614f35868686614c22565b9095509350614f44858561445e565b9250925050610974565b50935093915050565b5f805f841215614f9357614f6b848461445e565b9094509250614f7b858585614f57565b9094509250614f8a84846150c8565b91509150610974565b5f80614f9f86866145b5565b9092509050845f8080614fb285856152f0565b9194509250905061270d612710614fca600182615bc6565b8514614fe157614fdb8d86866153df565b90925090505b831561506c575f614ff3866001615b6f565b90505b80848583028161500857615008615869565b051461501f57600a84059350600a88059750614ff6565b61506061502c8588615bec565b896150378785615bec565b8f87877ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc615253565b909d509b506150939050565b819b507ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc9a505b5050505050866150a484835f614b0b565b6150af886001615b6f565b6150b99190615b6f565b94509450505050935093915050565b5f806151167f161bcca7119915b50764b4abe86529797775a5f17195100000000000000000007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb486866134bc565b915091509250929050565b5f807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83850993909202808410938190039390930393915050565b5f81515f0361516c57505f919050565b50602001515f1a90565b5f6151808361515c565b82106151bc5781836040517ffcfaeff1000000000000000000000000000000000000000000000000000000008152600401610280929190615c37565b50600202016003015161ffff1690565b5f806151db600a6123286159e9565b6151e69060026159fc565b6151f1906001615903565b90505f615201600a6123286159e9565b90506002600a8504026001015f8052600281601e883c505f51617fff8116935061800081161561523057918101915b505f80526001600a8506600a6064870402018301601f873c50505f510192915050565b5f808888036152665750839050816152e4565b5f805f806152768c8b8f8d614082565b915091505f806152888a8a8d8c614082565b9150915061529884848484613f37565b8096508197505050505050505f806152b28b8b8f8d614082565b915091505f806152c4868686866134bc565b915091505f806152d684848f8e61311d565b909a50985050505050505050505b97509795505050505050565b5f805f837ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0361532857508391505f905060016142b0565b7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8412156153b6577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb084121561538757505f91505082151560016142b0565b5f846004015f03600a0a90505f8187816153a3576153a3615869565b05945050808402861415925090506142b0565b5f84126153cb57505f915081905060016142b0565b50505060048101600a0a82025f60016142b0565b5f808060646153f1600a6123286159e9565b6153fe600a6123286159e9565b6154099060026159fc565b615414906001615903565b61541e9190615903565b6154289190615903565b905061546c565b5f8052600280600a8504028301601e833c5f80516107d0840193505f80526001600a8606600a6064880402018501601f853c5f5101949350505050565b61547785828861542f565b92508315614f4e5761548d60018601828861542f565b915050935093915050565b614259615c4f565b5f602082840312156154b0575f80fd5b81357fffffffff0000000000000000000000000000000000000000000000000000000081168114610876575f80fd5b5f81518084528060208401602086015e5f6020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b602081525f61087660208301846154df565b5f6020828403121561554d575f80fd5b813567ffffffffffffffff811115615563575f80fd5b820160e08185031215610876575f80fd5b5f815180845260208085019450602084015f5b838110156155a357815187529582019590820190600101615587565b509495945050505050565b604081525f6155c06040830185615574565b8281036020848101919091528451808352858201928201905f5b818110156155f6578451835293830193918301916001016155da565b5090979650505050505050565b73ffffffffffffffffffffffffffffffffffffffff81168114615624575f80fd5b50565b5f60208284031215615637575f80fd5b813561087681615603565b5f8083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112615675575f80fd5b83018035915067ffffffffffffffff82111561568f575f80fd5b6020019150600581901b3603821315612f1b575f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff8111828210171561571a5761571a6156a6565b604052919050565b5f67ffffffffffffffff82111561573b5761573b6156a6565b5060051b60200190565b5f61575761575284615722565b6156d3565b83815260208082019190600586811b860136811115615774575f80fd5b865b818110156157fb57803567ffffffffffffffff811115615794575f80fd5b880136601f8201126157a4575f80fd5b80356157b261575282615722565b81815290851b820186019086810190368311156157cd575f80fd5b928701925b828410156157eb578335825292870192908701906157d2565b8952505050948301948301615776565b5092979650505050505050565b5f8083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261583b575f80fd5b83018035915067ffffffffffffffff821115615855575f80fd5b602001915036819003821315612f1b575f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f826158a4576158a4615869565b500690565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b8082018082111561017f5761017f6158d6565b828152604060208201525f61592e6040830184615574565b949350505050565b5f6020808385031215615947575f80fd5b825167ffffffffffffffff81111561595d575f80fd5b8301601f8101851361596d575f80fd5b805161597b61575282615722565b81815260059190911b82018301908381019087831115615999575f80fd5b928401925b82841015612f895783518252928401929084019061599e565b5f602082840312156159c7575f80fd5b5051919050565b5f602082840312156159de575f80fd5b815161087681615603565b5f826159f7576159f7615869565b500490565b808202811582820484141761017f5761017f6158d6565b600181815b80851115615a6c57817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115615a5257615a526158d6565b80851615615a5f57918102915b93841c9390800290615a18565b509250929050565b5f82615a825750600161017f565b81615a8e57505f61017f565b8160018114615aa45760028114615aae57615aca565b600191505061017f565b60ff841115615abf57615abf6158d6565b50506001821b61017f565b5060208310610133831016604e8410600b8410161715615aed575081810a61017f565b615af78383615a13565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115615b2957615b296158d6565b029392505050565b5f6108768383615a74565b8181038181111561017f5761017f6158d6565b5f60208284031215615b5f575f80fd5b815160ff81168114610876575f80fd5b8082018281125f831280158216821582161715615b8e57615b8e6158d6565b505092915050565b5f7f80000000000000000000000000000000000000000000000000000000000000008203614915576149156158d6565b8181035f831280158383131683831282161715615be557615be56158d6565b5092915050565b8082025f82127f800000000000000000000000000000000000000000000000000000000000000084141615615c2357615c236158d6565b818105831482151761017f5761017f6158d6565b828152604060208201525f61592e60408301846154df565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52605160045260245ffdfe097c09cb0a0d0bce0c4e0c600c780cba0d0f0d210d330d450dea0e270ff3115d124813ea1539160916cd181c13ea190a19391939196819971a1f1a331b201b841b9c1c171c2f1c471c801caa1cc21cda1ce71de21e041e111ec91f181f5b1f7f1f8c1f992032207b20882107215621a521f222412290234823742396244e248f24b625032550259f25ec263926862777"; + hex"608060405234801561000f575f80fd5b506004361061003f575f3560e01c806301ffc9a714610043578063514b5d4f1461006b578063d04dfe2314610080575b5f80fd5b6100566100513660046154f8565b6100a1565b60405190151581526020015b60405180910390f35b610073610185565b6040516100629190615583565b61009361008e366004615595565b610194565b604051610062929190615606565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082167fd04dfe2300000000000000000000000000000000000000000000000000000000148061013357507fffffffff0000000000000000000000000000000000000000000000000000000082167f514b5d4f00000000000000000000000000000000000000000000000000000000145b8061017f57507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b92915050565b606061018f610390565b905090565b6060805f61021b84830135602086018035906101b0908861567f565b6101bd608089018961569a565b6101c69161579d565b6101ce610645565b6101db60408b018b615860565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152509297969594939250506106659050565b9050600261022c60c086018661569a565b6102379291506158ee565b156102895761024960c085018561569a565b6040517f01c71f3d000000000000000000000000000000000000000000000000000000008152610280925060040190815260200190565b60405180910390fd5b5f5b61029860c086018661569a565b905081101561031b576060820151610304906102b760c088018861569a565b848181106102c7576102c7615901565b90506020020135878060c001906102de919061569a565b6102e986600161595b565b8181106102f8576102f8615901565b905060200201356107b0565b606083015261031460028261595b565b905061028b565b5061038661032c60a086018661569a565b808060200260200160405190810160405280939291908181526020018383602002808284375f92019190915250859392507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff915050610886565b9250925050915091565b6040805161094081018252604980825261098560208301526109d492820192909252610a16606082810191909152610bd76080830152610c5760a0830152610c6960c0830152610c8160e0830152610cc3610100830152610d18610120830152610d2a610140830152610d3c610160830152610d4e610180830152610df36101a0830152610e306101c0830152610ffc6101e08301526111666102008301526112516102208301526113f361024083018190526115426102608401526116126102808401526116d66102a08401526118256102c08401526102e083015261191361030083015261194261032083018190526103408301526119716103608301526119a0610380830152611a286103a0830152611a3c6103c0830152611b296103e0830152611b8d610400830152611ba5610420830152611c20610440830152611c38610460830152611c50610480830152611c896104a0830152611cb36104c0830152611ccb6104e0830152611ce3610500830152611cf0610520830152611deb610540830152611e0d610560830152611e1a610580830152611ed26105a0830152611f216105c0830152611f646105e0830152611f88610600830152611f95610620830152611fa261064083015261203b6106608301526120846106808301526120916106a08301526121106106c083015261215f6106e08301526121ae6107008301526121fb61072083015261224a6107408301526122996107608301526123516107808301526123a06107a08301526123cc6107c08301526123ee6107e08301526124a66108008301526124e761082083015261250e61084083015261255b6108608301526125a86108808301526125f76108a08301526126446108c08301526126916108e08301526126de6109008301526127cf610920830152919081908061063c81612801565b94505050505090565b60606040518060c0016040528060928152602001615cd560929139905090565b6106c660405180610120016040528060608152602001606081526020015f81526020015f81526020015f81526020015f73ffffffffffffffffffffffffffffffffffffffff1681526020016060815260200160608152602001606081525090565b602087810180516040600191820184028b018181015182515f91821a808252948501870281019093526041808301968381019593600285020190910191908401905b8381101561074657875160f01c83015160408051600192831a8082528301602090810290910191829052908452600290990198929092019101610708565b505050506040518061012001604052808281526020018481526020018b81526020015f81526020018a81526020018973ffffffffffffffffffffffffffffffffffffffff168152602001888152602001838152602001878152509450505050509695505050505050565b5f82815260208120600f900660100284811c61ffff1690815b82156107e357825186146107e357604083015192506107c9565b821580156108315760405193506060840160405286845285602085015281604085015260028860f01c0161ffff60f01b1989168160f01b1798505061ffff831b19881684841b179750610838565b8560208501525b50505061ffff81111561087a576040517fcadaf56d00000000000000000000000000000000000000000000000000000000815260048101829052602401610280565b849150505b9392505050565b6060805f8061089d8760e001518860400151612885565b915091505f80885f01518960400151815181106108bc576108bc615901565b60200260200101519150819050838851146109105787516040517fd628439f000000000000000000000000000000000000000000000000000000008152610280918691600401918252602082015260400190565b875115610935575f60208951028203915060208901905061093381838b516128a8565b505b610945898a6040015183856128b4565b90505f8388106109555783610957565b875b90506060602083039050818152806109728c60600151612b45565b975097505050505050505b935093915050565b604083015183516020600192830181029091015161ffff8516909201029003517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0909101908152809392505050565b60208084015161ffff841660010190910201517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0909101908152809392505050565b602083015180515f9161ffff851691600f601087901c811692601488901c9091169185919085908110610a4b57610a4b615901565b602002602001015190505f80610a64839060a082901c90565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08a0180518882526040517f58c07152000000000000000000000000000000000000000000000000000000008152939550919350915f9073ffffffffffffffffffffffffffffffffffffffff8616906358c0715290610ae9908790879060040161596e565b5f60405180830381865afa158015610b03573d5f803e3d5ffd5b505050506040513d5f823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201604052610b48919081019061598e565b905080518714610b915780516040517fc3385cb0000000000000000000000000000000000000000000000000000000008152610280918991600401918252602082015260400190565b818352602088028b019a50602081016020880281015b80821015610bc45760208d039c5081518d52602082019150610ba7565b509a9d9c50505050505050505050505050565b60c083015180515f9160ff85811692600887901c90911691849184908110610c0157610c01615901565b60200260200101518281518110610c1a57610c1a615901565b60209081029190910101517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0909501948552509295945050505050565b60208101805182511681529392505050565b80515f90610c7681612db8565b835250909392505050565b80516001600884901c60ff9081169190911b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0193161c919091168152919050565b805160209091018051600160ff600886901c81169190911b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01941684811b199091169390921690911b919091178152919050565b60208101805182511781529392505050565b805161ffff83161b8152809392505050565b805161ffff83161c8152809392505050565b8251600161ffff841690810160209081028301515f93600f601088901c811693601489901c90911692908190850288015b80891015610d9c5760208203915088518252602089019850610d7f565b5060408a01805190879052610db38b8284866128b4565b60408c0182905260208602998a9003999092508201895b81841015610de2578351815260209384019301610dca565b50989b9a5050505050505050505050565b60109190911c600f166020028082207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09190920101908152919050565b805160208201516040909201805190925f929173ffffffffffffffffffffffffffffffffffffffff83168314610e95576040517f0255ddd800000000000000000000000000000000000000000000000000000000815260048101849052602401610280565b8173ffffffffffffffffffffffffffffffffffffffff168214610ee7576040517f0255ddd800000000000000000000000000000000000000000000000000000000815260048101839052602401610280565b8073ffffffffffffffffffffffffffffffffffffffff168114610f39576040517f0255ddd800000000000000000000000000000000000000000000000000000000815260048101829052602401610280565b6040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff838116600483015282811660248301525f919085169063dd62ed3e90604401602060405180830381865afa158015610fae573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610fd29190615a0f565b90505f610fde85612e90565b90505f610feb8383612f39565b508852509598975050505050505050565b80516020909101805190915f9173ffffffffffffffffffffffffffffffffffffffff8216821461105b576040517f0255ddd800000000000000000000000000000000000000000000000000000000815260048101839052602401610280565b8073ffffffffffffffffffffffffffffffffffffffff1681146110ad576040517f0255ddd800000000000000000000000000000000000000000000000000000000815260048101829052602401610280565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff82811660048301525f91908416906370a0823190602401602060405180830381865afa15801561111a573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061113e9190615a0f565b90505f61114a84612e90565b90505f6111578383612f7a565b87525094979650505050505050565b80515f9073ffffffffffffffffffffffffffffffffffffffff811681146111bc576040517f0255ddd800000000000000000000000000000000000000000000000000000000815260048101829052602401610280565b5f8173ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611206573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061122a9190615a0f565b90505f61123683612e90565b90505f6112438383612f7a565b865250939695505050505050565b805160208201516040909201805190925f929173ffffffffffffffffffffffffffffffffffffffff831683146112b6576040517f0255ddd800000000000000000000000000000000000000000000000000000000815260048101849052602401610280565b8173ffffffffffffffffffffffffffffffffffffffff168214611308576040517f0255ddd800000000000000000000000000000000000000000000000000000000815260048101839052602401610280565b8073ffffffffffffffffffffffffffffffffffffffff16811461135a576040517f0255ddd800000000000000000000000000000000000000000000000000000000815260048101829052602401610280565b6040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff838116600483015282811660248301525f919085169063dd62ed3e90604401602060405180830381865afa1580156113cf573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906112439190615a0f565b80516020909101805190915f9173ffffffffffffffffffffffffffffffffffffffff82168214611452576040517f0255ddd800000000000000000000000000000000000000000000000000000000815260048101839052602401610280565b8073ffffffffffffffffffffffffffffffffffffffff1681146114a4576040517f0255ddd800000000000000000000000000000000000000000000000000000000815260048101829052602401610280565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff82811660048301525f91908416906370a0823190602401602060405180830381865afa158015611511573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115359190615a0f565b8552509295945050505050565b80515f9073ffffffffffffffffffffffffffffffffffffffff81168114611598576040517f0255ddd800000000000000000000000000000000000000000000000000000000815260048101829052602401610280565b5f8173ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156115e2573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906116069190615a0f565b84525091949350505050565b80515f9073ffffffffffffffffffffffffffffffffffffffff81168114611668576040517f0255ddd800000000000000000000000000000000000000000000000000000000815260048101829052602401610280565b5f8173ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156116b2573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906116069190615a26565b80516020909101805190915f9173ffffffffffffffffffffffffffffffffffffffff82168214611735576040517f0255ddd800000000000000000000000000000000000000000000000000000000815260048101839052602401610280565b8073ffffffffffffffffffffffffffffffffffffffff168114611787576040517f0255ddd800000000000000000000000000000000000000000000000000000000815260048101829052602401610280565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff82811660048301525f91908416906370a0823190602401602060405180830381865afa1580156117f4573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906118189190615a0f565b90505f611243825f612f7a565b80516020909101805190915f9173ffffffffffffffffffffffffffffffffffffffff82168214611884576040517f0255ddd800000000000000000000000000000000000000000000000000000000815260048101839052602401610280565b6040517f6352211e000000000000000000000000000000000000000000000000000000008152600481018290525f9073ffffffffffffffffffffffffffffffffffffffff841690636352211e90602401602060405180830381865afa1580156118ef573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115359190615a26565b437fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09190910190815292915050565b427fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09190910190815292915050565b467fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09190910190815292915050565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe06020600f601085901c1602828101918201925f928391905b80821015611a1c57815192507bffffffffffffffffffffffffffffffffffffffffffffffffffffffff831615611a1157828652611a1c565b8160200191506119d9565b50939695505050505050565b805160209091018051909114815292915050565b5f805f80805f80600f8960101c169350600284069250879150602083850302820190506020831502810397508215611a7357805194505b5f5b81831015611abe5750815195507bffffffffffffffffffffffffffffffffffffffffffffffffffffffff86161580611ab35760208301518952611abe565b826040019250611a75565b8015611b1a57604080518082019091525f6020820152600887901c601f88168083019190915281525b6040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102809190615583565b50969998505050505050505050565b805160208201516040909201915f91907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8216611b8357604080518082019091525f6020820152600882901c601f8316808301919091528152611ae7565b5091949350505050565b80516020909101805190915f91826115358383612f9e565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe06020600f601085901c1602828101918201925f928391905b80821015611a1c57815192507bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8316611c15575f8652611a1c565b816020019150611bde565b80516020909101805190915f91826115358383612fec565b80516020909101805190915f9182611535838361303b565b805160407bffffffffffffffffffffffffffffffffffffffffffffffffffffffff90911615156020028203810151910190815292915050565b80515f90817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff821615611606565b80516020909101805190915f9182611535838361308b565b80516020909101805190915f918261153583836130da565b80515f90610c768161312a565b805160208201516040909201915f91907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff808316601b90810b9160e085811d9291851690910b9084901d611d4284848484613175565b9094509250600f60108a901c1660025b81811015611da85789516020909a019996507bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8716601b0b935060e087901d9250611d9b86868686613175565b9096509450600101611d52565b5050611db484846132ab565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe098909801978852509598975050505050505050565b80516020909101805190915f916116066002611e0784846133b1565b90613413565b80515f90610c7681613458565b805160208201516040909201915f91907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff808316601b90810b9160e085811d9291851690910b9084901d611e6c84848484613514565b9094509250600f60108a901c1660025b81811015611da85789516020909a019996507bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8716601b0b935060e087901d9250611ec586868686613514565b9096509450600101611e7c565b7fffffffbe19cfc6ef4f44cf88f14500d013df534fcaad48fca1d5ca47bea26fcc7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09190910190815292915050565b80515f90610c767fffffffbe19cfc6ef4f44cf88f14500d013df534fcaad48fca1d5ca47bea26fcc8273c51a14251b0dcf0ae24a96b7153991378938f5f5613b2f565b80515f90610c7660028273c51a14251b0dcf0ae24a96b7153991378938f5f5613b2f565b80515f90610c7681613d89565b80515f90610c7681613e2f565b80516020909101805190915f9182611fba838261308b565b90505f611fc7838261308b565b90505f6120257fffffffff0000000000000000000000000000000000000000000000000000000573c51a14251b0dcf0ae24a96b7153991378938f5f561201e61200f8861312a565b6120188a61312a565b90613e7a565b9190613b2f565b9050811515831515146112435761115781613ebf565b80515f906120528161204c81613458565b90613ef1565b90507bffffffffffffffffffffffffffffffffffffffffffffffffffffffff811661207b575060015b82525092915050565b80515f90610c7681613f36565b805160208201516040909201915f91906120ab8282613f68565b9150600f601086901c1660025b818110156120de57855160209096019592506120d48484613f68565b93506001016120b8565b5050507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0929092019182525092915050565b7f80000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09190910190815292915050565b7f7fffffff7fffffffffffffffffffffffffffffffffffffffffffffffffffffff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09190910190815292915050565b805160208201516040909201915f91906121c88282613f84565b9150600f601086901c1660025b818110156120de57855160209096019592506121f18484613f84565b93506001016121d5565b7f7fffffff800000000000000000000000000000000000000000000000000000007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09190910190815292915050565b7f80000000000000000000000000000000000000000000000000000000000000017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09190910190815292915050565b805160208201516040909201915f91907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff808316601b90810b9160e085811d9291851690910b9084901d6122eb84848484613f8f565b9094509250600f60108a901c1660025b81811015611da85789516020909a019996507bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8716601b0b935060e087901d925061234486868686613f8f565b90965094506001016122fb565b7fffffffbe1dd4c9e873614f593bba9c6007d9a7ac8d03a4b6c700a65cb537a1b47fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09190910190815292915050565b80516020909101805190915f91611606828273c51a14251b0dcf0ae24a96b7153991378938f5f5613b2f565b80515f90610c768173c51a14251b0dcf0ae24a96b7153991378938f5f56140ae565b805160208201516040909201915f91907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff808316601b90810b9160e085811d9291851690910b9084901d612440848484846140da565b9094509250600f60108a901c1660025b81811015611da85789516020909a019996507bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8716601b0b935060e087901d9250612499868686866140da565b9096509450600101612450565b805160208201516040909201805190925f92916115356124e08273c51a14251b0dcf0ae24a96b7153991378938f5f561201e8660016133b1565b8490613e7a565b805160208201516040909201805190925f92916115356125078383613e7a565b84906133b1565b805160208201516040909201915f9190612528818361595b565b9150600f601086901c1660025b818110156120de5785516020909601959250612551838561595b565b9350600101612535565b805160208201516040909201915f91906125758183615a41565b9150600f601086901c1660025b818110156120de578551602090960195925061259e8385615a41565b9350600101612582565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09190910190815292915050565b805160208201516040909201915f91906126118183615a54565b9150600f601086901c1660025b818110156120de578551602090960195925061263a8385615a54565b935060010161261e565b805160208201516040909201915f919061265e8183615b89565b9150600f601086901c1660025b818110156120de57855160209096019592506126878385615b89565b935060010161266b565b805160208201516040909201915f91906126ab8183615b94565b9150600f601086901c1660025b818110156120de57855160209096019592506126d48385615b94565b93506001016126b8565b805160608401515f9190829081906126f69084614104565b91509150815f036127c05760a087015160808801516040517f295f36d70000000000000000000000000000000000000000000000000000000081526004810191909152602481018590525f9173ffffffffffffffffffffffffffffffffffffffff169063295f36d790604401602060405180830381865afa15801561277d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906127a19190615a0f565b60608901519091506127b49085836107b0565b606089015285526127c4565b8085525b509295945050505050565b8051602082015160608501516040909301925f9291906127f09083836107b0565b606087015250829150509392505050565b60605f825160020267ffffffffffffffff811115612821576128216156fe565b6040519080825280601f01601f19166020018201604052801561284b576020820181803683370190505b50905061ffff80196020850160208651028101600285015b81831015611a1c57805183518616908516178152602090920191600201612863565b5f805f612892858561414b565b51600281901a9660039190911a95509350505050565b6020810283835e505050565b5f80856040015190505f805f805f60028b6101000151516128d59190615a41565b60e08c01516101008d0151602080830151600261ffff9b909b168b8102850160219081015160f01c5f93841a9d909d029095019b909b019384015160258086019b50600791831a9182169182900360040290950190940198509296500193509091506154f090805b86881015612abf5787519050600284825f1a060285015160f01c925062ffffff8160e01c1691506129738e838e8663ffffffff16565b9b506002848260041a060285015160f01c925062ffffff8160c01c1691506129a08e838e8663ffffffff16565b9b506002848260081a060285015160f01c925062ffffff8160a01c1691506129cd8e838e8663ffffffff16565b9b5060028482600c1a060285015160f01c925062ffffff8160801c1691506129fa8e838e8663ffffffff16565b9b506002848260101a060285015160f01c925062ffffff8160601c169150612a278e838e8663ffffffff16565b9b506002848260141a060285015160f01c925062ffffff8160401c169150612a548e838e8663ffffffff16565b9b506002848260181a060285015160f01c925062ffffff8160201c169150612a818e838e8663ffffffff16565b9b5060028482601c1a060285015160f01c925062ffffff81169150612aab8e838e8663ffffffff16565b9b50612ab860208961595b565b975061293d565b612aca601c89615b94565b9750612ad7866004615a54565b612ae1908961595b565b96505b86881015612b275750508551601c81901a83900660020284015160f01c915062ffffff811690612b138e838e86565b9b50612b2060048961595b565b9750612ae4565b612b338d8a8e8e61417a565b50999c9b505050505050505050505050565b6040805160f083901c602081810283010190925290815261ffff63ffffffff67ffffffffffffffff6fffffffffffffffffffffffffffffffff612bb1565b5f5b8215612bab57825182526020830151602083015260408301519250604082019150612b85565b50919050565b602085018660101b60901c8015612ca1578060401c8015612c1f578060201c8015612be357612be08185612b83565b93505b508086168015612c1d578060101c8015612c0457612c018186612b83565b94505b508088168015612c1b57612c188186612b83565b94505b505b505b508084168015612c9f578060201c8015612c63578060101c8015612c4a57612c478186612b83565b94505b508088168015612c6157612c5e8186612b83565b94505b505b508086168015612c9d578060101c8015612c8457612c818186612b83565b94505b508088168015612c9b57612c988186612b83565b94505b505b505b505b508682168015612dad578060401c8015612d2b578060201c8015612cef578060101c8015612cd657612cd38186612b83565b94505b508088168015612ced57612cea8186612b83565b94505b505b508086168015612d29578060101c8015612d1057612d0d8186612b83565b94505b508088168015612d2757612d248186612b83565b94505b505b505b508084168015612dab578060201c8015612d6f578060101c8015612d5657612d538186612b83565b94505b508088168015612d6d57612d6a8186612b83565b94505b505b508086168015612da9578060101c8015612d9057612d8d8186612b83565b94505b508088168015612da757612da48186612b83565b94505b505b505b505b505050505050919050565b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203612de95750610100919050565b507f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f7f5555555555555555555555555555555555555555555555555555555555555555600183901c16909103600281901c7f3333333333333333333333333333333333333333333333333333333333333333908116911601600481901c01167f01010101010101010101010101010101010101010101010101010101010101010260f81c90565b5f612e9961420d565b6040517ff5c36eaf00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8316600482015273200e12d10bb0c5e4a17e7018f0f1161919bb93899063f5c36eaf90602401602060405180830381865afa158015612f15573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061017f9190615ba7565b5f805f805f612f4887876142b3565b9250925092505f80612f5a85856132ab565b9150915081838015612f695750815b9650965050505050505b9250929050565b5f805f612f87858561430f565b91509150612f958282614371565b95945050505050565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838116601b90810b9160e086811d9291861690910b9085901d612fe1848484846143cb565b979650505050505050565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838116601b90810b9160e086811d9291861690910b9085901d61302f848484846143e2565b12979650505050505050565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838116601b90810b9160e086811d9291861690910b9085901d61307e848484846143e2565b1315979650505050505050565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838116601b90810b9160e086811d9291861690910b9085901d6130ce848484846143e2565b13979650505050505050565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838116601b90810b9160e086811d9291861690910b9085901d61311d848484846143e2565b1215979650505050505050565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8216601b0b60e083901d8282121561316a5761316482826144b6565b90925090505b5f612f958383614559565b5f80851584151780156131a157865f0361319557848492509250506132a2565b868692509250506132a2565b6131ab87876145b7565b90975095506131ba85856145b7565b9095509350858413156131ce579395929492935b838603604c8111156131e75787879350935050506132a2565b80600a0a86816131f9576131f96158c1565b0595505086850180881860ff90811c151589881890911c1516801561329457877f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0361327b576040517fd556b111000000000000000000000000000000000000000000000000000000008152600481018a905260248101899052604401610280565b600a968790059690980586019760019790970196613298565b8198505b5050868692509250505b94509492505050565b5f601b83900b831483838261330f577d90e40fbeea1d3a4abc8955e946fe31cdcf66f634e10000000000000000008605156132ef57620186a0860595506005850194505b8586601b0b1461330a57600a860595508460010194506132ef565b613325565b855f0361332557505f925060019150612f739050565b848560030b14613381575f85121561334557505f9250829150612f739050565b6040517fd556b1110000000000000000000000000000000000000000000000000000000081526004810183905260248101829052604401610280565b50507bffffffffffffffffffffffffffffffffffffffffffffffffffffffff841660e084901b1791509250929050565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838116601b90810b9160e086811d9291861690910b9085901d84806133f686868686613175565b915091505f6134058383614559565b9a9950505050505050505050565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838116601b90810b9160e086811d9291861690910b9085901d84806133f686868686613514565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8216601b0b60e083901d82811261348f57509192915050565b5f8061349b848461460d565b91509150805f036134b0575093949350505050565b5f8113156135095761350482847f161bcca7119915b50764b4abe86529797775a5f17195100000000000000000007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb4613175565b935091505b5f612fe18385614559565b5f80835f03613559576040517f7a97930f0000000000000000000000000000000000000000000000000000000081526004810187905260248101869052604401610280565b855f0361356a57505f9050806132a2565b5f805f806135788a8a614675565b919b50995091506135898888614675565b919950975090505f61359a8b614916565b90505f6135a68a614916565b90507f161bcca7119915b50764b4abe86529797775a5f1719510000000000000000000604c818310156139c357841561360457507f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee80000000000000000009050604b613982565b6f4b3b4ca85a86c47a098a22400000000083101561373057678ac7230489e80000831015613694576402540be40083101561366257620186a08310156136525750620186a09050600561390b565b506402540be4009050600a61390b565b655af3107a40008310156136815750655af3107a40009050600e61390b565b50678ac7230489e800009050601361390b565b6b204fce5e3e250261100000008310156136e65769152d02c7e14af68000008310156136cf575069152d02c7e14af68000009050601761390b565b506b204fce5e3e250261100000009050601c61390b565b6d314dc6448d9338c15b0a0000000083101561371557506d314dc6448d9338c15b0a000000009050602161390b565b506f4b3b4ca85a86c47a098a2240000000009050602661390b565b780197d4df19d605767337e9f14d3eec8920e4000000000000008310156138285773af298d050e4395d69670b12b7f410000000000008310156137c3577172cb5bd86321e38cb6ce6682e800000000008310156137a457507172cb5bd86321e38cb6ce6682e800000000009050602b61390b565b5073af298d050e4395d69670b12b7f410000000000009050603061390b565b76010b46c6cdd6e3e0828f4db456ff0c8ea0000000000000831015613804575076010b46c6cdd6e3e0828f4db456ff0c8ea00000000000009050603561390b565b50780197d4df19d605767337e9f14d3eec8920e4000000000000009050603a61390b565b7c03b58e88c75313ec9d329eaaa18fb92f75215b171000000000000000008310156138be577a026e4d30eccc3215dd8f3157d27e23acbdcfe6800000000000000083101561389657507a026e4d30eccc3215dd8f3157d27e23acbdcfe680000000000000009050603f61390b565b507c03b58e88c75313ec9d329eaaa18fb92f75215b171000000000000000009050604461390b565b7e05a8e89d75252446eb5d5d5b1cc5edf20a1a059e10ca00000000000000000083101561390b57507e05a8e89d75252446eb5d5d5b1cc5edf20a1a059e10ca000000000000000000905060495b81831161393f57600a820491507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0161390b565b815f03613982576040517f05e51ecb000000000000000000000000000000000000000000000000000000008152600481018d9052602481018c9052604401610280565b856139c3576040517f05e51ecb000000000000000000000000000000000000000000000000000000008152600481018f9052602481018e9052604401610280565b807f8000000000000000000000000000000000000000000000000000000000000000018d126139f657808d039c50613a69565b7f80000000000000000000000000000000000000000000000000000000000000009c90038c015f811315613a6957807f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038b13613a5657998a0199613a69565b5f809950995050505050505050506132a2565b5f808e128015613a7857505f8c135b15613ab5577f80000000000000000000000000000000000000000000000000000000000000008e01808d13613aad575f613ab1565b808d035b9150505b8b818f01039750613ad28f8e613acc888789614977565b8b614a5c565b90995097505f811315613b1c57604c811315613afc575f809a509a505050505050505050506132a2565b80600a0a8981613b0e57613b0e6158c1565b059850885f03613b1c575f97505b509698509496506132a295505050505050565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff848116601b0b9060e086901d908516613b6c57506001915061087f9050565b5f8213613c0557815f03613bc957613b84855f61308b565b15613bbe576040517f8be8297200000000000000000000000000000000000000000000000000000000815260048101869052602401610280565b505f915061087f9050565b6040517fcceba0f10000000000000000000000000000000000000000000000000000000081526004810183905260248101829052604401610280565b613c10856001612f9e565b8015613c215750613c21865f612fec565b15613c3057859250505061087f565b613c3a855f61308b565b15613c6357613c5a613c4b87613f36565b613c5487613ebf565b86613b2f565b9250505061087f565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8516601b0b60e086901d5f80613c96848461460d565b915091505f613ca683855f614b63565b905060015f8080613cdd8f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8116601b0b9160e09190911d90565b915091505b60018510613d245784600116600103613d0757613d0184848484613f8f565b90945092505b600185901c9450613d1a82828484613f8f565b9092509050613ce2565b5f80613d318f8e8e614c7a565b91509150613d4182828a8d613f8f565b9092509050613d518f8383614faf565b9092509050613d6282828888613f8f565b90925090505f613d728383614559565b9e5050505050505050505050505050509392505050565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8216601b0b60e083901d828112613dc057509192915050565b5f80613dcc848461460d565b915091505f84128015613dde57508015155b156135095761350482847f161bcca7119915b50764b4abe86529797775a5f17195100000000000000000007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb46140da565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8216601b0b60e083901d82613e62838361460d565b9150505f613e708284614559565b9695505050505050565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838116601b90810b9160e086811d9291861690910b9085901d84806133f686868686613f8f565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8216601b0b60e083901d61316482826144b6565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838116601b90810b9160e086811d9291861690910b9085901d84806133f6868686866140da565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8216601b0b60e083901d6131648282615120565b5f613f738383612fec565b613f7d578161087f565b5090919050565b5f613f73838361308b565b5f8085158415178015613fa7575f92505f91506140a4565b613fb18487615bc7565b91505f613fbd88614916565b90505f613fc987614916565b90505f613fd68383615179565b5090505f6f0785ee10d5da46d900f436a00000000082111561400b576f0785ee10d5da46d900f436a000000000820491506025015b670de0b6b3a764000082111561402c57670de0b6b3a7640000820491506012015b633b9aca0082111561404557633b9aca00820491506009015b61271082111561405a57612710820491506004015b811561406e57600a8204915060010161405a565b6140788187615bc7565b955061409a8b8a614094878761408f87600a615b89565b614977565b89614a5c565b9097509550505050505b5094509492505050565b5f61087f837fffffffff0000000000000000000000000000000000000000000000000000000584613b2f565b5f806140e684846144b6565b90945092506140f786868686613175565b9150915094509492505050565b5f80825f526010600f60205f20060261ffff85821c165b80156141425780518503614139576001935060208101519250614142565b6040015161411b565b50509250929050565b5f80614156846151b4565b60020260010190505f61416985856151ce565b949091019093016020019392505050565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08201805163ffff0000601087901b1661ffff86161782527f312f5ae588c6ff62cd3f006af06cd48c98d7321649db7d8b2c396a81a204655591905f808686036004017ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8801865afa5090525050505050565b73200e12d10bb0c5e4a17e7018f0f1161919bb93893b1580614264575073200e12d10bb0c5e4a17e7018f0f1161919bb93893f7f1de7d717526cba131d684e312dedbf0852adef9cced9e36798ae4937f7145d4114155b156142b1576040517f73e6d7b300000000000000000000000000000000000000000000000000000000815273200e12d10bb0c5e4a17e7018f0f1161919bb93896004820152602401610280565b565b5f808060ff841681037f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8611156142fe57600a860460018201600a88065f1493509350935050614308565b8593509150600190505b9250925092565b5f805f805f61431e87876142b3565b92509250925080614365576040517fc47179660000000000000000000000000000000000000000000000000000000081526004810184905260248101839052604401610280565b50909590945092505050565b5f805f61437e85856132ab565b91509150806143c3576040517f22c9f7bb0000000000000000000000000000000000000000000000000000000081526004810186905260248101859052604401610280565b509392505050565b5f6143d8858585856143e2565b1495945050505050565b5f808515841517818712828612181785841417801561440757868592509250506132a2565b505f8584131561441b575092949193919260015b8386035f8112604c821317801561444e578215614440575f89945094505050506132a2565b885f945094505050506132a2565b600a82900a8981028a828281614466576144666158c1565b0514614492578415614482575f8b9650965050505050506132a2565b8a5f9650965050505050506132a2565b84156144a75788965094506132a29350505050565b95508794506132a29350505050565b5f807f8000000000000000000000000000000000000000000000000000000000000000840361454f577f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8303614542576040517fd556b1110000000000000000000000000000000000000000000000000000000081526004810185905260248101849052604401610280565b600a840593508260010192505b50505f9190910391565b5f805f61456685856132ab565b9150915080158015614576575081155b156143c3576040517f8eba4d070000000000000000000000000000000000000000000000000000000081526004810186905260248101859052604401610280565b5f805f805f6145c68787614675565b92509250925080614365576040517f05e51ecb0000000000000000000000000000000000000000000000000000000081526004810188905260248101879052604401610280565b5f805f831261462057508290505f612f73565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb483121561465257505f905082612f73565b5f839003600a0a808581614668576146686158c1565b0794859003959350505050565b5f805f845f0361468d57505f91508190506001614308565b7f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee800000000000000000085055f036148a1576f4b3b4ca85a86c47a098a22400000000085051580156146f657507f80000000000000000000000000000000000000000000000000000000000000268412155b15614717576f4b3b4ca85a86c47a098a224000000000850294506026840393505b7728c87cb5c89a2571ebfdcb54864ada834a00000000000000850515801561475f57507f80000000000000000000000000000000000000000000000000000000000000138412155b1561477857678ac7230489e80000850294506013840393505b7b097edd871cfda3a5697758bf0e3cbb5ac5741c64000000000000000085051580156147c457507f800000000000000000000000000000000000000000000000000000000000000a8412155b156147da576402540be40085029450600a840393505b7e3899162693736ac531a5a58f1fbb4b746504382ca7e4000000000000000000850515801561482957507f80000000000000000000000000000000000000000000000000000000000000028412155b1561483f576064850294506002840393506147da565b7f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee8000000000000000000850515801561488f57507f80000000000000000000000000000000000000000000000000000000000000018412155b156148a157600a850294506001840393505b600a808602908105861480156148d757507f80000000000000000000000000000000000000000000000000000000000000018512155b156148e6578095506001850394505b50939492935050507f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee80000000000000000008305151590565b5f80821215614973577f8000000000000000000000000000000000000000000000000000000000000000820361496d57507f8000000000000000000000000000000000000000000000000000000000000000919050565b505f0390565b5090565b5f805f6149848686615179565b91509150815f036149a85783818161499e5761499e6158c1565b049250505061087f565b8382106149f2576040517f6c59da12000000000000000000000000000000000000000000000000000000008152600481018790526024810186905260448101859052606401610280565b5f84868809600186198101871696879004966002600389028118808a02820302808a02820302808a02820302808a02820302808a02820302808a02909103025f82900382900490920185841190960395909502919093039390930492909217029150509392505050565b5f805f8587181215614b26577f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff841115614b1357614abb7f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600161595b565b8403614aeb57507f80000000000000000000000000000000000000000000000000000000000000009050816132a2565b614af6600a85615a41565b614aff90615bee565b614b0a846001615bc7565b915091506132a2565b614b1c84615bee565b83915091506132a2565b7f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff841115614b5957614aff600a85615a41565b50829050816132a2565b5f818303614b7257508261087f565b82821315614bb557828203604c811380614b8c57505f8113155b15614b9a575f91505061087f565b80600a0a8581614bac57614bac6158c1565b0591505061087f565b818303604c811380614bc757505f8113155b15614c0f576040517f1d5d6d10000000000000000000000000000000000000000000000000000000008152600481018690526024810185905260448101849052606401610280565b600a81900a85810286828281614c2757614c276158c1565b0514614c70576040517f1d5d6d10000000000000000000000000000000000000000000000000000000008152600481018890526024810187905260448101869052606401610280565b925061087f915050565b5f808383614c8882826145b7565b90965094505f8613614d0957855f03614ccd576040517f561fc7b500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517f5d3fd4db0000000000000000000000000000000000000000000000000000000081526004810183905260248101829052604401610280565b5050837f161bcca7119915b50764b4abe86529797775a5f171951000000000000000000003614d4757614d3d83604c615bc7565b5f9150915061097d565b7f161bcca7119915b50764b4abe86529797775a5f171951000000000000000000084121580614d96577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb5614db8565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb45b5f0b8412614f73575f805f805f85614dd157604b614dd4565b604c5b614dde908a615bc7565b90505f8087614e0b577d90e40fbeea1d3a4abc8955e946fe31cdcf66f634e1000000000000000000614e2c565b7e05a8e89d75252446eb5d5d5b1cc5edf20a1a059e10ca0000000000000000005b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff169050808c81614e5e57614e5e6158c1565b05818102955090850193507ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc18019050614e978c82615224565b7d90e40fbeea1d3a4abc8955e946fe31cdcf66f634e10000000000000000000295508594508a8414614f23576123278114614efe57614ed98c82600101615224565b7d90e40fbeea1d3a4abc8955e946fe31cdcf66f634e100000000000000000002614f20565b7f161bcca7119915b50764b4abe86529797775a5f17195100000000000000000005b94505b50614f53838b848c89897fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb46152ab565b909a509850614f648a8a835f613175565b9750975050505050505061097d565b614f7d8585615120565b9095509350614f8d868686614c7a565b9095509350614f9c85856144b6565b925092505061097d565b50935093915050565b5f805f841215614feb57614fc384846144b6565b9094509250614fd3858585614faf565b9094509250614fe28484615120565b9150915061097d565b5f80614ff7868661460d565b9092509050845f808061500a8585615348565b9194509250905061270d612710615022600182615c1e565b8514615039576150338d8686615437565b90925090505b83156150c4575f61504b866001615bc7565b90505b808485830281615060576150606158c1565b051461507757600a84059350600a8805975061504e565b6150b86150848588615c44565b8961508f8785615c44565b8f87877ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc6152ab565b909d509b506150eb9050565b819b507ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc9a505b5050505050866150fc84835f614b63565b615107886001615bc7565b6151119190615bc7565b94509450505050935093915050565b5f8061516e7f161bcca7119915b50764b4abe86529797775a5f17195100000000000000000007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb48686613514565b915091509250929050565b5f807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83850993909202808410938190039390930393915050565b5f81515f036151c457505f919050565b50602001515f1a90565b5f6151d8836151b4565b82106152145781836040517ffcfaeff1000000000000000000000000000000000000000000000000000000008152600401610280929190615c8f565b50600202016003015161ffff1690565b5f80615233600a612328615a41565b61523e906002615a54565b61524990600161595b565b90505f615259600a612328615a41565b90506002600a8504026001015f8052600281601e883c505f51617fff8116935061800081161561528857918101915b505f80526001600a8506600a6064870402018301601f873c50505f510192915050565b5f808888036152be57508390508161533c565b5f805f806152ce8c8b8f8d6140da565b915091505f806152e08a8a8d8c6140da565b915091506152f084848484613f8f565b8096508197505050505050505f8061530a8b8b8f8d6140da565b915091505f8061531c86868686613514565b915091505f8061532e84848f8e613175565b909a50985050505050505050505b97509795505050505050565b5f805f837ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0361538057508391505f90506001614308565b7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc84121561540e577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb08412156153df57505f9150508215156001614308565b5f846004015f03600a0a90505f8187816153fb576153fb6158c1565b0594505080840286141592509050614308565b5f841261542357505f91508190506001614308565b50505060048101600a0a82025f6001614308565b5f80806064615449600a612328615a41565b615456600a612328615a41565b615461906002615a54565b61546c90600161595b565b615476919061595b565b615480919061595b565b90506154c4565b5f8052600280600a8504028301601e833c5f80516107d0840193505f80526001600a8606600a6064880402018501601f853c5f5101949350505050565b6154cf858288615487565b92508315614fa6576154e5600186018288615487565b915050935093915050565b6142b1615ca7565b5f60208284031215615508575f80fd5b81357fffffffff000000000000000000000000000000000000000000000000000000008116811461087f575f80fd5b5f81518084528060208401602086015e5f6020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b602081525f61087f6020830184615537565b5f602082840312156155a5575f80fd5b813567ffffffffffffffff8111156155bb575f80fd5b820160e0818503121561087f575f80fd5b5f815180845260208085019450602084015f5b838110156155fb578151875295820195908201906001016155df565b509495945050505050565b604081525f61561860408301856155cc565b8281036020848101919091528451808352858201928201905f5b8181101561564e57845183529383019391830191600101615632565b5090979650505050505050565b73ffffffffffffffffffffffffffffffffffffffff8116811461567c575f80fd5b50565b5f6020828403121561568f575f80fd5b813561087f8161565b565b5f8083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18436030181126156cd575f80fd5b83018035915067ffffffffffffffff8211156156e7575f80fd5b6020019150600581901b3603821315612f73575f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715615772576157726156fe565b604052919050565b5f67ffffffffffffffff821115615793576157936156fe565b5060051b60200190565b5f6157af6157aa8461577a565b61572b565b83815260208082019190600586811b8601368111156157cc575f80fd5b865b8181101561585357803567ffffffffffffffff8111156157ec575f80fd5b880136601f8201126157fc575f80fd5b803561580a6157aa8261577a565b81815290851b82018601908681019036831115615825575f80fd5b928701925b828410156158435783358252928701929087019061582a565b89525050509483019483016157ce565b5092979650505050505050565b5f8083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112615893575f80fd5b83018035915067ffffffffffffffff8211156158ad575f80fd5b602001915036819003821315612f73575f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f826158fc576158fc6158c1565b500690565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b8082018082111561017f5761017f61592e565b828152604060208201525f61598660408301846155cc565b949350505050565b5f602080838503121561599f575f80fd5b825167ffffffffffffffff8111156159b5575f80fd5b8301601f810185136159c5575f80fd5b80516159d36157aa8261577a565b81815260059190911b820183019083810190878311156159f1575f80fd5b928401925b82841015612fe1578351825292840192908401906159f6565b5f60208284031215615a1f575f80fd5b5051919050565b5f60208284031215615a36575f80fd5b815161087f8161565b565b5f82615a4f57615a4f6158c1565b500490565b808202811582820484141761017f5761017f61592e565b600181815b80851115615ac457817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115615aaa57615aaa61592e565b80851615615ab757918102915b93841c9390800290615a70565b509250929050565b5f82615ada5750600161017f565b81615ae657505f61017f565b8160018114615afc5760028114615b0657615b22565b600191505061017f565b60ff841115615b1757615b1761592e565b50506001821b61017f565b5060208310610133831016604e8410600b8410161715615b45575081810a61017f565b615b4f8383615a6b565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115615b8157615b8161592e565b029392505050565b5f61087f8383615acc565b8181038181111561017f5761017f61592e565b5f60208284031215615bb7575f80fd5b815160ff8116811461087f575f80fd5b8082018281125f831280158216821582161715615be657615be661592e565b505092915050565b5f7f8000000000000000000000000000000000000000000000000000000000000000820361496d5761496d61592e565b8181035f831280158383131683831282161715615c3d57615c3d61592e565b5092915050565b8082025f82127f800000000000000000000000000000000000000000000000000000000000000084141615615c7b57615c7b61592e565b818105831482151761017f5761017f61592e565b828152604060208201525f6159866040830184615537565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52605160045260245ffdfe098509d40a160bd70c570c690c810cc30d180d2a0d3c0d4e0df30e300ffc1166125113f31542161216d6182513f3191319421942197119a01a281a3c1b291b8d1ba51c201c381c501c891cb31ccb1ce31cf01deb1e0d1e1a1ed21f211f641f881f951fa2203b208420912110215f21ae21fb224a2299235123a023cc23ee24a624e7250e255b25a825f72644269126de27cf"; /// @dev The function pointers known to the interpreter for dynamic dispatch. /// By setting these as a constant they can be inlined into the interpreter /// and loaded at eval time for very low gas (~100) due to the compiler /// optimising it to a single `codecopy` to build the in memory bytes array. bytes constant OPCODE_FUNCTION_POINTERS = - hex"097c09cb0a0d0bce0c4e0c600c780cba0d0f0d210d330d450dea0e270ff3115d124813ea1539160916cd181c13ea190a19391939196819971a1f1a331b201b841b9c1c171c2f1c471c801caa1cc21cda1ce71de21e041e111ec91f181f5b1f7f1f8c1f992032207b20882107215621a521f222412290234823742396244e248f24b625032550259f25ec263926862777"; + hex"098509d40a160bd70c570c690c810cc30d180d2a0d3c0d4e0df30e300ffc1166125113f31542161216d6182513f3191319421942197119a01a281a3c1b291b8d1ba51c201c381c501c891cb31ccb1ce31cf01deb1e0d1e1a1ed21f211f641f881f951fa2203b208420912110215f21ae21fb224a2299235123a023cc23ee24a624e7250e255b25a825f72644269126de27cf"; diff --git a/src/generated/RainlangParser.pointers.sol b/src/generated/RainlangParser.pointers.sol index f0c2778e3..9a9a22fe9 100644 --- a/src/generated/RainlangParser.pointers.sol +++ b/src/generated/RainlangParser.pointers.sol @@ -10,19 +10,19 @@ pragma solidity ^0.8.25; // file needs the contract to exist so that it can be compiled. /// @dev Hash of the known bytecode. -bytes32 constant BYTECODE_HASH = bytes32(0x729a2facceada6a158fbb00945d6371cadf1ce78e9b3f56724e30fb8e397d7d6); +bytes32 constant BYTECODE_HASH = bytes32(0x844ca2709f34283f566cee50abb1b948bf0e46fc62e1ff46df5659570186eaea); /// @dev The deterministic deploy address of the contract when deployed via /// the Zoltu factory. -address constant DEPLOYED_ADDRESS = address(0x9179445a637E6Ae72Bb38273944FAB96834488dd); +address constant DEPLOYED_ADDRESS = address(0x088Bdb2B554E3CdedA4137bEeF92ffEe1e9F4DBf); /// @dev The creation bytecode of the contract. bytes constant CREATION_CODE = - hex"6080604052348015600e575f80fd5b5061549d8061001c5f395ff3fe608060405234801561000f575f80fd5b5060043610610064575f3560e01c80637764fd9c1161004d5780637764fd9c146100b0578063ccf44775146100d1578063d6d8c9a8146100e6575f80fd5b806301ffc9a7146100685780635514ca2014610090575b5f80fd5b61007b610076366004614d0e565b6100ee565b60405190151581526020015b60405180910390f35b6100a361009e366004614e0e565b610186565b6040516100879190614e88565b6100c36100be366004614e0e565b61023e565b604051610087929190614f39565b6100d961025e565b6040516100879190614f8e565b6100d961026d565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082167f1a2c8edd00000000000000000000000000000000000000000000000000000000148061018057507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b92915050565b6040805160208101909152606081525f6101e3836101a2610277565b6101aa61029a565b60408051808201909152600881527f1c991fe52025208200000000000000000000000000000000000000000000000060208201526102ba565b90505f6020840190505f6101fa8580510160200190565b90506102078383836104ac565b915061021483838361050e565b9150604051806020016040528061022a856106db565b90529350505050610239610739565b919050565b606080610255610250846101a2610277565b61077e565b91509150915091565b60606102686108fb565b905090565b6060610268610948565b6060604051806101a0016040528061016381526020016152aa6101639139905090565b60606040518060c001604052806090815260200161540d60909139905090565b6103476040518061026001604052805f81526020015f81526020015f81526020015f81526020015f81526020015f81526020015f80191681526020015f81526020015f81526020015f81526020015f81526020015f81526020015f80191681526020016060815260200160608152602001606081526020015f815260200160608152602001606081525090565b5f6040518061026001604052805f81526020015f81526020015f81526020015f81526020015f81526020015f81526020015f801b81526020015f8152602001600481526020015f81526020015f81526020015f81526020015f801b8152602001848152602001858152602001600467ffffffffffffffff8111156103cd576103cd614d4d565b6040519080825280602002602001820160405280156103f6578160200160208202803683370190505b5081525f602080830182905260408084018b905260609384018a90528051601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016828152808301825283517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00001681178452855290840182905283018190529082018190526080820181905260a082018190526101208201819052610140820181905261020082015290505b95945050505050565b5f5b8183101561050457825160015f9190911a1b6401000026008116156104df576104d8858585610c09565b93506104fe565b658000000000008116156104f8576104d8858585610c4d565b50610504565b506104ae565b50815b9392505050565b815160408051808201909152601081527f7573696e672d776f7264732d66726f6d0000000000000000000000000000000060208201525f919061055090614fa0565b7fffffffffffffffffffffffffffffffff000000000000000000000000000000008216146105815783915050610507565b5060108301925081831061061a5761022084015183037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0017f53c102422473590ce12511beab7637e1c33b596a7d58a80ea98463ad78950000175b6040517fe3e4992d00000000000000000000000000000000000000000000000000000000815260040161061191815260200190565b60405180910390fd5b825160015f91821a1b90640100002600821690036106835761022085015184037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0017f53c102422473590ce12511beab7637e1c33b596a7d58a80ea98463ad78950000176105dc565b836001019350505b818310156105045761069e8484846104ac565b925081831015610504575f806106b5868686610e7b565b9096509092509050816106c9575050610504565b6106d486868361102d565b505061068b565b60c08101516040516060919073ffffffffffffffffffffffffffffffffffffffff602082015f5b841561072357848316825260a09490941c5193602090910190600101610702565b8352604052610731826110ec565b509392505050565b60405162010000811061077b576040517f766c065f00000000000000000000000000000000000000000000000000000000815260048101829052602401610611565b50565b6060805f8361022001515111156108d0575f61079f84610220015160200190565b90505f6107b485610220015180510160200190565b90506107c18583836104ac565b91506107ce85838361050e565b91505b80821015610805576107e48583836104ac565b91506107f185838361113a565b91506107fe85838361153d565b91506107d1565b80821461083e576040517f7d565df600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610100850151600816156108cd5761022085015182037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0017f53c102422473590ce12511beab7637e1c33b596a7d58a80ea98463ad78950000176040517ff06f54cf00000000000000000000000000000000000000000000000000000000815260040161061191815260200190565b50505b5f806108e56108de86611afc565b8690611c31565b915091506108f1610739565b9094909350915050565b6040805160a0810182526004808252611c996020830152611fe592820192909252612025606082810191909152612082608083015291908190805b61093f8161226b565b94505050505090565b6060614d045f604890508091505f6040518061092001604052808467ffffffffffffffff1667ffffffffffffffff1681526020016122fb81526020016122fb81526020016122fb81526020016123c781526020016124db81526020016124db81526020016123c781526020016123c781526020016124db81526020016122fb81526020016122fb81526020016122fb81526020016124db81526020016124db81526020016124db81526020016124db81526020016124db81526020016124db81526020016124db81526020016124db81526020016124db81526020016124db81526020016124db81526020016124db81526020016124db81526020016124db81526020016124db81526020016124db81526020016124db81526020016124db81526020016124db81526020016124db81526020016124db81526020016124db81526020016124db81526020016124db81526020016124db81526020016124db81526020016124db81526020016124db81526020016124db81526020016124db81526020016124db81526020016124db81526020016124db81526020016124db81526020016124db81526020016124db81526020016124db81526020016124db81526020016124db81526020016124db81526020016124db81526020016124db81526020016124db81526020016124db81526020016124db81526020016124db81526020016124db81526020016124db81526020016124db81526020016124db81526020016124db81526020016124db81526020016124db81526020016124db81526020016124db81526020016124db81526020016124db81526020016124db81526020016124db81526020016124db8152509050606081905060488151146109365780516040517fc8b56901000000000000000000000000000000000000000000000000000000008152600481019190915260248101849052604401610611565b610100830180517ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1690525f610c45838364010000260061251d565b949350505050565b6101008301805160011790525f60048301821015610ce75761022084015183037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0017f53c102422473590ce12511beab7637e1c33b596a7d58a80ea98463ad78950000175b6040517f25a7646800000000000000000000000000000000000000000000000000000000815260040161061191815260200190565b825160f01c612f2a8114610d765761022085015184037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0017f53c102422473590ce12511beab7637e1c33b596a7d58a80ea98463ad78950000176040517f3e47169c00000000000000000000000000000000000000000000000000000000815260040161061191815260200190565b6003840193505f5b83851015610e1b5784515f1a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd18101610e0f577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff86015160f01c7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd5d18101610e0d57505050600193840193610e1b565b505b85600101955050610d7e565b80610e715761022086015185037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0017f53c102422473590ce12511beab7637e1c33b596a7d58a80ea98463ad7895000017610cb2565b5092949350505050565b81515f90819081908190600181831a1b6703ff200000000000811615610fa25786610ea7896001615012565b1015610f9957600182811a1b7ffffffffffffffffffffffffffffffffffeffffffffffffffffff00000000000082821701610ee4575f9350610f93565b7ffffffffffffffffffffffffffffffffffffffffffeffffffffff00000000000082821701610f8e576102208a015189037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0017f53c102422473590ce12511beab7637e1c33b596a7d58a80ea98463ad78950000176040517f75c28ff900000000000000000000000000000000000000000000000000000000815260040161061191815260200190565b600193505b50610fe7565b60019250610fe7565b640400000000811615610fb85760029250610fe7565b6b080000000000000000000000811615610fd55760039250610fe7565b505f9450869350849250611024915050565b505f905061101588888861100d83876101a09190910151600291820201015161ffff1690565b63ffffffff16565b90975060019550879450925050505b93509350939050565b73ffffffffffffffffffffffffffffffffffffffff8111156110ca5761022083015182037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0017f53c102422473590ce12511beab7637e1c33b596a7d58a80ea98463ad78950000176040517f9d7e517e00000000000000000000000000000000000000000000000000000000815260040161061191815260200190565b60c09092018051604080516020810190915290815260a01b9290921790915250565b60208101602082510282015b808210156111355781518151835281526020909101907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0016110f8565b505050565b5f5b818310156105045782515f90600190821a1b6f07fffffe8000000000000000000000008116156113b757610100860151600116156111f65761022086015185037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0017f53c102422473590ce12511beab7637e1c33b596a7d58a80ea98463ad78950000175b6040517f5520a51700000000000000000000000000000000000000000000000000000000815260040161061191815260200190565b6f07fffffe0000000000000000000000008116156112c95761122985856f07fffffe0000000003ff200000000000612546565b90955091505f6112398784612615565b50905080156112c35761022087015186037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0017f53c102422473590ce12511beab7637e1c33b596a7d58a80ea98463ad78950000176040517f53e6feba00000000000000000000000000000000000000000000000000000000815260040161061191815260200190565b506112ea565b6112e760018601856f07fffffe0000000003ff20000000000061251d565b94505b856040015160ff1660ff148061130757508560a0015160ff1660ff145b1561138d5761022086015185037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0017f53c102422473590ce12511beab7637e1c33b596a7d58a80ea98463ad78950000176040517f3820634100000000000000000000000000000000000000000000000000000000815260040161061191815260200190565b604086018051600190810190915260a0870180519091019052610100860180516009179052611536565b640100002600811615611409576113d7600186018564010000260061251d565b610100870180517ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1690529450611536565b670400000000000000811615611455575050610100840180516008177ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe16905260019290920191610504565b658000000000008116156114e55761022086015185037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0017f53c102422473590ce12511beab7637e1c33b596a7d58a80ea98463ad78950000175b6040517fedad0c5800000000000000000000000000000000000000000000000000000000815260040161061191815260200190565b61022086015185037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0017f53c102422473590ce12511beab7637e1c33b596a7d58a80ea98463ad78950000176111c1565b505061113c565b5f5b818310156105045782515f90600190821a1b6f07fffffe00000000000000000000000081161561175d57610100860151600116156115f95761022086015185037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0017f53c102422473590ce12511beab7637e1c33b596a7d58a80ea98463ad78950000175b6040517f4e803df600000000000000000000000000000000000000000000000000000000815260040161061191815260200190565b8461161581866f07fffffe0000000003ff200000000000612546565b80945081975050505f8061162e89610240015186612690565b91509150811561166f57611643898989612764565b97505f6116508a836129ef565b905061165d8a8383612a15565b50610100890180516002179052611749565b6116798986612bfa565b9092509050811561169d5761168f895f83612a15565b61169889612c74565b611749565b5f6060848a03600581016116b28d8d8d612764565b9b508c6101e0015151602002602001810190505f60059050604051935060208201840160405282818501528184528394506116fa8860056116f38760200190565b0185612cda565b5050506101e08b015180516001019061172d906117278361171e8680510160200190565b90602002900390565b83612ce3565b5061173a8b60ff84612a15565b50506101008901805160021790525b505050610100860180516001179052611af5565b6101008601516002161561187f576501000000000081165f036117fb5761022086015185037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0017f53c102422473590ce12511beab7637e1c33b596a7d58a80ea98463ad78950000176040517f23b5c6ea00000000000000000000000000000000000000000000000000000000815260040161061191815260200190565b606086810180515f1a6003019190829053603b821115611847576040517f6232f2d900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050610100860180517ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc169052600190940193611af5565b6502000000000081161561195b576060868101515f90811a91908290036119215761022088015187037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0017f53c102422473590ce12511beab7637e1c33b596a7d58a80ea98463ad78950000176040517f7f9db54200000000000000000000000000000000000000000000000000000000815260040161061191815260200190565b808801600383039250828153826004820101515f1a8360028301015160f01c600101535061194e88612c74565b5050600190940193611af5565b6401000026008116156119ad5761197b600186018564010000260061251d565b610100870180517ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1690529450611af5565b6b0800000003ff2004000000008116156119e8576119cc868686612cef565b94506119d786612c74565b610100860180516001179052611af5565b65100000000000811615611a0d57611a008686612e19565b5050600190920191610504565b670800000000000000811615611a4557611a278686612e19565b611a3086613271565b50506004610100850152600190920191610504565b65800000000000811615611aa45761022086015185037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0017f53c102422473590ce12511beab7637e1c33b596a7d58a80ea98463ad78950000176114b0565b61022086015185037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0017f53c102422473590ce12511beab7637e1c33b596a7d58a80ea98463ad78950000176115c4565b505061153f565b60e08101518151516060919060f082901c9060208114611b48576040517f858f2dcf00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604051935060208401601083045f8183535060016008850483018101928391015f80805b88811015611ba55789811c61ffff81165163ffff0000601092831b16811760e01b8786015284019360f08390031b929092179101611b6c565b50825117909152878203017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08181018952908801601f01166040525f5b82811015611c25576002810288016003015161ffff90811683018051602060f082901c019260e09190911c1690611c1a838284612cda565b505050600101611be2565b50505050505050919050565b6060805f611c3e8461359f565b90505f5b81811015611c81575f611c5586836135b9565b60040190505f611c6587846135e8565b60040282019050611c778883836135ff565b5050600101611c42565b5083611c8c866138bf565b92509250505b9250929050565b5f80808080611ca9888888613934565b985090925090508181036040811115611d3d5761022089015183037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0017f53c102422473590ce12511beab7637e1c33b596a7d58a80ea98463ad78950000176040517fff2f594900000000000000000000000000000000000000000000000000000000815260040161061191815260200190565b805f03611dc55761022089015183037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0017f53c102422473590ce12511beab7637e1c33b596a7d58a80ea98463ad78950000176040517fc75cd50900000000000000000000000000000000000000000000000000000000815260040161061191815260200190565b60028106600103611e515761022089015183037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0017f53c102422473590ce12511beab7637e1c33b596a7d58a80ea98463ad78950000176040517fd76d9b5700000000000000000000000000000000000000000000000000000000815260040161061191815260200190565b6001820397505f5b838910611fd45788515f90811a906001821b906703ff000000000000821615611ea557507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd08201611f9e565b6c7e000000000000000000000000821615611ee357507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa98201611f9e565b687e0000000000000000821615611f1d57507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc98201611f9e565b6102208d01518c037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0017f53c102422473590ce12511beab7637e1c33b596a7d58a80ea98463ad78950000176040517f69f1e3e600000000000000000000000000000000000000000000000000000000815260040161061191815260200190565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff909b019a831b96909617955050600401611e59565b50509350909150505b935093915050565b5f805f805f80611ff58888613984565b9296509094509250905061200a898486613e23565b826120158383613ea7565b9550955050505050935093915050565b5f808080612034878787613ef9565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08301805184840382529199509294509092505f91612072816140b3565b9190529698969750505050505050565b6001909101905f80836120a681856fffffffffdffffffffffffffeffffd9ff61251d565b9450848181036121315761022087015186037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0017f53c102422473590ce12511beab7637e1c33b596a7d58a80ea98463ad78950000176040517ff73a1aa800000000000000000000000000000000000000000000000000000000815260040161061191815260200190565b61213c878787610c09565b95508561215a81876fffffffffdfffffffffffffffffffffff61251d565b9650868681106121e65761022089015188037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0017f53c102422473590ce12511beab7637e1c33b596a7d58a80ea98463ad78950000175b6040517fc4b1913500000000000000000000000000000000000000000000000000000000815260040161061191815260200190565b875160015f91821a1b906b20000000000000000000000082169003612256576102208a015189037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0017f53c102422473590ce12511beab7637e1c33b596a7d58a80ea98463ad78950000176121b1565b50600190970196876120158a868686866140df565b60605f825160020267ffffffffffffffff81111561228b5761228b614d4d565b6040519080825280601f01601f1916602001820160405280156122b5576020820181803683370190505b50905061ffff80196020850160208651028101600285015b818310156122ef578051835186169085161781526020909201916002016122cd565b50939695505050505050565b5f8151600103612386575060208101517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8116601b0b60e082901d5f61233e8383836142a3565b905061ffff81111561237c576040517f7938075c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b9250610239915050565b81515f0361239557505f919050565b6040517f1ac6690800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f815160020361249f57602082015160408301517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8216601b0b60e083901d5f61240e8383836142a3565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8516601b0b935060e085901d925090505f6124478484836142a3565b905060ff821180612458575060ff81115b1561248f576040517f7938075c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60081b1794506102399350505050565b600282511015612395576040517ff16066b000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f81515f14612516576040517f9f16b02000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505f919050565b5f5b5f82600186515f1a1b1611838510161561253e5760018401935061251f565b509192915050565b5f80806001818787036020811161255d5780612560565b60205b915050875192505b8519600184841a1b1615818310161561258657600182019150612568565b9681019660208290036008810293841c90931b9261260857604080516020810185905201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152908290527fe47fe8b700000000000000000000000000000000000000000000000000000000825261061191600401614f8e565b5095969095509350505050565b5f806126218484612bfa565b909250905081611c925750610120830180515f93845260209384902060408051928352948201855293909401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000909316601084901b62ff00001617909317909252909160ff90911660010190565b600182810180515f928392600560ff93909316602102870192830192909101835b818310156127555760018301516021909301805190935f90819060ff1681806126da838e6142ff565b915091508186165f036126fc575f809b509b5050505050505050505050611c92565b5f8761270c60018503891661432a565b016004028b015195505062ffffff90811693508416830391506127409050575060019750601c1a9550611c92945050505050565b6127498361432a565b840193505050506126b1565b505f9788975095505050505050565b81516101e08401515f80825291600190831a1b907ffffffffffffffffffffffffffffffffffffffffffffffffff0000000000000008201610e71576127a885615052565b610100870180517ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe169052805190955060015f91821a1b9250805b8587101561298d57865160015f9190911a1b93506401000026008416156128165761280f888888610c09565b96506127e3565b67400000000000000084161561283a5761282f87615052565b96506001905061298d565b6001886101000151165f0361290b57600482036128d25761022088015187037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0017f53c102422473590ce12511beab7637e1c33b596a7d58a80ea98463ad78950000176040517f8c9fdbb300000000000000000000000000000000000000000000000000000000815260040161061191815260200190565b5f6128de898989614402565b60208581028701018190526101008b0180516001179052909850905061290383615052565b9250506127e3565b61022088015187037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0017f53c102422473590ce12511beab7637e1c33b596a7d58a80ea98463ad78950000175b6040517f722cd24a00000000000000000000000000000000000000000000000000000000815260040161061191815260200190565b806129e35761022088015187037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0017f53c102422473590ce12511beab7637e1c33b596a7d58a80ea98463ad7895000017612958565b50905250919392505050565b6101c08201516002828102820101516101e08401515f9261ffff90921691906104a39083565b612a1e8361442a565b610100830180517ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb1660081790526020808401515f90811a8501602101805190911a60ff811492919060018101825350508115612aa7576040517f8092d1ea00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050825180516060808601515f90811a87016061018051939461ffff8616949093921a60ff81149291600886048503601c0191600181018253505f60038201537fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe30180517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00001690911790528115612b6a576040517f3abd0c5e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050602090920183821b176018820185901b178083529160e0829003612bf25760408051601083901b6020908117601f9092017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016918252810190915281517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000168117825286525b505050505050565b6101208201516101408301515f8381526020808220919384939290911c91600160ff84161b80821615612c5f5761ffff83165b8015612c5d578360201c8503612c50576001965061ffff8460101c169550612c5d565b51925061ffff8316612c2d565b505b17610140909601959095525090939092509050565b6060818101515f90811a919082900361113557602083810180515f1a600101919082815350603e8210612cd3576040517fe826b5f600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050505050565b8083835e505050565b6020810283835e505050565b5f8080612cfd868686610e7b565b9096509250905080612d8b5761022086015185037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0017f53c102422473590ce12511beab7637e1c33b596a7d58a80ea98463ad78950000175b6040517fb0e4e5b300000000000000000000000000000000000000000000000000000000815260040161061191815260200190565b5f80612d96846144b6565b6101808901511615612dd75761016088015160101c5b8015801590612db9575082155b15612dd557602081015190519085149250600190910190612dac565b505b61016088015161ffff16612dfd600184612df15782612df5565b8383035b8b9190612a15565b5081612e0d57612e0d88856144cd565b50949695505050505050565b6060828101515f1a908115612ea95761022084015183037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0017f53c102422473590ce12511beab7637e1c33b596a7d58a80ea98463ad78950000176040517f6fb11cdc00000000000000000000000000000000000000000000000000000000815260040161061191815260200190565b5050612eb48261442a565b61010082018051600416600890811790915260a0830151602084015160ff8083169360f89290921c9290911c1681035f819003612fde576004856101000151165f03612f7b5761022085015184037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0017f53c102422473590ce12511beab7637e1c33b596a7d58a80ea98463ad78950000176040517fab1d3ea700000000000000000000000000000000000000000000000000000000815260040161061191815260200190565b90820190603e8210612fb9576040517fe826b5f600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60f882901b6020860152610200850151612fd3908461451f565b6102008601526130f9565b60018111156130f957808310156130705761022085015184037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0017f53c102422473590ce12511beab7637e1c33b596a7d58a80ea98463ad78950000176040517f78ef278200000000000000000000000000000000000000000000000000000000815260040161061191815260200190565b808311156130f95761022085015184037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0017f53c102422473590ce12511beab7637e1c33b596a7d58a80ea98463ad78950000176040517f43168e6800000000000000000000000000000000000000000000000000000000815260040161061191815260200190565b8082036001016020601083028101905b8181101561325d5760a08801516020848a0181015191831c61ffff16915f1a9060015b82811161324b5760208406601c0361314557925160f01c925b83516102008d015160019190911a9061315e90826145a3565b6102008e01525f82851480156131745750896001145b61317f576001613181565b8b5b6102008f015190915061319490826145e9565b6102008f0152600f8111806131a95750600f82115b1561322f576102208e01518d037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0017f53c102422473590ce12511beab7637e1c33b596a7d58a80ea98463ad78950000176040517f7ea1869f00000000000000000000000000000000000000000000000000000000815260040161061191815260200190565b818160041b17600187015350506004939093019260010161312c565b50506001909401935050601001613109565b5050505060081b60a0909301929092525050565b60e081015160208083015160f083811c925f9290921a60010191908390036132c5576040517fa806284100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610200850151855180515f928392909160219060101c61ffff165b80156132f757805190925060101c61ffff166132e0565b506040518a82018051919650601c8401939160049160248901915f90811a805b8d8310156133dc5760048202860195506004878a03045b8082111561334c57965161ffff16601c81019950969003600761332e565b506004810298899003805186529894909401938103865b60078211156133a8575160101c61ffff1680518652601c909501947ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff990910190613363565b81156133c3575160101c61ffff168051865260048202909501945b50505060019182018051909291909101905f1a80613317565b50505082895250600488810180517fffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9290940491909101601881901b8817939093179052601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660405260ff1094505083156134a8576040517fe972437e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6134b56001808a1b615089565b891685891b60f06134c78b6010615012565b901b171760e08b01526101008a0180517ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7169052604080516020601f9091017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01681815280820183525f80517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00001682178152908d52908c01819052908b0181905260608b0181905260808b0181905260a08b018190526101208b018190526101408b018190526102008b015250505050505050505050565b5f81515f036135af57505f919050565b50602001515f1a90565b5f806135c48461359f565b60020260010190505f6135d7858561465c565b949091019093016020019392505050565b5f806135f484846135b9565b515f1a949350505050565b808210156111355781517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0160f882901c016138395760c08401515b80156138375760a081901c5161016086015161ffff60e085901c1660208101805160089390931b62ffff0016600187901a1760e81b7cffffffffffffffffffffffffffffffffffffffffffffffffffffffffff909316929092179091526040517f570c7a630000000000000000000000000000000000000000000000000000000081529192915f908190819073ffffffffffffffffffffffffffffffffffffffff86169063570c7a63906136f2908790600401614f8e565b5f60405180830381865afa15801561370c573d5f803e3d5ffd5b505050506040513d5f823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682016040526137519190810190615128565b925092509250821561382d57815160041461379a57816040517fbe2d187d0000000000000000000000000000000000000000000000000000000081526004016106119190614f8e565b60208201517fffffffff00000000000000000000000000000000000000000000000000000000167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff88161789525f5b81518110156138225761381a828281518110613803576138036151d5565b60200260200101518c6144cd90919063ffffffff16565b6001016137e5565b505050505050613837565b505050505061363a565b505b5081517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0160f882901c016138b357606061ffff8260e01c1690505f6003820152600581019050806040517faedfba2f0000000000000000000000000000000000000000000000000000000081526004016106119190614f8e565b506004820191506135ff565b6101608101516040805161ffff8316808252602080820283019081019093529092909160109190911c90835b8082111561392b5760208301518252915161ffff16917fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0909101906138eb565b50505050919050565b5f808080613943866002615012565b9050806c7e0000007e03ff0000000000005b86821081600184515f1a1b161515161561397457600182019150613955565b5090979096508695509350505050565b5f82818061399983866520000000000061251d565b925085831415836139b381886703ff00000000000061251d565b94508085036139ed57507f34bd20690000000000000000000000000000000000000000000000000000000094505f9250829150613e1a9050565b5f806139f98a886146b2565b90925090507fffffffff00000000000000000000000000000000000000000000000000000000821615613a37575095505f9350839250613e1a915050565b86519095506540000000000060015f9290921a9190911b161515888710169150508015613cc657506001909301925f84613a7a81896703ff00000000000061251d565b9550808603613ab557507f7bfa48af0000000000000000000000000000000000000000000000000000000095505f9350839250613e1a915050565b855b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81018051908a1160015f9290921a9190911b660100000000000016151516600103613b24577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01613ab7565b818114613b7b575f80613b3784846146b2565b90925090507fffffffff00000000000000000000000000000000000000000000000000000000821615613b77575097505f9550859450613e1a9350505050565b9350505b5f831215613bb657507f7bfa48af0000000000000000000000000000000000000000000000000000000096505f9450849350613e1a92505050565b8315613bc257825f0392505b80820394505f851315613c0257507f013b2aaa0000000000000000000000000000000000000000000000000000000096505f9450849350613e1a92505050565b855f03613c1157829550613cc3565b5f8590036043811115613c5257507f32b8b8be0000000000000000000000000000000000000000000000000000000097505f9550859450613e1a9350505050565b600a0a8681025f88838381613c6957613c69615025565b0514159050601b82900b8214158180613c7f5750805b15613cbb57507f32b8b8be000000000000000000000000000000000000000000000000000000009a505f9850889750613e1a9650505050505050565b505084019650505b50505b84516c2000000020000000000000000060015f9290921a9190911b161515878610168015613e0b5760019095019485613d06818a6520000000000061251d565b965086613d1c818b6703ff00000000000061251d565b9750808803613d5957507f013b2aaa0000000000000000000000000000000000000000000000000000000097505f9550859450613e1a9350505050565b505f80613d66838a6146b2565b90925090507fffffffff00000000000000000000000000000000000000000000000000000000821615613da6575097505f9550859450613e1a9350505050565b9250508482015f83138015613dba57508581125b80613dce57505f83128015613dce57508581135b15613e0757507fd556b1110000000000000000000000000000000000000000000000000000000097505f9550859450613e1a9350505050565b9450505b845f03613e16575f93505b5050505b92959194509250565b7fffffffff00000000000000000000000000000000000000000000000000000000811615611135576102208301515f9083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0017f53c102422473590ce12511beab7637e1c33b596a7d58a80ea98463ad78950000179050815f528060045260245ffd5b5f805f613eb485856147dc565b9150915080610731576040517f22c9f7bb0000000000000000000000000000000000000000000000000000000081526004810186905260248101859052604401610611565b5f80806001850181806f7ffffffffffffffffffffffb0000000081807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8b8b0301602080821015613f475750805b875193505b84600185851a1b1615158184101615613f6a57600183019250613f4c565b505080602003613ff5576102208c01518b037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0017f53c102422473590ce12511beab7637e1c33b596a7d58a80ea98463ad78950000176040517f30515bda00000000000000000000000000000000000000000000000000000000815260040161061191815260200190565b85810180519095505f1a6001811b6404000000001615806140155750858b145b1561409b576102208d015186037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0017f53c102422473590ce12511beab7637e1c33b596a7d58a80ea98463ad78950000176040517f04022fbf00000000000000000000000000000000000000000000000000000000815260040161061191815260200190565b50949b939a505060018a019850919650505050505050565b5f80601f90505f60e09050818451168082175f528060208601600183016020035e50505f519392505050565b5f60608186860361ffff811115614125576040517fb6da789c00000000000000000000000000000000000000000000000000000000815260048101829052602401610611565b604080516041888803848101838101929092017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169093526002828101859052018152935060228401925061417b898484612cda565b6141888783850183612cda565b50505060c08701515b80156142525760a081901c516040517fc6c0cbb60000000000000000000000000000000000000000000000000000000081529091905f90819073ffffffffffffffffffffffffffffffffffffffff84169063c6c0cbb6906141f6908890600401614f8e565b6040805180830381865afa158015614210573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906142349190615202565b91509150811561424a5794506104a39350505050565b505050614191565b61022088015187037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0017f53c102422473590ce12511beab7637e1c33b596a7d58a80ea98463ad7895000017612d56565b5f805f6142b18686866148e2565b91509150806142f6576040517f05e476780000000000000000000000000000000000000000000000000000000081526004810187905260248101869052604401610611565b50949350505050565b5f80825f528360205360215f2090506001815f1a1b915062ffffff8116611c92575060019250929050565b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361435b5750610100919050565b507f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f7f5555555555555555555555555555555555555555555555555555555555555555600183901c16909103600281901c7f3333333333333333333333333333333333333333333333333333333333333333908116911601600481901c01167f01010101010101010101010101010101010101010101010101010101010101010260f81c90565b5f805f805f614412888888610e7b565b9250925092508215614252579093509150611fdd9050565b8051602080830180515f90811a8086016021015160a0939190831a61447c5785518488018051600861ffff909316929092046020038801601e83901a840360010160100290811b909217905260f01092505b50508015612cd3576040517f5b1a42d600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f6144c36101008361522c565b6001901b92915050565b6101608201805160408051808201909152601091821c808252602082018590528351600161ffff909116019282901b9290921790925261450c836144b6565b6101809094018051909417909352505050565b5f61452a83836145e9565b925060ff600884901c8116830190811115614571576040517fe826b5f600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff841660089190911b17905092915050565b5f60ff8316828110156145e2576040517f23b49a2a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050900390565b5f60ff808416830190600885901c811690601086901c90831115614639576040517fe826b5f600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b808311156146445750815b601081901b600883901b841717935050505092915050565b5f6146668361359f565b82106146a25781836040517ffcfaeff1000000000000000000000000000000000000000000000000000000008152600401610611929190615264565b50600202016003015161ffff1690565b81515f90819065200000000000600191831a9190911b161515838510168085019082806146df8488614ae9565b90925090507fffffffff0000000000000000000000000000000000000000000000000000000082161561471a575093505f9250611c92915050565b825f0361477d577f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811161474e575f614770565b7f0fdc2635000000000000000000000000000000000000000000000000000000005b95509350611c9292505050565b7f800000000000000000000000000000000000000000000000000000000000000081116147aa575f6147cc565b7f0fdc2635000000000000000000000000000000000000000000000000000000005b95505f0393505050509250929050565b5f601b83900b8314838382614840577d90e40fbeea1d3a4abc8955e946fe31cdcf66f634e100000000000000000086051561482057620186a0860595506005850194505b8586601b0b1461483b57600a86059550846001019450614820565b614856565b855f0361485657505f925060019150611c929050565b848560030b146148b2575f85121561487657505f9250829150611c929050565b6040517fd556b1110000000000000000000000000000000000000000000000000000000081526004810183905260248101829052604401610611565b50507bffffffffffffffffffffffffffffffffffffffffffffffffffffffff841660e084901b1791509250929050565b5f805f851215614928576040517f4a7d166b0000000000000000000000000000000000000000000000000000000081526004810186905260248101859052604401610611565b845f0361493a57505f90506001611fdd565b8460ff8416850185811215614985576040517fd556b1110000000000000000000000000000000000000000000000000000000081526004810188905260248101879052604401610611565b5f805f8312156149ef577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb38312156149c6575f809550955050505050611fdd565b825f03600a0a91508184816149dd576149dd615025565b0495505084029091149150611fdd9050565b5f831315614ad957604d831315614a45576040517fc849483b000000000000000000000000000000000000000000000000000000008152600481018a90526024810189905260ff88166044820152606401610611565b82600a0a9150817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81614a7a57614a7a615025565b04841115614ac7576040517fc849483b000000000000000000000000000000000000000000000000000000008152600481018a90526024810189905260ff88166044820152606401610611565b5091909102925060019150611fdd9050565b8360019550955050505050611fdd565b5f80828410614b1c57507f34bd20690000000000000000000000000000000000000000000000000000000090505f611c92565b835f03614b55576040517fda6966d400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60305f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8501815b878210158015614b8d5750604d83105b15614bd057815160018401937fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90930192600a0a5f9190911a8590030201614b7d565b878210614cf65781515f1a8490036001811115614c1857507f0fdc26350000000000000000000000000000000000000000000000000000000095505f9450611c929350505050565b600a84900a8102828101831115614c5b57507f0fdc26350000000000000000000000000000000000000000000000000000000096505f9550611c92945050505050565b9190910190507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff909101905b878210614cf65781515f1a60308114614ccb57507f0fdc26350000000000000000000000000000000000000000000000000000000095505f9450611c929350505050565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90910190614c87565b5f9890975095505050505050565b614d0c61527c565b565b5f60208284031215614d1e575f80fd5b81357fffffffff0000000000000000000000000000000000000000000000000000000081168114610507575f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715614dc157614dc1614d4d565b604052919050565b5f67ffffffffffffffff821115614de257614de2614d4d565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b5f60208284031215614e1e575f80fd5b813567ffffffffffffffff811115614e34575f80fd5b8201601f81018413614e44575f80fd5b8035614e57614e5282614dc9565b614d7a565b818152856020838501011115614e6b575f80fd5b816020840160208301375f91810160200191909152949350505050565b602080825282518282018290528051604084018190525f9291820190839060608601905b80831015614ee257835173ffffffffffffffffffffffffffffffffffffffff168252928401926001929092019190840190614eac565b509695505050505050565b5f81518084528060208401602086015e5f6020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b604081525f614f4b6040830185614eed565b8281036020848101919091528451808352858201928201905f5b81811015614f8157845183529383019391830191600101614f65565b5090979650505050505050565b602081525f6105076020830184614eed565b80516020808301519190811015614fdf577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8160200360031b1b821691505b50919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b8082018082111561018057610180614fe5565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361508257615082614fe5565b5060010190565b8181038181111561018057610180614fe5565b80518015158114610239575f80fd5b5f82601f8301126150ba575f80fd5b8151602067ffffffffffffffff8211156150d6576150d6614d4d565b8160051b6150e5828201614d7a565b92835284810182019282810190878511156150fe575f80fd5b83870192505b8483101561511d57825182529183019190830190615104565b979650505050505050565b5f805f6060848603121561513a575f80fd5b6151438461509c565b9250602084015167ffffffffffffffff8082111561515f575f80fd5b818601915086601f830112615172575f80fd5b8151615180614e5282614dc9565b818152886020838601011115615194575f80fd5b8160208501602083015e5f60208383010152809550505060408601519150808211156151be575f80fd5b506151cb868287016150ab565b9150509250925092565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f8060408385031215615213575f80fd5b61521c8361509c565b9150602083015190509250929050565b5f8261525f577f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b500690565b828152604060208201525f610c456040830184614eed565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52605160045260245ffdfe0288400100420b0280046b0641220186adb8a044003012020f2a880521281ac8811a000000000000000000080000000000100000000000000002000000000000000000290ea98a3a10f9c53927bda61c6395ad0e9fb4a8075dbeaf2d313e9e09b06d681dfe49062ce21ac13e83a6cc2ad2d2123422c3e0052f369e1f27267220a0a68d2f357696465d217b131120880f24f4a8242f1af53f41f7290afa3e8638acf3d13397e9fd00443a453b406bb547b9059d25a3cd1e11d0c3260b15eb4d16fc94274427bc412baf2cc2321b8f630dca9efe403ce35f1400684845c291e3425d68b13d5f9a151eb98c15239cd9c10c1f698235c8d3843c08d579273459d41a2c9ff617a5b2cd15c0031810f621af127ba34c26bb6c4137b2ad3d1b73563d0210215f36aa563921098e690457fb180376e752066a470128f11de101fcc60522de7ddd183d3d6d4196c37031cba2872e7b3af5304eee7219a8093543082b5f0801f5a522fb22fb22fb23c724db24db23c723c724db22fb22fb22fb24db24db24db24db24db24db24db24db24db24db24db24db24db24db24db24db24db24db24db24db24db24db24db24db24db24db24db24db24db24db24db24db24db24db24db24db24db24db24db24db24db24db24db24db24db24db24db24db24db24db24db24db24db24db24db24db24db24db24db24db"; + hex"6080604052348015600e575f80fd5b506154ab8061001c5f395ff3fe608060405234801561000f575f80fd5b5060043610610064575f3560e01c80637764fd9c1161004d5780637764fd9c146100b0578063ccf44775146100d1578063d6d8c9a8146100e6575f80fd5b806301ffc9a7146100685780635514ca2014610090575b5f80fd5b61007b610076366004614d16565b6100ee565b60405190151581526020015b60405180910390f35b6100a361009e366004614e16565b610186565b6040516100879190614e90565b6100c36100be366004614e16565b61023e565b604051610087929190614f41565b6100d961025e565b6040516100879190614f96565b6100d961026d565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082167f1a2c8edd00000000000000000000000000000000000000000000000000000000148061018057507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b92915050565b6040805160208101909152606081525f6101e3836101a2610277565b6101aa61029a565b60408051808201909152600881527f1ca11fed202d208a00000000000000000000000000000000000000000000000060208201526102ba565b90505f6020840190505f6101fa8580510160200190565b90506102078383836104ac565b915061021483838361050e565b9150604051806020016040528061022a856106db565b90529350505050610239610739565b919050565b606080610255610250846101a2610277565b61077e565b91509150915091565b60606102686108fb565b905090565b6060610268610948565b6060604051806101a0016040528061016781526020016152b26101679139905090565b60606040518060c001604052806092815260200161541960929139905090565b6103476040518061026001604052805f81526020015f81526020015f81526020015f81526020015f81526020015f81526020015f80191681526020015f81526020015f81526020015f81526020015f81526020015f81526020015f80191681526020016060815260200160608152602001606081526020015f815260200160608152602001606081525090565b5f6040518061026001604052805f81526020015f81526020015f81526020015f81526020015f81526020015f81526020015f801b81526020015f8152602001600481526020015f81526020015f81526020015f81526020015f801b8152602001848152602001858152602001600467ffffffffffffffff8111156103cd576103cd614d55565b6040519080825280602002602001820160405280156103f6578160200160208202803683370190505b5081525f602080830182905260408084018b905260609384018a90528051601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016828152808301825283517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00001681178452855290840182905283018190529082018190526080820181905260a082018190526101208201819052610140820181905261020082015290505b95945050505050565b5f5b8183101561050457825160015f9190911a1b6401000026008116156104df576104d8858585610c11565b93506104fe565b658000000000008116156104f8576104d8858585610c55565b50610504565b506104ae565b50815b9392505050565b815160408051808201909152601081527f7573696e672d776f7264732d66726f6d0000000000000000000000000000000060208201525f919061055090614fa8565b7fffffffffffffffffffffffffffffffff000000000000000000000000000000008216146105815783915050610507565b5060108301925081831061061a5761022084015183037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0017f53c102422473590ce12511beab7637e1c33b596a7d58a80ea98463ad78950000175b6040517fe3e4992d00000000000000000000000000000000000000000000000000000000815260040161061191815260200190565b60405180910390fd5b825160015f91821a1b90640100002600821690036106835761022085015184037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0017f53c102422473590ce12511beab7637e1c33b596a7d58a80ea98463ad78950000176105dc565b836001019350505b818310156105045761069e8484846104ac565b925081831015610504575f806106b5868686610e83565b9096509092509050816106c9575050610504565b6106d4868683611035565b505061068b565b60c08101516040516060919073ffffffffffffffffffffffffffffffffffffffff602082015f5b841561072357848316825260a09490941c5193602090910190600101610702565b8352604052610731826110f4565b509392505050565b60405162010000811061077b576040517f766c065f00000000000000000000000000000000000000000000000000000000815260048101829052602401610611565b50565b6060805f8361022001515111156108d0575f61079f84610220015160200190565b90505f6107b485610220015180510160200190565b90506107c18583836104ac565b91506107ce85838361050e565b91505b80821015610805576107e48583836104ac565b91506107f1858383611142565b91506107fe858383611545565b91506107d1565b80821461083e576040517f7d565df600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610100850151600816156108cd5761022085015182037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0017f53c102422473590ce12511beab7637e1c33b596a7d58a80ea98463ad78950000176040517ff06f54cf00000000000000000000000000000000000000000000000000000000815260040161061191815260200190565b50505b5f806108e56108de86611b04565b8690611c39565b915091506108f1610739565b9094909350915050565b6040805160a0810182526004808252611ca16020830152611fed9282019290925261202d60608281019190915261208a608083015291908190805b61093f81612273565b94505050505090565b6060614d0c5f604990508091505f6040518061094001604052808467ffffffffffffffff1667ffffffffffffffff1681526020016123038152602001612303815260200161230381526020016123cf81526020016124e381526020016124e381526020016123cf81526020016123cf81526020016124e381526020016123038152602001612303815260200161230381526020016124e381526020016124e381526020016124e381526020016124e381526020016124e381526020016124e381526020016124e381526020016124e381526020016124e381526020016124e381526020016124e381526020016124e381526020016124e381526020016124e381526020016124e381526020016124e381526020016124e381526020016124e381526020016124e381526020016124e381526020016124e381526020016124e381526020016124e381526020016124e381526020016124e381526020016124e381526020016124e381526020016124e381526020016124e381526020016124e381526020016124e381526020016124e381526020016124e381526020016124e381526020016124e381526020016124e381526020016124e381526020016124e381526020016124e381526020016124e381526020016124e381526020016124e381526020016124e381526020016124e381526020016124e381526020016124e381526020016124e381526020016124e381526020016124e381526020016124e381526020016124e381526020016124e381526020016124e381526020016124e381526020016124e381526020016124e381526020016124e381526020016124e381526020016124e381526020016124e381526020016124e38152509050606081905060498151146109365780516040517fc8b56901000000000000000000000000000000000000000000000000000000008152600481019190915260248101849052604401610611565b610100830180517ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1690525f610c4d8383640100002600612525565b949350505050565b6101008301805160011790525f60048301821015610cef5761022084015183037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0017f53c102422473590ce12511beab7637e1c33b596a7d58a80ea98463ad78950000175b6040517f25a7646800000000000000000000000000000000000000000000000000000000815260040161061191815260200190565b825160f01c612f2a8114610d7e5761022085015184037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0017f53c102422473590ce12511beab7637e1c33b596a7d58a80ea98463ad78950000176040517f3e47169c00000000000000000000000000000000000000000000000000000000815260040161061191815260200190565b6003840193505f5b83851015610e235784515f1a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd18101610e17577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff86015160f01c7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd5d18101610e1557505050600193840193610e23565b505b85600101955050610d86565b80610e795761022086015185037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0017f53c102422473590ce12511beab7637e1c33b596a7d58a80ea98463ad7895000017610cba565b5092949350505050565b81515f90819081908190600181831a1b6703ff200000000000811615610faa5786610eaf89600161501a565b1015610fa157600182811a1b7ffffffffffffffffffffffffffffffffffeffffffffffffffffff00000000000082821701610eec575f9350610f9b565b7ffffffffffffffffffffffffffffffffffffffffffeffffffffff00000000000082821701610f96576102208a015189037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0017f53c102422473590ce12511beab7637e1c33b596a7d58a80ea98463ad78950000176040517f75c28ff900000000000000000000000000000000000000000000000000000000815260040161061191815260200190565b600193505b50610fef565b60019250610fef565b640400000000811615610fc05760029250610fef565b6b080000000000000000000000811615610fdd5760039250610fef565b505f945086935084925061102c915050565b505f905061101d88888861101583876101a09190910151600291820201015161ffff1690565b63ffffffff16565b90975060019550879450925050505b93509350939050565b73ffffffffffffffffffffffffffffffffffffffff8111156110d25761022083015182037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0017f53c102422473590ce12511beab7637e1c33b596a7d58a80ea98463ad78950000176040517f9d7e517e00000000000000000000000000000000000000000000000000000000815260040161061191815260200190565b60c09092018051604080516020810190915290815260a01b9290921790915250565b60208101602082510282015b8082101561113d5781518151835281526020909101907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001611100565b505050565b5f5b818310156105045782515f90600190821a1b6f07fffffe8000000000000000000000008116156113bf57610100860151600116156111fe5761022086015185037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0017f53c102422473590ce12511beab7637e1c33b596a7d58a80ea98463ad78950000175b6040517f5520a51700000000000000000000000000000000000000000000000000000000815260040161061191815260200190565b6f07fffffe0000000000000000000000008116156112d15761123185856f07fffffe0000000003ff20000000000061254e565b90955091505f611241878461261d565b50905080156112cb5761022087015186037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0017f53c102422473590ce12511beab7637e1c33b596a7d58a80ea98463ad78950000176040517f53e6feba00000000000000000000000000000000000000000000000000000000815260040161061191815260200190565b506112f2565b6112ef60018601856f07fffffe0000000003ff200000000000612525565b94505b856040015160ff1660ff148061130f57508560a0015160ff1660ff145b156113955761022086015185037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0017f53c102422473590ce12511beab7637e1c33b596a7d58a80ea98463ad78950000176040517f3820634100000000000000000000000000000000000000000000000000000000815260040161061191815260200190565b604086018051600190810190915260a087018051909101905261010086018051600917905261153e565b640100002600811615611411576113df6001860185640100002600612525565b610100870180517ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe169052945061153e565b67040000000000000081161561145d575050610100840180516008177ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe16905260019290920191610504565b658000000000008116156114ed5761022086015185037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0017f53c102422473590ce12511beab7637e1c33b596a7d58a80ea98463ad78950000175b6040517fedad0c5800000000000000000000000000000000000000000000000000000000815260040161061191815260200190565b61022086015185037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0017f53c102422473590ce12511beab7637e1c33b596a7d58a80ea98463ad78950000176111c9565b5050611144565b5f5b818310156105045782515f90600190821a1b6f07fffffe00000000000000000000000081161561176557610100860151600116156116015761022086015185037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0017f53c102422473590ce12511beab7637e1c33b596a7d58a80ea98463ad78950000175b6040517f4e803df600000000000000000000000000000000000000000000000000000000815260040161061191815260200190565b8461161d81866f07fffffe0000000003ff20000000000061254e565b80945081975050505f8061163689610240015186612698565b9150915081156116775761164b89898961276c565b97505f6116588a836129f7565b90506116658a8383612a1d565b50610100890180516002179052611751565b6116818986612c02565b909250905081156116a557611697895f83612a1d565b6116a089612c7c565b611751565b5f6060848a03600581016116ba8d8d8d61276c565b9b508c6101e0015151602002602001810190505f60059050604051935060208201840160405282818501528184528394506117028860056116fb8760200190565b0185612ce2565b5050506101e08b01518051600101906117359061172f836117268680510160200190565b90602002900390565b83612ceb565b506117428b60ff84612a1d565b50506101008901805160021790525b505050610100860180516001179052611afd565b61010086015160021615611887576501000000000081165f036118035761022086015185037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0017f53c102422473590ce12511beab7637e1c33b596a7d58a80ea98463ad78950000176040517f23b5c6ea00000000000000000000000000000000000000000000000000000000815260040161061191815260200190565b606086810180515f1a6003019190829053603b82111561184f576040517f6232f2d900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050610100860180517ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc169052600190940193611afd565b65020000000000811615611963576060868101515f90811a91908290036119295761022088015187037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0017f53c102422473590ce12511beab7637e1c33b596a7d58a80ea98463ad78950000176040517f7f9db54200000000000000000000000000000000000000000000000000000000815260040161061191815260200190565b808801600383039250828153826004820101515f1a8360028301015160f01c600101535061195688612c7c565b5050600190940193611afd565b6401000026008116156119b5576119836001860185640100002600612525565b610100870180517ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1690529450611afd565b6b0800000003ff2004000000008116156119f0576119d4868686612cf7565b94506119df86612c7c565b610100860180516001179052611afd565b65100000000000811615611a1557611a088686612e21565b5050600190920191610504565b670800000000000000811615611a4d57611a2f8686612e21565b611a3886613279565b50506004610100850152600190920191610504565b65800000000000811615611aac5761022086015185037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0017f53c102422473590ce12511beab7637e1c33b596a7d58a80ea98463ad78950000176114b8565b61022086015185037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0017f53c102422473590ce12511beab7637e1c33b596a7d58a80ea98463ad78950000176115cc565b5050611547565b60e08101518151516060919060f082901c9060208114611b50576040517f858f2dcf00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604051935060208401601083045f8183535060016008850483018101928391015f80805b88811015611bad5789811c61ffff81165163ffff0000601092831b16811760e01b8786015284019360f08390031b929092179101611b74565b50825117909152878203017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08181018952908801601f01166040525f5b82811015611c2d576002810288016003015161ffff90811683018051602060f082901c019260e09190911c1690611c22838284612ce2565b505050600101611bea565b50505050505050919050565b6060805f611c46846135a7565b90505f5b81811015611c89575f611c5d86836135c1565b60040190505f611c6d87846135f0565b60040282019050611c7f888383613607565b5050600101611c4a565b5083611c94866138c7565b92509250505b9250929050565b5f80808080611cb188888861393c565b985090925090508181036040811115611d455761022089015183037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0017f53c102422473590ce12511beab7637e1c33b596a7d58a80ea98463ad78950000176040517fff2f594900000000000000000000000000000000000000000000000000000000815260040161061191815260200190565b805f03611dcd5761022089015183037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0017f53c102422473590ce12511beab7637e1c33b596a7d58a80ea98463ad78950000176040517fc75cd50900000000000000000000000000000000000000000000000000000000815260040161061191815260200190565b60028106600103611e595761022089015183037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0017f53c102422473590ce12511beab7637e1c33b596a7d58a80ea98463ad78950000176040517fd76d9b5700000000000000000000000000000000000000000000000000000000815260040161061191815260200190565b6001820397505f5b838910611fdc5788515f90811a906001821b906703ff000000000000821615611ead57507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd08201611fa6565b6c7e000000000000000000000000821615611eeb57507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa98201611fa6565b687e0000000000000000821615611f2557507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc98201611fa6565b6102208d01518c037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0017f53c102422473590ce12511beab7637e1c33b596a7d58a80ea98463ad78950000176040517f69f1e3e600000000000000000000000000000000000000000000000000000000815260040161061191815260200190565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff909b019a831b96909617955050600401611e61565b50509350909150505b935093915050565b5f805f805f80611ffd888861398c565b92965090945092509050612012898486613e2b565b8261201d8383613eaf565b9550955050505050935093915050565b5f80808061203c878787613f01565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08301805184840382529199509294509092505f9161207a816140bb565b9190529698969750505050505050565b6001909101905f80836120ae81856fffffffffdffffffffffffffeffffd9ff612525565b9450848181036121395761022087015186037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0017f53c102422473590ce12511beab7637e1c33b596a7d58a80ea98463ad78950000176040517ff73a1aa800000000000000000000000000000000000000000000000000000000815260040161061191815260200190565b612144878787610c11565b95508561216281876fffffffffdfffffffffffffffffffffff612525565b9650868681106121ee5761022089015188037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0017f53c102422473590ce12511beab7637e1c33b596a7d58a80ea98463ad78950000175b6040517fc4b1913500000000000000000000000000000000000000000000000000000000815260040161061191815260200190565b875160015f91821a1b906b2000000000000000000000008216900361225e576102208a015189037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0017f53c102422473590ce12511beab7637e1c33b596a7d58a80ea98463ad78950000176121b9565b506001909701968761201d8a868686866140e7565b60605f825160020267ffffffffffffffff81111561229357612293614d55565b6040519080825280601f01601f1916602001820160405280156122bd576020820181803683370190505b50905061ffff80196020850160208651028101600285015b818310156122f7578051835186169085161781526020909201916002016122d5565b50939695505050505050565b5f815160010361238e575060208101517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8116601b0b60e082901d5f6123468383836142ab565b905061ffff811115612384576040517f7938075c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b9250610239915050565b81515f0361239d57505f919050565b6040517f1ac6690800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f81516002036124a757602082015160408301517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8216601b0b60e083901d5f6124168383836142ab565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8516601b0b935060e085901d925090505f61244f8484836142ab565b905060ff821180612460575060ff81115b15612497576040517f7938075c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60081b1794506102399350505050565b60028251101561239d576040517ff16066b000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f81515f1461251e576040517f9f16b02000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505f919050565b5f5b5f82600186515f1a1b1611838510161561254657600184019350612527565b509192915050565b5f8080600181878703602081116125655780612568565b60205b915050875192505b8519600184841a1b1615818310161561258e57600182019150612570565b9681019660208290036008810293841c90931b9261261057604080516020810185905201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152908290527fe47fe8b700000000000000000000000000000000000000000000000000000000825261061191600401614f96565b5095969095509350505050565b5f806126298484612c02565b909250905081611c9a5750610120830180515f93845260209384902060408051928352948201855293909401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000909316601084901b62ff00001617909317909252909160ff90911660010190565b600182810180515f928392600560ff93909316602102870192830192909101835b8183101561275d5760018301516021909301805190935f90819060ff1681806126e2838e614307565b915091508186165f03612704575f809b509b5050505050505050505050611c9a565b5f87612714600185038916614332565b016004028b015195505062ffffff90811693508416830391506127489050575060019750601c1a9550611c9a945050505050565b61275183614332565b840193505050506126b9565b505f9788975095505050505050565b81516101e08401515f80825291600190831a1b907ffffffffffffffffffffffffffffffffffffffffffffffffff0000000000000008201610e79576127b08561505a565b610100870180517ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe169052805190955060015f91821a1b9250805b8587101561299557865160015f9190911a1b935064010000260084161561281e57612817888888610c11565b96506127eb565b674000000000000000841615612842576128378761505a565b965060019050612995565b6001886101000151165f0361291357600482036128da5761022088015187037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0017f53c102422473590ce12511beab7637e1c33b596a7d58a80ea98463ad78950000176040517f8c9fdbb300000000000000000000000000000000000000000000000000000000815260040161061191815260200190565b5f6128e689898961440a565b60208581028701018190526101008b0180516001179052909850905061290b8361505a565b9250506127eb565b61022088015187037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0017f53c102422473590ce12511beab7637e1c33b596a7d58a80ea98463ad78950000175b6040517f722cd24a00000000000000000000000000000000000000000000000000000000815260040161061191815260200190565b806129eb5761022088015187037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0017f53c102422473590ce12511beab7637e1c33b596a7d58a80ea98463ad7895000017612960565b50905250919392505050565b6101c08201516002828102820101516101e08401515f9261ffff90921691906104a39083565b612a2683614432565b610100830180517ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb1660081790526020808401515f90811a8501602101805190911a60ff811492919060018101825350508115612aaf576040517f8092d1ea00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050825180516060808601515f90811a87016061018051939461ffff8616949093921a60ff81149291600886048503601c0191600181018253505f60038201537fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe30180517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00001690911790528115612b72576040517f3abd0c5e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050602090920183821b176018820185901b178083529160e0829003612bfa5760408051601083901b6020908117601f9092017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016918252810190915281517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000168117825286525b505050505050565b6101208201516101408301515f8381526020808220919384939290911c91600160ff84161b80821615612c675761ffff83165b8015612c65578360201c8503612c58576001965061ffff8460101c169550612c65565b51925061ffff8316612c35565b505b17610140909601959095525090939092509050565b6060818101515f90811a919082900361113d57602083810180515f1a600101919082815350603e8210612cdb576040517fe826b5f600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050505050565b8083835e505050565b6020810283835e505050565b5f8080612d05868686610e83565b9096509250905080612d935761022086015185037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0017f53c102422473590ce12511beab7637e1c33b596a7d58a80ea98463ad78950000175b6040517fb0e4e5b300000000000000000000000000000000000000000000000000000000815260040161061191815260200190565b5f80612d9e846144be565b6101808901511615612ddf5761016088015160101c5b8015801590612dc1575082155b15612ddd57602081015190519085149250600190910190612db4565b505b61016088015161ffff16612e05600184612df95782612dfd565b8383035b8b9190612a1d565b5081612e1557612e1588856144d5565b50949695505050505050565b6060828101515f1a908115612eb15761022084015183037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0017f53c102422473590ce12511beab7637e1c33b596a7d58a80ea98463ad78950000176040517f6fb11cdc00000000000000000000000000000000000000000000000000000000815260040161061191815260200190565b5050612ebc82614432565b61010082018051600416600890811790915260a0830151602084015160ff8083169360f89290921c9290911c1681035f819003612fe6576004856101000151165f03612f835761022085015184037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0017f53c102422473590ce12511beab7637e1c33b596a7d58a80ea98463ad78950000176040517fab1d3ea700000000000000000000000000000000000000000000000000000000815260040161061191815260200190565b90820190603e8210612fc1576040517fe826b5f600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60f882901b6020860152610200850151612fdb9084614527565b610200860152613101565b600181111561310157808310156130785761022085015184037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0017f53c102422473590ce12511beab7637e1c33b596a7d58a80ea98463ad78950000176040517f78ef278200000000000000000000000000000000000000000000000000000000815260040161061191815260200190565b808311156131015761022085015184037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0017f53c102422473590ce12511beab7637e1c33b596a7d58a80ea98463ad78950000176040517f43168e6800000000000000000000000000000000000000000000000000000000815260040161061191815260200190565b8082036001016020601083028101905b818110156132655760a08801516020848a0181015191831c61ffff16915f1a9060015b8281116132535760208406601c0361314d57925160f01c925b83516102008d015160019190911a9061316690826145ab565b6102008e01525f828514801561317c5750896001145b613187576001613189565b8b5b6102008f015190915061319c90826145f1565b6102008f0152600f8111806131b15750600f82115b15613237576102208e01518d037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0017f53c102422473590ce12511beab7637e1c33b596a7d58a80ea98463ad78950000176040517f7ea1869f00000000000000000000000000000000000000000000000000000000815260040161061191815260200190565b818160041b176001870153505060049390930192600101613134565b50506001909401935050601001613111565b5050505060081b60a0909301929092525050565b60e081015160208083015160f083811c925f9290921a60010191908390036132cd576040517fa806284100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610200850151855180515f928392909160219060101c61ffff165b80156132ff57805190925060101c61ffff166132e8565b506040518a82018051919650601c8401939160049160248901915f90811a805b8d8310156133e45760048202860195506004878a03045b8082111561335457965161ffff16601c810199509690036007613336565b506004810298899003805186529894909401938103865b60078211156133b0575160101c61ffff1680518652601c909501947ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff99091019061336b565b81156133cb575160101c61ffff168051865260048202909501945b50505060019182018051909291909101905f1a8061331f565b50505082895250600488810180517fffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9290940491909101601881901b8817939093179052601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660405260ff1094505083156134b0576040517fe972437e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6134bd6001808a1b615091565b891685891b60f06134cf8b601061501a565b901b171760e08b01526101008a0180517ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7169052604080516020601f9091017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01681815280820183525f80517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00001682178152908d52908c01819052908b0181905260608b0181905260808b0181905260a08b018190526101208b018190526101408b018190526102008b015250505050505050505050565b5f81515f036135b757505f919050565b50602001515f1a90565b5f806135cc846135a7565b60020260010190505f6135df8585614664565b949091019093016020019392505050565b5f806135fc84846135c1565b515f1a949350505050565b8082101561113d5781517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0160f882901c016138415760c08401515b801561383f5760a081901c5161016086015161ffff60e085901c1660208101805160089390931b62ffff0016600187901a1760e81b7cffffffffffffffffffffffffffffffffffffffffffffffffffffffffff909316929092179091526040517f570c7a630000000000000000000000000000000000000000000000000000000081529192915f908190819073ffffffffffffffffffffffffffffffffffffffff86169063570c7a63906136fa908790600401614f96565b5f60405180830381865afa158015613714573d5f803e3d5ffd5b505050506040513d5f823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682016040526137599190810190615130565b92509250925082156138355781516004146137a257816040517fbe2d187d0000000000000000000000000000000000000000000000000000000081526004016106119190614f96565b60208201517fffffffff00000000000000000000000000000000000000000000000000000000167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff88161789525f5b815181101561382a5761382282828151811061380b5761380b6151dd565b60200260200101518c6144d590919063ffffffff16565b6001016137ed565b50505050505061383f565b5050505050613642565b505b5081517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0160f882901c016138bb57606061ffff8260e01c1690505f6003820152600581019050806040517faedfba2f0000000000000000000000000000000000000000000000000000000081526004016106119190614f96565b50600482019150613607565b6101608101516040805161ffff8316808252602080820283019081019093529092909160109190911c90835b808211156139335760208301518252915161ffff16917fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0909101906138f3565b50505050919050565b5f80808061394b86600261501a565b9050806c7e0000007e03ff0000000000005b86821081600184515f1a1b161515161561397c5760018201915061395d565b5090979096508695509350505050565b5f8281806139a1838665200000000000612525565b925085831415836139bb81886703ff000000000000612525565b94508085036139f557507f34bd20690000000000000000000000000000000000000000000000000000000094505f9250829150613e229050565b5f80613a018a886146ba565b90925090507fffffffff00000000000000000000000000000000000000000000000000000000821615613a3f575095505f9350839250613e22915050565b86519095506540000000000060015f9290921a9190911b161515888710169150508015613cce57506001909301925f84613a8281896703ff000000000000612525565b9550808603613abd57507f7bfa48af0000000000000000000000000000000000000000000000000000000095505f9350839250613e22915050565b855b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81018051908a1160015f9290921a9190911b660100000000000016151516600103613b2c577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01613abf565b818114613b83575f80613b3f84846146ba565b90925090507fffffffff00000000000000000000000000000000000000000000000000000000821615613b7f575097505f9550859450613e229350505050565b9350505b5f831215613bbe57507f7bfa48af0000000000000000000000000000000000000000000000000000000096505f9450849350613e2292505050565b8315613bca57825f0392505b80820394505f851315613c0a57507f013b2aaa0000000000000000000000000000000000000000000000000000000096505f9450849350613e2292505050565b855f03613c1957829550613ccb565b5f8590036043811115613c5a57507f32b8b8be0000000000000000000000000000000000000000000000000000000097505f9550859450613e229350505050565b600a0a8681025f88838381613c7157613c7161502d565b0514159050601b82900b8214158180613c875750805b15613cc357507f32b8b8be000000000000000000000000000000000000000000000000000000009a505f9850889750613e229650505050505050565b505084019650505b50505b84516c2000000020000000000000000060015f9290921a9190911b161515878610168015613e135760019095019485613d0e818a65200000000000612525565b965086613d24818b6703ff000000000000612525565b9750808803613d6157507f013b2aaa0000000000000000000000000000000000000000000000000000000097505f9550859450613e229350505050565b505f80613d6e838a6146ba565b90925090507fffffffff00000000000000000000000000000000000000000000000000000000821615613dae575097505f9550859450613e229350505050565b9250508482015f83138015613dc257508581125b80613dd657505f83128015613dd657508581135b15613e0f57507fd556b1110000000000000000000000000000000000000000000000000000000097505f9550859450613e229350505050565b9450505b845f03613e1e575f93505b5050505b92959194509250565b7fffffffff0000000000000000000000000000000000000000000000000000000081161561113d576102208301515f9083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0017f53c102422473590ce12511beab7637e1c33b596a7d58a80ea98463ad78950000179050815f528060045260245ffd5b5f805f613ebc85856147e4565b9150915080610731576040517f22c9f7bb0000000000000000000000000000000000000000000000000000000081526004810186905260248101859052604401610611565b5f80806001850181806f7ffffffffffffffffffffffb0000000081807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8b8b0301602080821015613f4f5750805b875193505b84600185851a1b1615158184101615613f7257600183019250613f54565b505080602003613ffd576102208c01518b037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0017f53c102422473590ce12511beab7637e1c33b596a7d58a80ea98463ad78950000176040517f30515bda00000000000000000000000000000000000000000000000000000000815260040161061191815260200190565b85810180519095505f1a6001811b64040000000016158061401d5750858b145b156140a3576102208d015186037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0017f53c102422473590ce12511beab7637e1c33b596a7d58a80ea98463ad78950000176040517f04022fbf00000000000000000000000000000000000000000000000000000000815260040161061191815260200190565b50949b939a505060018a019850919650505050505050565b5f80601f90505f60e09050818451168082175f528060208601600183016020035e50505f519392505050565b5f60608186860361ffff81111561412d576040517fb6da789c00000000000000000000000000000000000000000000000000000000815260048101829052602401610611565b604080516041888803848101838101929092017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01690935260028281018590520181529350602284019250614183898484612ce2565b6141908783850183612ce2565b50505060c08701515b801561425a5760a081901c516040517fc6c0cbb60000000000000000000000000000000000000000000000000000000081529091905f90819073ffffffffffffffffffffffffffffffffffffffff84169063c6c0cbb6906141fe908890600401614f96565b6040805180830381865afa158015614218573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061423c919061520a565b9150915081156142525794506104a39350505050565b505050614199565b61022088015187037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0017f53c102422473590ce12511beab7637e1c33b596a7d58a80ea98463ad7895000017612d5e565b5f805f6142b98686866148ea565b91509150806142fe576040517f05e476780000000000000000000000000000000000000000000000000000000081526004810187905260248101869052604401610611565b50949350505050565b5f80825f528360205360215f2090506001815f1a1b915062ffffff8116611c9a575060019250929050565b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036143635750610100919050565b507f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f7f5555555555555555555555555555555555555555555555555555555555555555600183901c16909103600281901c7f3333333333333333333333333333333333333333333333333333333333333333908116911601600481901c01167f01010101010101010101010101010101010101010101010101010101010101010260f81c90565b5f805f805f61441a888888610e83565b925092509250821561425a579093509150611fe59050565b8051602080830180515f90811a8086016021015160a0939190831a6144845785518488018051600861ffff909316929092046020038801601e83901a840360010160100290811b909217905260f01092505b50508015612cdb576040517f5b1a42d600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f6144cb61010083615234565b6001901b92915050565b6101608201805160408051808201909152601091821c808252602082018590528351600161ffff909116019282901b92909217909252614514836144be565b6101809094018051909417909352505050565b5f61453283836145f1565b925060ff600884901c8116830190811115614579576040517fe826b5f600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff841660089190911b17905092915050565b5f60ff8316828110156145ea576040517f23b49a2a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050900390565b5f60ff808416830190600885901c811690601086901c90831115614641576040517fe826b5f600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8083111561464c5750815b601081901b600883901b841717935050505092915050565b5f61466e836135a7565b82106146aa5781836040517ffcfaeff100000000000000000000000000000000000000000000000000000000815260040161061192919061526c565b50600202016003015161ffff1690565b81515f90819065200000000000600191831a9190911b161515838510168085019082806146e78488614af1565b90925090507fffffffff00000000000000000000000000000000000000000000000000000000821615614722575093505f9250611c9a915050565b825f03614785577f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8111614756575f614778565b7f0fdc2635000000000000000000000000000000000000000000000000000000005b95509350611c9a92505050565b7f800000000000000000000000000000000000000000000000000000000000000081116147b2575f6147d4565b7f0fdc2635000000000000000000000000000000000000000000000000000000005b95505f0393505050509250929050565b5f601b83900b8314838382614848577d90e40fbeea1d3a4abc8955e946fe31cdcf66f634e100000000000000000086051561482857620186a0860595506005850194505b8586601b0b1461484357600a86059550846001019450614828565b61485e565b855f0361485e57505f925060019150611c9a9050565b848560030b146148ba575f85121561487e57505f9250829150611c9a9050565b6040517fd556b1110000000000000000000000000000000000000000000000000000000081526004810183905260248101829052604401610611565b50507bffffffffffffffffffffffffffffffffffffffffffffffffffffffff841660e084901b1791509250929050565b5f805f851215614930576040517f4a7d166b0000000000000000000000000000000000000000000000000000000081526004810186905260248101859052604401610611565b845f0361494257505f90506001611fe5565b8460ff841685018581121561498d576040517fd556b1110000000000000000000000000000000000000000000000000000000081526004810188905260248101879052604401610611565b5f805f8312156149f7577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb38312156149ce575f809550955050505050611fe5565b825f03600a0a91508184816149e5576149e561502d565b0495505084029091149150611fe59050565b5f831315614ae157604d831315614a4d576040517fc849483b000000000000000000000000000000000000000000000000000000008152600481018a90526024810189905260ff88166044820152606401610611565b82600a0a9150817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81614a8257614a8261502d565b04841115614acf576040517fc849483b000000000000000000000000000000000000000000000000000000008152600481018a90526024810189905260ff88166044820152606401610611565b5091909102925060019150611fe59050565b8360019550955050505050611fe5565b5f80828410614b2457507f34bd20690000000000000000000000000000000000000000000000000000000090505f611c9a565b835f03614b5d576040517fda6966d400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60305f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8501815b878210158015614b955750604d83105b15614bd857815160018401937fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90930192600a0a5f9190911a8590030201614b85565b878210614cfe5781515f1a8490036001811115614c2057507f0fdc26350000000000000000000000000000000000000000000000000000000095505f9450611c9a9350505050565b600a84900a8102828101831115614c6357507f0fdc26350000000000000000000000000000000000000000000000000000000096505f9550611c9a945050505050565b9190910190507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff909101905b878210614cfe5781515f1a60308114614cd357507f0fdc26350000000000000000000000000000000000000000000000000000000095505f9450611c9a9350505050565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90910190614c8f565b5f9890975095505050505050565b614d14615284565b565b5f60208284031215614d26575f80fd5b81357fffffffff0000000000000000000000000000000000000000000000000000000081168114610507575f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715614dc957614dc9614d55565b604052919050565b5f67ffffffffffffffff821115614dea57614dea614d55565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b5f60208284031215614e26575f80fd5b813567ffffffffffffffff811115614e3c575f80fd5b8201601f81018413614e4c575f80fd5b8035614e5f614e5a82614dd1565b614d82565b818152856020838501011115614e73575f80fd5b816020840160208301375f91810160200191909152949350505050565b602080825282518282018290528051604084018190525f9291820190839060608601905b80831015614eea57835173ffffffffffffffffffffffffffffffffffffffff168252928401926001929092019190840190614eb4565b509695505050505050565b5f81518084528060208401602086015e5f6020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b604081525f614f536040830185614ef5565b8281036020848101919091528451808352858201928201905f5b81811015614f8957845183529383019391830191600101614f6d565b5090979650505050505050565b602081525f6105076020830184614ef5565b80516020808301519190811015614fe7577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8160200360031b1b821691505b50919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b8082018082111561018057610180614fed565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361508a5761508a614fed565b5060010190565b8181038181111561018057610180614fed565b80518015158114610239575f80fd5b5f82601f8301126150c2575f80fd5b8151602067ffffffffffffffff8211156150de576150de614d55565b8160051b6150ed828201614d82565b9283528481018201928281019087851115615106575f80fd5b83870192505b848310156151255782518252918301919083019061510c565b979650505050505050565b5f805f60608486031215615142575f80fd5b61514b846150a4565b9250602084015167ffffffffffffffff80821115615167575f80fd5b818601915086601f83011261517a575f80fd5b8151615188614e5a82614dd1565b81815288602083860101111561519c575f80fd5b8160208501602083015e5f60208383010152809550505060408601519150808211156151c6575f80fd5b506151d3868287016150b3565b9150509250925092565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f806040838503121561521b575f80fd5b615224836150a4565b9150602083015190509250929050565b5f82615267577f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b500690565b828152604060208201525f610c4d6040830184614ef5565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52605160045260245ffdfe0288400100420b0280046b0641220186adb8a044003012020f2a881521281ac8811a000000000000000000080000000000100000000000000002000000000000000000290ea98a3a10f9c53927bda61c6395ad0e9fb4a8075dbeaf2d313e9e09b06d681dfe49062ce21ac13f83a6cc2ad2d2123422c3e0052f369e1f27267220a0a68d2f3576963b82189e475d217b131120880f24f4a8242f1af54041f7290afa3e8638acf3d13397e9fd00443a453c406bb548b9059d25a3cd1e11d0c3260b15eb4d16fc94274527bc412baf2cc2321b8f630dca9efe413ce35f1400684846c291e3435d68b13e5f9a151eb98c15239cd9c10c1f698235c8d3843d08d579273459d41a2c9ff617a5b2cd15c0031810f621af127ba34c26bb6c4137b2ad3d1b73563d0210215f36aa563921098e690457fb180376e752066a470128f11de101fcc60522de7ddd183d3d6d4296c37031cba2872e7b3af5304eee7219a8093544082b5f0801f5a523032303230323cf24e324e323cf23cf24e323032303230324e324e324e324e324e324e324e324e324e324e324e324e324e324e324e324e324e324e324e324e324e324e324e324e324e324e324e324e324e324e324e324e324e324e324e324e324e324e324e324e324e324e324e324e324e324e324e324e324e324e324e324e324e324e324e324e324e324e324e324e324e3"; /// @dev The runtime bytecode of the contract. bytes constant RUNTIME_CODE = - hex"608060405234801561000f575f80fd5b5060043610610064575f3560e01c80637764fd9c1161004d5780637764fd9c146100b0578063ccf44775146100d1578063d6d8c9a8146100e6575f80fd5b806301ffc9a7146100685780635514ca2014610090575b5f80fd5b61007b610076366004614d0e565b6100ee565b60405190151581526020015b60405180910390f35b6100a361009e366004614e0e565b610186565b6040516100879190614e88565b6100c36100be366004614e0e565b61023e565b604051610087929190614f39565b6100d961025e565b6040516100879190614f8e565b6100d961026d565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082167f1a2c8edd00000000000000000000000000000000000000000000000000000000148061018057507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b92915050565b6040805160208101909152606081525f6101e3836101a2610277565b6101aa61029a565b60408051808201909152600881527f1c991fe52025208200000000000000000000000000000000000000000000000060208201526102ba565b90505f6020840190505f6101fa8580510160200190565b90506102078383836104ac565b915061021483838361050e565b9150604051806020016040528061022a856106db565b90529350505050610239610739565b919050565b606080610255610250846101a2610277565b61077e565b91509150915091565b60606102686108fb565b905090565b6060610268610948565b6060604051806101a0016040528061016381526020016152aa6101639139905090565b60606040518060c001604052806090815260200161540d60909139905090565b6103476040518061026001604052805f81526020015f81526020015f81526020015f81526020015f81526020015f81526020015f80191681526020015f81526020015f81526020015f81526020015f81526020015f81526020015f80191681526020016060815260200160608152602001606081526020015f815260200160608152602001606081525090565b5f6040518061026001604052805f81526020015f81526020015f81526020015f81526020015f81526020015f81526020015f801b81526020015f8152602001600481526020015f81526020015f81526020015f81526020015f801b8152602001848152602001858152602001600467ffffffffffffffff8111156103cd576103cd614d4d565b6040519080825280602002602001820160405280156103f6578160200160208202803683370190505b5081525f602080830182905260408084018b905260609384018a90528051601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016828152808301825283517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00001681178452855290840182905283018190529082018190526080820181905260a082018190526101208201819052610140820181905261020082015290505b95945050505050565b5f5b8183101561050457825160015f9190911a1b6401000026008116156104df576104d8858585610c09565b93506104fe565b658000000000008116156104f8576104d8858585610c4d565b50610504565b506104ae565b50815b9392505050565b815160408051808201909152601081527f7573696e672d776f7264732d66726f6d0000000000000000000000000000000060208201525f919061055090614fa0565b7fffffffffffffffffffffffffffffffff000000000000000000000000000000008216146105815783915050610507565b5060108301925081831061061a5761022084015183037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0017f53c102422473590ce12511beab7637e1c33b596a7d58a80ea98463ad78950000175b6040517fe3e4992d00000000000000000000000000000000000000000000000000000000815260040161061191815260200190565b60405180910390fd5b825160015f91821a1b90640100002600821690036106835761022085015184037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0017f53c102422473590ce12511beab7637e1c33b596a7d58a80ea98463ad78950000176105dc565b836001019350505b818310156105045761069e8484846104ac565b925081831015610504575f806106b5868686610e7b565b9096509092509050816106c9575050610504565b6106d486868361102d565b505061068b565b60c08101516040516060919073ffffffffffffffffffffffffffffffffffffffff602082015f5b841561072357848316825260a09490941c5193602090910190600101610702565b8352604052610731826110ec565b509392505050565b60405162010000811061077b576040517f766c065f00000000000000000000000000000000000000000000000000000000815260048101829052602401610611565b50565b6060805f8361022001515111156108d0575f61079f84610220015160200190565b90505f6107b485610220015180510160200190565b90506107c18583836104ac565b91506107ce85838361050e565b91505b80821015610805576107e48583836104ac565b91506107f185838361113a565b91506107fe85838361153d565b91506107d1565b80821461083e576040517f7d565df600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610100850151600816156108cd5761022085015182037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0017f53c102422473590ce12511beab7637e1c33b596a7d58a80ea98463ad78950000176040517ff06f54cf00000000000000000000000000000000000000000000000000000000815260040161061191815260200190565b50505b5f806108e56108de86611afc565b8690611c31565b915091506108f1610739565b9094909350915050565b6040805160a0810182526004808252611c996020830152611fe592820192909252612025606082810191909152612082608083015291908190805b61093f8161226b565b94505050505090565b6060614d045f604890508091505f6040518061092001604052808467ffffffffffffffff1667ffffffffffffffff1681526020016122fb81526020016122fb81526020016122fb81526020016123c781526020016124db81526020016124db81526020016123c781526020016123c781526020016124db81526020016122fb81526020016122fb81526020016122fb81526020016124db81526020016124db81526020016124db81526020016124db81526020016124db81526020016124db81526020016124db81526020016124db81526020016124db81526020016124db81526020016124db81526020016124db81526020016124db81526020016124db81526020016124db81526020016124db81526020016124db81526020016124db81526020016124db81526020016124db81526020016124db81526020016124db81526020016124db81526020016124db81526020016124db81526020016124db81526020016124db81526020016124db81526020016124db81526020016124db81526020016124db81526020016124db81526020016124db81526020016124db81526020016124db81526020016124db81526020016124db81526020016124db81526020016124db81526020016124db81526020016124db81526020016124db81526020016124db81526020016124db81526020016124db81526020016124db81526020016124db81526020016124db81526020016124db81526020016124db81526020016124db81526020016124db81526020016124db81526020016124db81526020016124db81526020016124db81526020016124db81526020016124db81526020016124db81526020016124db8152509050606081905060488151146109365780516040517fc8b56901000000000000000000000000000000000000000000000000000000008152600481019190915260248101849052604401610611565b610100830180517ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1690525f610c45838364010000260061251d565b949350505050565b6101008301805160011790525f60048301821015610ce75761022084015183037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0017f53c102422473590ce12511beab7637e1c33b596a7d58a80ea98463ad78950000175b6040517f25a7646800000000000000000000000000000000000000000000000000000000815260040161061191815260200190565b825160f01c612f2a8114610d765761022085015184037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0017f53c102422473590ce12511beab7637e1c33b596a7d58a80ea98463ad78950000176040517f3e47169c00000000000000000000000000000000000000000000000000000000815260040161061191815260200190565b6003840193505f5b83851015610e1b5784515f1a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd18101610e0f577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff86015160f01c7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd5d18101610e0d57505050600193840193610e1b565b505b85600101955050610d7e565b80610e715761022086015185037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0017f53c102422473590ce12511beab7637e1c33b596a7d58a80ea98463ad7895000017610cb2565b5092949350505050565b81515f90819081908190600181831a1b6703ff200000000000811615610fa25786610ea7896001615012565b1015610f9957600182811a1b7ffffffffffffffffffffffffffffffffffeffffffffffffffffff00000000000082821701610ee4575f9350610f93565b7ffffffffffffffffffffffffffffffffffffffffffeffffffffff00000000000082821701610f8e576102208a015189037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0017f53c102422473590ce12511beab7637e1c33b596a7d58a80ea98463ad78950000176040517f75c28ff900000000000000000000000000000000000000000000000000000000815260040161061191815260200190565b600193505b50610fe7565b60019250610fe7565b640400000000811615610fb85760029250610fe7565b6b080000000000000000000000811615610fd55760039250610fe7565b505f9450869350849250611024915050565b505f905061101588888861100d83876101a09190910151600291820201015161ffff1690565b63ffffffff16565b90975060019550879450925050505b93509350939050565b73ffffffffffffffffffffffffffffffffffffffff8111156110ca5761022083015182037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0017f53c102422473590ce12511beab7637e1c33b596a7d58a80ea98463ad78950000176040517f9d7e517e00000000000000000000000000000000000000000000000000000000815260040161061191815260200190565b60c09092018051604080516020810190915290815260a01b9290921790915250565b60208101602082510282015b808210156111355781518151835281526020909101907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0016110f8565b505050565b5f5b818310156105045782515f90600190821a1b6f07fffffe8000000000000000000000008116156113b757610100860151600116156111f65761022086015185037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0017f53c102422473590ce12511beab7637e1c33b596a7d58a80ea98463ad78950000175b6040517f5520a51700000000000000000000000000000000000000000000000000000000815260040161061191815260200190565b6f07fffffe0000000000000000000000008116156112c95761122985856f07fffffe0000000003ff200000000000612546565b90955091505f6112398784612615565b50905080156112c35761022087015186037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0017f53c102422473590ce12511beab7637e1c33b596a7d58a80ea98463ad78950000176040517f53e6feba00000000000000000000000000000000000000000000000000000000815260040161061191815260200190565b506112ea565b6112e760018601856f07fffffe0000000003ff20000000000061251d565b94505b856040015160ff1660ff148061130757508560a0015160ff1660ff145b1561138d5761022086015185037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0017f53c102422473590ce12511beab7637e1c33b596a7d58a80ea98463ad78950000176040517f3820634100000000000000000000000000000000000000000000000000000000815260040161061191815260200190565b604086018051600190810190915260a0870180519091019052610100860180516009179052611536565b640100002600811615611409576113d7600186018564010000260061251d565b610100870180517ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1690529450611536565b670400000000000000811615611455575050610100840180516008177ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe16905260019290920191610504565b658000000000008116156114e55761022086015185037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0017f53c102422473590ce12511beab7637e1c33b596a7d58a80ea98463ad78950000175b6040517fedad0c5800000000000000000000000000000000000000000000000000000000815260040161061191815260200190565b61022086015185037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0017f53c102422473590ce12511beab7637e1c33b596a7d58a80ea98463ad78950000176111c1565b505061113c565b5f5b818310156105045782515f90600190821a1b6f07fffffe00000000000000000000000081161561175d57610100860151600116156115f95761022086015185037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0017f53c102422473590ce12511beab7637e1c33b596a7d58a80ea98463ad78950000175b6040517f4e803df600000000000000000000000000000000000000000000000000000000815260040161061191815260200190565b8461161581866f07fffffe0000000003ff200000000000612546565b80945081975050505f8061162e89610240015186612690565b91509150811561166f57611643898989612764565b97505f6116508a836129ef565b905061165d8a8383612a15565b50610100890180516002179052611749565b6116798986612bfa565b9092509050811561169d5761168f895f83612a15565b61169889612c74565b611749565b5f6060848a03600581016116b28d8d8d612764565b9b508c6101e0015151602002602001810190505f60059050604051935060208201840160405282818501528184528394506116fa8860056116f38760200190565b0185612cda565b5050506101e08b015180516001019061172d906117278361171e8680510160200190565b90602002900390565b83612ce3565b5061173a8b60ff84612a15565b50506101008901805160021790525b505050610100860180516001179052611af5565b6101008601516002161561187f576501000000000081165f036117fb5761022086015185037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0017f53c102422473590ce12511beab7637e1c33b596a7d58a80ea98463ad78950000176040517f23b5c6ea00000000000000000000000000000000000000000000000000000000815260040161061191815260200190565b606086810180515f1a6003019190829053603b821115611847576040517f6232f2d900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050610100860180517ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc169052600190940193611af5565b6502000000000081161561195b576060868101515f90811a91908290036119215761022088015187037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0017f53c102422473590ce12511beab7637e1c33b596a7d58a80ea98463ad78950000176040517f7f9db54200000000000000000000000000000000000000000000000000000000815260040161061191815260200190565b808801600383039250828153826004820101515f1a8360028301015160f01c600101535061194e88612c74565b5050600190940193611af5565b6401000026008116156119ad5761197b600186018564010000260061251d565b610100870180517ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1690529450611af5565b6b0800000003ff2004000000008116156119e8576119cc868686612cef565b94506119d786612c74565b610100860180516001179052611af5565b65100000000000811615611a0d57611a008686612e19565b5050600190920191610504565b670800000000000000811615611a4557611a278686612e19565b611a3086613271565b50506004610100850152600190920191610504565b65800000000000811615611aa45761022086015185037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0017f53c102422473590ce12511beab7637e1c33b596a7d58a80ea98463ad78950000176114b0565b61022086015185037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0017f53c102422473590ce12511beab7637e1c33b596a7d58a80ea98463ad78950000176115c4565b505061153f565b60e08101518151516060919060f082901c9060208114611b48576040517f858f2dcf00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604051935060208401601083045f8183535060016008850483018101928391015f80805b88811015611ba55789811c61ffff81165163ffff0000601092831b16811760e01b8786015284019360f08390031b929092179101611b6c565b50825117909152878203017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08181018952908801601f01166040525f5b82811015611c25576002810288016003015161ffff90811683018051602060f082901c019260e09190911c1690611c1a838284612cda565b505050600101611be2565b50505050505050919050565b6060805f611c3e8461359f565b90505f5b81811015611c81575f611c5586836135b9565b60040190505f611c6587846135e8565b60040282019050611c778883836135ff565b5050600101611c42565b5083611c8c866138bf565b92509250505b9250929050565b5f80808080611ca9888888613934565b985090925090508181036040811115611d3d5761022089015183037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0017f53c102422473590ce12511beab7637e1c33b596a7d58a80ea98463ad78950000176040517fff2f594900000000000000000000000000000000000000000000000000000000815260040161061191815260200190565b805f03611dc55761022089015183037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0017f53c102422473590ce12511beab7637e1c33b596a7d58a80ea98463ad78950000176040517fc75cd50900000000000000000000000000000000000000000000000000000000815260040161061191815260200190565b60028106600103611e515761022089015183037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0017f53c102422473590ce12511beab7637e1c33b596a7d58a80ea98463ad78950000176040517fd76d9b5700000000000000000000000000000000000000000000000000000000815260040161061191815260200190565b6001820397505f5b838910611fd45788515f90811a906001821b906703ff000000000000821615611ea557507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd08201611f9e565b6c7e000000000000000000000000821615611ee357507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa98201611f9e565b687e0000000000000000821615611f1d57507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc98201611f9e565b6102208d01518c037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0017f53c102422473590ce12511beab7637e1c33b596a7d58a80ea98463ad78950000176040517f69f1e3e600000000000000000000000000000000000000000000000000000000815260040161061191815260200190565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff909b019a831b96909617955050600401611e59565b50509350909150505b935093915050565b5f805f805f80611ff58888613984565b9296509094509250905061200a898486613e23565b826120158383613ea7565b9550955050505050935093915050565b5f808080612034878787613ef9565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08301805184840382529199509294509092505f91612072816140b3565b9190529698969750505050505050565b6001909101905f80836120a681856fffffffffdffffffffffffffeffffd9ff61251d565b9450848181036121315761022087015186037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0017f53c102422473590ce12511beab7637e1c33b596a7d58a80ea98463ad78950000176040517ff73a1aa800000000000000000000000000000000000000000000000000000000815260040161061191815260200190565b61213c878787610c09565b95508561215a81876fffffffffdfffffffffffffffffffffff61251d565b9650868681106121e65761022089015188037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0017f53c102422473590ce12511beab7637e1c33b596a7d58a80ea98463ad78950000175b6040517fc4b1913500000000000000000000000000000000000000000000000000000000815260040161061191815260200190565b875160015f91821a1b906b20000000000000000000000082169003612256576102208a015189037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0017f53c102422473590ce12511beab7637e1c33b596a7d58a80ea98463ad78950000176121b1565b50600190970196876120158a868686866140df565b60605f825160020267ffffffffffffffff81111561228b5761228b614d4d565b6040519080825280601f01601f1916602001820160405280156122b5576020820181803683370190505b50905061ffff80196020850160208651028101600285015b818310156122ef578051835186169085161781526020909201916002016122cd565b50939695505050505050565b5f8151600103612386575060208101517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8116601b0b60e082901d5f61233e8383836142a3565b905061ffff81111561237c576040517f7938075c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b9250610239915050565b81515f0361239557505f919050565b6040517f1ac6690800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f815160020361249f57602082015160408301517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8216601b0b60e083901d5f61240e8383836142a3565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8516601b0b935060e085901d925090505f6124478484836142a3565b905060ff821180612458575060ff81115b1561248f576040517f7938075c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60081b1794506102399350505050565b600282511015612395576040517ff16066b000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f81515f14612516576040517f9f16b02000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505f919050565b5f5b5f82600186515f1a1b1611838510161561253e5760018401935061251f565b509192915050565b5f80806001818787036020811161255d5780612560565b60205b915050875192505b8519600184841a1b1615818310161561258657600182019150612568565b9681019660208290036008810293841c90931b9261260857604080516020810185905201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152908290527fe47fe8b700000000000000000000000000000000000000000000000000000000825261061191600401614f8e565b5095969095509350505050565b5f806126218484612bfa565b909250905081611c925750610120830180515f93845260209384902060408051928352948201855293909401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000909316601084901b62ff00001617909317909252909160ff90911660010190565b600182810180515f928392600560ff93909316602102870192830192909101835b818310156127555760018301516021909301805190935f90819060ff1681806126da838e6142ff565b915091508186165f036126fc575f809b509b5050505050505050505050611c92565b5f8761270c60018503891661432a565b016004028b015195505062ffffff90811693508416830391506127409050575060019750601c1a9550611c92945050505050565b6127498361432a565b840193505050506126b1565b505f9788975095505050505050565b81516101e08401515f80825291600190831a1b907ffffffffffffffffffffffffffffffffffffffffffffffffff0000000000000008201610e71576127a885615052565b610100870180517ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe169052805190955060015f91821a1b9250805b8587101561298d57865160015f9190911a1b93506401000026008416156128165761280f888888610c09565b96506127e3565b67400000000000000084161561283a5761282f87615052565b96506001905061298d565b6001886101000151165f0361290b57600482036128d25761022088015187037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0017f53c102422473590ce12511beab7637e1c33b596a7d58a80ea98463ad78950000176040517f8c9fdbb300000000000000000000000000000000000000000000000000000000815260040161061191815260200190565b5f6128de898989614402565b60208581028701018190526101008b0180516001179052909850905061290383615052565b9250506127e3565b61022088015187037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0017f53c102422473590ce12511beab7637e1c33b596a7d58a80ea98463ad78950000175b6040517f722cd24a00000000000000000000000000000000000000000000000000000000815260040161061191815260200190565b806129e35761022088015187037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0017f53c102422473590ce12511beab7637e1c33b596a7d58a80ea98463ad7895000017612958565b50905250919392505050565b6101c08201516002828102820101516101e08401515f9261ffff90921691906104a39083565b612a1e8361442a565b610100830180517ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb1660081790526020808401515f90811a8501602101805190911a60ff811492919060018101825350508115612aa7576040517f8092d1ea00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050825180516060808601515f90811a87016061018051939461ffff8616949093921a60ff81149291600886048503601c0191600181018253505f60038201537fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe30180517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00001690911790528115612b6a576040517f3abd0c5e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050602090920183821b176018820185901b178083529160e0829003612bf25760408051601083901b6020908117601f9092017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016918252810190915281517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000168117825286525b505050505050565b6101208201516101408301515f8381526020808220919384939290911c91600160ff84161b80821615612c5f5761ffff83165b8015612c5d578360201c8503612c50576001965061ffff8460101c169550612c5d565b51925061ffff8316612c2d565b505b17610140909601959095525090939092509050565b6060818101515f90811a919082900361113557602083810180515f1a600101919082815350603e8210612cd3576040517fe826b5f600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050505050565b8083835e505050565b6020810283835e505050565b5f8080612cfd868686610e7b565b9096509250905080612d8b5761022086015185037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0017f53c102422473590ce12511beab7637e1c33b596a7d58a80ea98463ad78950000175b6040517fb0e4e5b300000000000000000000000000000000000000000000000000000000815260040161061191815260200190565b5f80612d96846144b6565b6101808901511615612dd75761016088015160101c5b8015801590612db9575082155b15612dd557602081015190519085149250600190910190612dac565b505b61016088015161ffff16612dfd600184612df15782612df5565b8383035b8b9190612a15565b5081612e0d57612e0d88856144cd565b50949695505050505050565b6060828101515f1a908115612ea95761022084015183037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0017f53c102422473590ce12511beab7637e1c33b596a7d58a80ea98463ad78950000176040517f6fb11cdc00000000000000000000000000000000000000000000000000000000815260040161061191815260200190565b5050612eb48261442a565b61010082018051600416600890811790915260a0830151602084015160ff8083169360f89290921c9290911c1681035f819003612fde576004856101000151165f03612f7b5761022085015184037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0017f53c102422473590ce12511beab7637e1c33b596a7d58a80ea98463ad78950000176040517fab1d3ea700000000000000000000000000000000000000000000000000000000815260040161061191815260200190565b90820190603e8210612fb9576040517fe826b5f600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60f882901b6020860152610200850151612fd3908461451f565b6102008601526130f9565b60018111156130f957808310156130705761022085015184037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0017f53c102422473590ce12511beab7637e1c33b596a7d58a80ea98463ad78950000176040517f78ef278200000000000000000000000000000000000000000000000000000000815260040161061191815260200190565b808311156130f95761022085015184037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0017f53c102422473590ce12511beab7637e1c33b596a7d58a80ea98463ad78950000176040517f43168e6800000000000000000000000000000000000000000000000000000000815260040161061191815260200190565b8082036001016020601083028101905b8181101561325d5760a08801516020848a0181015191831c61ffff16915f1a9060015b82811161324b5760208406601c0361314557925160f01c925b83516102008d015160019190911a9061315e90826145a3565b6102008e01525f82851480156131745750896001145b61317f576001613181565b8b5b6102008f015190915061319490826145e9565b6102008f0152600f8111806131a95750600f82115b1561322f576102208e01518d037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0017f53c102422473590ce12511beab7637e1c33b596a7d58a80ea98463ad78950000176040517f7ea1869f00000000000000000000000000000000000000000000000000000000815260040161061191815260200190565b818160041b17600187015350506004939093019260010161312c565b50506001909401935050601001613109565b5050505060081b60a0909301929092525050565b60e081015160208083015160f083811c925f9290921a60010191908390036132c5576040517fa806284100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610200850151855180515f928392909160219060101c61ffff165b80156132f757805190925060101c61ffff166132e0565b506040518a82018051919650601c8401939160049160248901915f90811a805b8d8310156133dc5760048202860195506004878a03045b8082111561334c57965161ffff16601c81019950969003600761332e565b506004810298899003805186529894909401938103865b60078211156133a8575160101c61ffff1680518652601c909501947ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff990910190613363565b81156133c3575160101c61ffff168051865260048202909501945b50505060019182018051909291909101905f1a80613317565b50505082895250600488810180517fffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9290940491909101601881901b8817939093179052601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660405260ff1094505083156134a8576040517fe972437e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6134b56001808a1b615089565b891685891b60f06134c78b6010615012565b901b171760e08b01526101008a0180517ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7169052604080516020601f9091017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01681815280820183525f80517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00001682178152908d52908c01819052908b0181905260608b0181905260808b0181905260a08b018190526101208b018190526101408b018190526102008b015250505050505050505050565b5f81515f036135af57505f919050565b50602001515f1a90565b5f806135c48461359f565b60020260010190505f6135d7858561465c565b949091019093016020019392505050565b5f806135f484846135b9565b515f1a949350505050565b808210156111355781517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0160f882901c016138395760c08401515b80156138375760a081901c5161016086015161ffff60e085901c1660208101805160089390931b62ffff0016600187901a1760e81b7cffffffffffffffffffffffffffffffffffffffffffffffffffffffffff909316929092179091526040517f570c7a630000000000000000000000000000000000000000000000000000000081529192915f908190819073ffffffffffffffffffffffffffffffffffffffff86169063570c7a63906136f2908790600401614f8e565b5f60405180830381865afa15801561370c573d5f803e3d5ffd5b505050506040513d5f823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682016040526137519190810190615128565b925092509250821561382d57815160041461379a57816040517fbe2d187d0000000000000000000000000000000000000000000000000000000081526004016106119190614f8e565b60208201517fffffffff00000000000000000000000000000000000000000000000000000000167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff88161789525f5b81518110156138225761381a828281518110613803576138036151d5565b60200260200101518c6144cd90919063ffffffff16565b6001016137e5565b505050505050613837565b505050505061363a565b505b5081517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0160f882901c016138b357606061ffff8260e01c1690505f6003820152600581019050806040517faedfba2f0000000000000000000000000000000000000000000000000000000081526004016106119190614f8e565b506004820191506135ff565b6101608101516040805161ffff8316808252602080820283019081019093529092909160109190911c90835b8082111561392b5760208301518252915161ffff16917fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0909101906138eb565b50505050919050565b5f808080613943866002615012565b9050806c7e0000007e03ff0000000000005b86821081600184515f1a1b161515161561397457600182019150613955565b5090979096508695509350505050565b5f82818061399983866520000000000061251d565b925085831415836139b381886703ff00000000000061251d565b94508085036139ed57507f34bd20690000000000000000000000000000000000000000000000000000000094505f9250829150613e1a9050565b5f806139f98a886146b2565b90925090507fffffffff00000000000000000000000000000000000000000000000000000000821615613a37575095505f9350839250613e1a915050565b86519095506540000000000060015f9290921a9190911b161515888710169150508015613cc657506001909301925f84613a7a81896703ff00000000000061251d565b9550808603613ab557507f7bfa48af0000000000000000000000000000000000000000000000000000000095505f9350839250613e1a915050565b855b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81018051908a1160015f9290921a9190911b660100000000000016151516600103613b24577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01613ab7565b818114613b7b575f80613b3784846146b2565b90925090507fffffffff00000000000000000000000000000000000000000000000000000000821615613b77575097505f9550859450613e1a9350505050565b9350505b5f831215613bb657507f7bfa48af0000000000000000000000000000000000000000000000000000000096505f9450849350613e1a92505050565b8315613bc257825f0392505b80820394505f851315613c0257507f013b2aaa0000000000000000000000000000000000000000000000000000000096505f9450849350613e1a92505050565b855f03613c1157829550613cc3565b5f8590036043811115613c5257507f32b8b8be0000000000000000000000000000000000000000000000000000000097505f9550859450613e1a9350505050565b600a0a8681025f88838381613c6957613c69615025565b0514159050601b82900b8214158180613c7f5750805b15613cbb57507f32b8b8be000000000000000000000000000000000000000000000000000000009a505f9850889750613e1a9650505050505050565b505084019650505b50505b84516c2000000020000000000000000060015f9290921a9190911b161515878610168015613e0b5760019095019485613d06818a6520000000000061251d565b965086613d1c818b6703ff00000000000061251d565b9750808803613d5957507f013b2aaa0000000000000000000000000000000000000000000000000000000097505f9550859450613e1a9350505050565b505f80613d66838a6146b2565b90925090507fffffffff00000000000000000000000000000000000000000000000000000000821615613da6575097505f9550859450613e1a9350505050565b9250508482015f83138015613dba57508581125b80613dce57505f83128015613dce57508581135b15613e0757507fd556b1110000000000000000000000000000000000000000000000000000000097505f9550859450613e1a9350505050565b9450505b845f03613e16575f93505b5050505b92959194509250565b7fffffffff00000000000000000000000000000000000000000000000000000000811615611135576102208301515f9083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0017f53c102422473590ce12511beab7637e1c33b596a7d58a80ea98463ad78950000179050815f528060045260245ffd5b5f805f613eb485856147dc565b9150915080610731576040517f22c9f7bb0000000000000000000000000000000000000000000000000000000081526004810186905260248101859052604401610611565b5f80806001850181806f7ffffffffffffffffffffffb0000000081807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8b8b0301602080821015613f475750805b875193505b84600185851a1b1615158184101615613f6a57600183019250613f4c565b505080602003613ff5576102208c01518b037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0017f53c102422473590ce12511beab7637e1c33b596a7d58a80ea98463ad78950000176040517f30515bda00000000000000000000000000000000000000000000000000000000815260040161061191815260200190565b85810180519095505f1a6001811b6404000000001615806140155750858b145b1561409b576102208d015186037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0017f53c102422473590ce12511beab7637e1c33b596a7d58a80ea98463ad78950000176040517f04022fbf00000000000000000000000000000000000000000000000000000000815260040161061191815260200190565b50949b939a505060018a019850919650505050505050565b5f80601f90505f60e09050818451168082175f528060208601600183016020035e50505f519392505050565b5f60608186860361ffff811115614125576040517fb6da789c00000000000000000000000000000000000000000000000000000000815260048101829052602401610611565b604080516041888803848101838101929092017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169093526002828101859052018152935060228401925061417b898484612cda565b6141888783850183612cda565b50505060c08701515b80156142525760a081901c516040517fc6c0cbb60000000000000000000000000000000000000000000000000000000081529091905f90819073ffffffffffffffffffffffffffffffffffffffff84169063c6c0cbb6906141f6908890600401614f8e565b6040805180830381865afa158015614210573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906142349190615202565b91509150811561424a5794506104a39350505050565b505050614191565b61022088015187037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0017f53c102422473590ce12511beab7637e1c33b596a7d58a80ea98463ad7895000017612d56565b5f805f6142b18686866148e2565b91509150806142f6576040517f05e476780000000000000000000000000000000000000000000000000000000081526004810187905260248101869052604401610611565b50949350505050565b5f80825f528360205360215f2090506001815f1a1b915062ffffff8116611c92575060019250929050565b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361435b5750610100919050565b507f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f7f5555555555555555555555555555555555555555555555555555555555555555600183901c16909103600281901c7f3333333333333333333333333333333333333333333333333333333333333333908116911601600481901c01167f01010101010101010101010101010101010101010101010101010101010101010260f81c90565b5f805f805f614412888888610e7b565b9250925092508215614252579093509150611fdd9050565b8051602080830180515f90811a8086016021015160a0939190831a61447c5785518488018051600861ffff909316929092046020038801601e83901a840360010160100290811b909217905260f01092505b50508015612cd3576040517f5b1a42d600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f6144c36101008361522c565b6001901b92915050565b6101608201805160408051808201909152601091821c808252602082018590528351600161ffff909116019282901b9290921790925261450c836144b6565b6101809094018051909417909352505050565b5f61452a83836145e9565b925060ff600884901c8116830190811115614571576040517fe826b5f600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff841660089190911b17905092915050565b5f60ff8316828110156145e2576040517f23b49a2a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050900390565b5f60ff808416830190600885901c811690601086901c90831115614639576040517fe826b5f600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b808311156146445750815b601081901b600883901b841717935050505092915050565b5f6146668361359f565b82106146a25781836040517ffcfaeff1000000000000000000000000000000000000000000000000000000008152600401610611929190615264565b50600202016003015161ffff1690565b81515f90819065200000000000600191831a9190911b161515838510168085019082806146df8488614ae9565b90925090507fffffffff0000000000000000000000000000000000000000000000000000000082161561471a575093505f9250611c92915050565b825f0361477d577f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811161474e575f614770565b7f0fdc2635000000000000000000000000000000000000000000000000000000005b95509350611c9292505050565b7f800000000000000000000000000000000000000000000000000000000000000081116147aa575f6147cc565b7f0fdc2635000000000000000000000000000000000000000000000000000000005b95505f0393505050509250929050565b5f601b83900b8314838382614840577d90e40fbeea1d3a4abc8955e946fe31cdcf66f634e100000000000000000086051561482057620186a0860595506005850194505b8586601b0b1461483b57600a86059550846001019450614820565b614856565b855f0361485657505f925060019150611c929050565b848560030b146148b2575f85121561487657505f9250829150611c929050565b6040517fd556b1110000000000000000000000000000000000000000000000000000000081526004810183905260248101829052604401610611565b50507bffffffffffffffffffffffffffffffffffffffffffffffffffffffff841660e084901b1791509250929050565b5f805f851215614928576040517f4a7d166b0000000000000000000000000000000000000000000000000000000081526004810186905260248101859052604401610611565b845f0361493a57505f90506001611fdd565b8460ff8416850185811215614985576040517fd556b1110000000000000000000000000000000000000000000000000000000081526004810188905260248101879052604401610611565b5f805f8312156149ef577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb38312156149c6575f809550955050505050611fdd565b825f03600a0a91508184816149dd576149dd615025565b0495505084029091149150611fdd9050565b5f831315614ad957604d831315614a45576040517fc849483b000000000000000000000000000000000000000000000000000000008152600481018a90526024810189905260ff88166044820152606401610611565b82600a0a9150817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81614a7a57614a7a615025565b04841115614ac7576040517fc849483b000000000000000000000000000000000000000000000000000000008152600481018a90526024810189905260ff88166044820152606401610611565b5091909102925060019150611fdd9050565b8360019550955050505050611fdd565b5f80828410614b1c57507f34bd20690000000000000000000000000000000000000000000000000000000090505f611c92565b835f03614b55576040517fda6966d400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60305f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8501815b878210158015614b8d5750604d83105b15614bd057815160018401937fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90930192600a0a5f9190911a8590030201614b7d565b878210614cf65781515f1a8490036001811115614c1857507f0fdc26350000000000000000000000000000000000000000000000000000000095505f9450611c929350505050565b600a84900a8102828101831115614c5b57507f0fdc26350000000000000000000000000000000000000000000000000000000096505f9550611c92945050505050565b9190910190507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff909101905b878210614cf65781515f1a60308114614ccb57507f0fdc26350000000000000000000000000000000000000000000000000000000095505f9450611c929350505050565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90910190614c87565b5f9890975095505050505050565b614d0c61527c565b565b5f60208284031215614d1e575f80fd5b81357fffffffff0000000000000000000000000000000000000000000000000000000081168114610507575f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715614dc157614dc1614d4d565b604052919050565b5f67ffffffffffffffff821115614de257614de2614d4d565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b5f60208284031215614e1e575f80fd5b813567ffffffffffffffff811115614e34575f80fd5b8201601f81018413614e44575f80fd5b8035614e57614e5282614dc9565b614d7a565b818152856020838501011115614e6b575f80fd5b816020840160208301375f91810160200191909152949350505050565b602080825282518282018290528051604084018190525f9291820190839060608601905b80831015614ee257835173ffffffffffffffffffffffffffffffffffffffff168252928401926001929092019190840190614eac565b509695505050505050565b5f81518084528060208401602086015e5f6020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b604081525f614f4b6040830185614eed565b8281036020848101919091528451808352858201928201905f5b81811015614f8157845183529383019391830191600101614f65565b5090979650505050505050565b602081525f6105076020830184614eed565b80516020808301519190811015614fdf577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8160200360031b1b821691505b50919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b8082018082111561018057610180614fe5565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361508257615082614fe5565b5060010190565b8181038181111561018057610180614fe5565b80518015158114610239575f80fd5b5f82601f8301126150ba575f80fd5b8151602067ffffffffffffffff8211156150d6576150d6614d4d565b8160051b6150e5828201614d7a565b92835284810182019282810190878511156150fe575f80fd5b83870192505b8483101561511d57825182529183019190830190615104565b979650505050505050565b5f805f6060848603121561513a575f80fd5b6151438461509c565b9250602084015167ffffffffffffffff8082111561515f575f80fd5b818601915086601f830112615172575f80fd5b8151615180614e5282614dc9565b818152886020838601011115615194575f80fd5b8160208501602083015e5f60208383010152809550505060408601519150808211156151be575f80fd5b506151cb868287016150ab565b9150509250925092565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f8060408385031215615213575f80fd5b61521c8361509c565b9150602083015190509250929050565b5f8261525f577f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b500690565b828152604060208201525f610c456040830184614eed565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52605160045260245ffdfe0288400100420b0280046b0641220186adb8a044003012020f2a880521281ac8811a000000000000000000080000000000100000000000000002000000000000000000290ea98a3a10f9c53927bda61c6395ad0e9fb4a8075dbeaf2d313e9e09b06d681dfe49062ce21ac13e83a6cc2ad2d2123422c3e0052f369e1f27267220a0a68d2f357696465d217b131120880f24f4a8242f1af53f41f7290afa3e8638acf3d13397e9fd00443a453b406bb547b9059d25a3cd1e11d0c3260b15eb4d16fc94274427bc412baf2cc2321b8f630dca9efe403ce35f1400684845c291e3425d68b13d5f9a151eb98c15239cd9c10c1f698235c8d3843c08d579273459d41a2c9ff617a5b2cd15c0031810f621af127ba34c26bb6c4137b2ad3d1b73563d0210215f36aa563921098e690457fb180376e752066a470128f11de101fcc60522de7ddd183d3d6d4196c37031cba2872e7b3af5304eee7219a8093543082b5f0801f5a522fb22fb22fb23c724db24db23c723c724db22fb22fb22fb24db24db24db24db24db24db24db24db24db24db24db24db24db24db24db24db24db24db24db24db24db24db24db24db24db24db24db24db24db24db24db24db24db24db24db24db24db24db24db24db24db24db24db24db24db24db24db24db24db24db24db24db24db24db24db24db24db24db24db24db"; + hex"608060405234801561000f575f80fd5b5060043610610064575f3560e01c80637764fd9c1161004d5780637764fd9c146100b0578063ccf44775146100d1578063d6d8c9a8146100e6575f80fd5b806301ffc9a7146100685780635514ca2014610090575b5f80fd5b61007b610076366004614d16565b6100ee565b60405190151581526020015b60405180910390f35b6100a361009e366004614e16565b610186565b6040516100879190614e90565b6100c36100be366004614e16565b61023e565b604051610087929190614f41565b6100d961025e565b6040516100879190614f96565b6100d961026d565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082167f1a2c8edd00000000000000000000000000000000000000000000000000000000148061018057507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b92915050565b6040805160208101909152606081525f6101e3836101a2610277565b6101aa61029a565b60408051808201909152600881527f1ca11fed202d208a00000000000000000000000000000000000000000000000060208201526102ba565b90505f6020840190505f6101fa8580510160200190565b90506102078383836104ac565b915061021483838361050e565b9150604051806020016040528061022a856106db565b90529350505050610239610739565b919050565b606080610255610250846101a2610277565b61077e565b91509150915091565b60606102686108fb565b905090565b6060610268610948565b6060604051806101a0016040528061016781526020016152b26101679139905090565b60606040518060c001604052806092815260200161541960929139905090565b6103476040518061026001604052805f81526020015f81526020015f81526020015f81526020015f81526020015f81526020015f80191681526020015f81526020015f81526020015f81526020015f81526020015f81526020015f80191681526020016060815260200160608152602001606081526020015f815260200160608152602001606081525090565b5f6040518061026001604052805f81526020015f81526020015f81526020015f81526020015f81526020015f81526020015f801b81526020015f8152602001600481526020015f81526020015f81526020015f81526020015f801b8152602001848152602001858152602001600467ffffffffffffffff8111156103cd576103cd614d55565b6040519080825280602002602001820160405280156103f6578160200160208202803683370190505b5081525f602080830182905260408084018b905260609384018a90528051601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016828152808301825283517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00001681178452855290840182905283018190529082018190526080820181905260a082018190526101208201819052610140820181905261020082015290505b95945050505050565b5f5b8183101561050457825160015f9190911a1b6401000026008116156104df576104d8858585610c11565b93506104fe565b658000000000008116156104f8576104d8858585610c55565b50610504565b506104ae565b50815b9392505050565b815160408051808201909152601081527f7573696e672d776f7264732d66726f6d0000000000000000000000000000000060208201525f919061055090614fa8565b7fffffffffffffffffffffffffffffffff000000000000000000000000000000008216146105815783915050610507565b5060108301925081831061061a5761022084015183037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0017f53c102422473590ce12511beab7637e1c33b596a7d58a80ea98463ad78950000175b6040517fe3e4992d00000000000000000000000000000000000000000000000000000000815260040161061191815260200190565b60405180910390fd5b825160015f91821a1b90640100002600821690036106835761022085015184037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0017f53c102422473590ce12511beab7637e1c33b596a7d58a80ea98463ad78950000176105dc565b836001019350505b818310156105045761069e8484846104ac565b925081831015610504575f806106b5868686610e83565b9096509092509050816106c9575050610504565b6106d4868683611035565b505061068b565b60c08101516040516060919073ffffffffffffffffffffffffffffffffffffffff602082015f5b841561072357848316825260a09490941c5193602090910190600101610702565b8352604052610731826110f4565b509392505050565b60405162010000811061077b576040517f766c065f00000000000000000000000000000000000000000000000000000000815260048101829052602401610611565b50565b6060805f8361022001515111156108d0575f61079f84610220015160200190565b90505f6107b485610220015180510160200190565b90506107c18583836104ac565b91506107ce85838361050e565b91505b80821015610805576107e48583836104ac565b91506107f1858383611142565b91506107fe858383611545565b91506107d1565b80821461083e576040517f7d565df600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610100850151600816156108cd5761022085015182037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0017f53c102422473590ce12511beab7637e1c33b596a7d58a80ea98463ad78950000176040517ff06f54cf00000000000000000000000000000000000000000000000000000000815260040161061191815260200190565b50505b5f806108e56108de86611b04565b8690611c39565b915091506108f1610739565b9094909350915050565b6040805160a0810182526004808252611ca16020830152611fed9282019290925261202d60608281019190915261208a608083015291908190805b61093f81612273565b94505050505090565b6060614d0c5f604990508091505f6040518061094001604052808467ffffffffffffffff1667ffffffffffffffff1681526020016123038152602001612303815260200161230381526020016123cf81526020016124e381526020016124e381526020016123cf81526020016123cf81526020016124e381526020016123038152602001612303815260200161230381526020016124e381526020016124e381526020016124e381526020016124e381526020016124e381526020016124e381526020016124e381526020016124e381526020016124e381526020016124e381526020016124e381526020016124e381526020016124e381526020016124e381526020016124e381526020016124e381526020016124e381526020016124e381526020016124e381526020016124e381526020016124e381526020016124e381526020016124e381526020016124e381526020016124e381526020016124e381526020016124e381526020016124e381526020016124e381526020016124e381526020016124e381526020016124e381526020016124e381526020016124e381526020016124e381526020016124e381526020016124e381526020016124e381526020016124e381526020016124e381526020016124e381526020016124e381526020016124e381526020016124e381526020016124e381526020016124e381526020016124e381526020016124e381526020016124e381526020016124e381526020016124e381526020016124e381526020016124e381526020016124e381526020016124e381526020016124e381526020016124e381526020016124e381526020016124e381526020016124e381526020016124e38152509050606081905060498151146109365780516040517fc8b56901000000000000000000000000000000000000000000000000000000008152600481019190915260248101849052604401610611565b610100830180517ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1690525f610c4d8383640100002600612525565b949350505050565b6101008301805160011790525f60048301821015610cef5761022084015183037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0017f53c102422473590ce12511beab7637e1c33b596a7d58a80ea98463ad78950000175b6040517f25a7646800000000000000000000000000000000000000000000000000000000815260040161061191815260200190565b825160f01c612f2a8114610d7e5761022085015184037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0017f53c102422473590ce12511beab7637e1c33b596a7d58a80ea98463ad78950000176040517f3e47169c00000000000000000000000000000000000000000000000000000000815260040161061191815260200190565b6003840193505f5b83851015610e235784515f1a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd18101610e17577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff86015160f01c7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd5d18101610e1557505050600193840193610e23565b505b85600101955050610d86565b80610e795761022086015185037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0017f53c102422473590ce12511beab7637e1c33b596a7d58a80ea98463ad7895000017610cba565b5092949350505050565b81515f90819081908190600181831a1b6703ff200000000000811615610faa5786610eaf89600161501a565b1015610fa157600182811a1b7ffffffffffffffffffffffffffffffffffeffffffffffffffffff00000000000082821701610eec575f9350610f9b565b7ffffffffffffffffffffffffffffffffffffffffffeffffffffff00000000000082821701610f96576102208a015189037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0017f53c102422473590ce12511beab7637e1c33b596a7d58a80ea98463ad78950000176040517f75c28ff900000000000000000000000000000000000000000000000000000000815260040161061191815260200190565b600193505b50610fef565b60019250610fef565b640400000000811615610fc05760029250610fef565b6b080000000000000000000000811615610fdd5760039250610fef565b505f945086935084925061102c915050565b505f905061101d88888861101583876101a09190910151600291820201015161ffff1690565b63ffffffff16565b90975060019550879450925050505b93509350939050565b73ffffffffffffffffffffffffffffffffffffffff8111156110d25761022083015182037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0017f53c102422473590ce12511beab7637e1c33b596a7d58a80ea98463ad78950000176040517f9d7e517e00000000000000000000000000000000000000000000000000000000815260040161061191815260200190565b60c09092018051604080516020810190915290815260a01b9290921790915250565b60208101602082510282015b8082101561113d5781518151835281526020909101907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001611100565b505050565b5f5b818310156105045782515f90600190821a1b6f07fffffe8000000000000000000000008116156113bf57610100860151600116156111fe5761022086015185037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0017f53c102422473590ce12511beab7637e1c33b596a7d58a80ea98463ad78950000175b6040517f5520a51700000000000000000000000000000000000000000000000000000000815260040161061191815260200190565b6f07fffffe0000000000000000000000008116156112d15761123185856f07fffffe0000000003ff20000000000061254e565b90955091505f611241878461261d565b50905080156112cb5761022087015186037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0017f53c102422473590ce12511beab7637e1c33b596a7d58a80ea98463ad78950000176040517f53e6feba00000000000000000000000000000000000000000000000000000000815260040161061191815260200190565b506112f2565b6112ef60018601856f07fffffe0000000003ff200000000000612525565b94505b856040015160ff1660ff148061130f57508560a0015160ff1660ff145b156113955761022086015185037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0017f53c102422473590ce12511beab7637e1c33b596a7d58a80ea98463ad78950000176040517f3820634100000000000000000000000000000000000000000000000000000000815260040161061191815260200190565b604086018051600190810190915260a087018051909101905261010086018051600917905261153e565b640100002600811615611411576113df6001860185640100002600612525565b610100870180517ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe169052945061153e565b67040000000000000081161561145d575050610100840180516008177ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe16905260019290920191610504565b658000000000008116156114ed5761022086015185037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0017f53c102422473590ce12511beab7637e1c33b596a7d58a80ea98463ad78950000175b6040517fedad0c5800000000000000000000000000000000000000000000000000000000815260040161061191815260200190565b61022086015185037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0017f53c102422473590ce12511beab7637e1c33b596a7d58a80ea98463ad78950000176111c9565b5050611144565b5f5b818310156105045782515f90600190821a1b6f07fffffe00000000000000000000000081161561176557610100860151600116156116015761022086015185037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0017f53c102422473590ce12511beab7637e1c33b596a7d58a80ea98463ad78950000175b6040517f4e803df600000000000000000000000000000000000000000000000000000000815260040161061191815260200190565b8461161d81866f07fffffe0000000003ff20000000000061254e565b80945081975050505f8061163689610240015186612698565b9150915081156116775761164b89898961276c565b97505f6116588a836129f7565b90506116658a8383612a1d565b50610100890180516002179052611751565b6116818986612c02565b909250905081156116a557611697895f83612a1d565b6116a089612c7c565b611751565b5f6060848a03600581016116ba8d8d8d61276c565b9b508c6101e0015151602002602001810190505f60059050604051935060208201840160405282818501528184528394506117028860056116fb8760200190565b0185612ce2565b5050506101e08b01518051600101906117359061172f836117268680510160200190565b90602002900390565b83612ceb565b506117428b60ff84612a1d565b50506101008901805160021790525b505050610100860180516001179052611afd565b61010086015160021615611887576501000000000081165f036118035761022086015185037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0017f53c102422473590ce12511beab7637e1c33b596a7d58a80ea98463ad78950000176040517f23b5c6ea00000000000000000000000000000000000000000000000000000000815260040161061191815260200190565b606086810180515f1a6003019190829053603b82111561184f576040517f6232f2d900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050610100860180517ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc169052600190940193611afd565b65020000000000811615611963576060868101515f90811a91908290036119295761022088015187037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0017f53c102422473590ce12511beab7637e1c33b596a7d58a80ea98463ad78950000176040517f7f9db54200000000000000000000000000000000000000000000000000000000815260040161061191815260200190565b808801600383039250828153826004820101515f1a8360028301015160f01c600101535061195688612c7c565b5050600190940193611afd565b6401000026008116156119b5576119836001860185640100002600612525565b610100870180517ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1690529450611afd565b6b0800000003ff2004000000008116156119f0576119d4868686612cf7565b94506119df86612c7c565b610100860180516001179052611afd565b65100000000000811615611a1557611a088686612e21565b5050600190920191610504565b670800000000000000811615611a4d57611a2f8686612e21565b611a3886613279565b50506004610100850152600190920191610504565b65800000000000811615611aac5761022086015185037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0017f53c102422473590ce12511beab7637e1c33b596a7d58a80ea98463ad78950000176114b8565b61022086015185037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0017f53c102422473590ce12511beab7637e1c33b596a7d58a80ea98463ad78950000176115cc565b5050611547565b60e08101518151516060919060f082901c9060208114611b50576040517f858f2dcf00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604051935060208401601083045f8183535060016008850483018101928391015f80805b88811015611bad5789811c61ffff81165163ffff0000601092831b16811760e01b8786015284019360f08390031b929092179101611b74565b50825117909152878203017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08181018952908801601f01166040525f5b82811015611c2d576002810288016003015161ffff90811683018051602060f082901c019260e09190911c1690611c22838284612ce2565b505050600101611bea565b50505050505050919050565b6060805f611c46846135a7565b90505f5b81811015611c89575f611c5d86836135c1565b60040190505f611c6d87846135f0565b60040282019050611c7f888383613607565b5050600101611c4a565b5083611c94866138c7565b92509250505b9250929050565b5f80808080611cb188888861393c565b985090925090508181036040811115611d455761022089015183037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0017f53c102422473590ce12511beab7637e1c33b596a7d58a80ea98463ad78950000176040517fff2f594900000000000000000000000000000000000000000000000000000000815260040161061191815260200190565b805f03611dcd5761022089015183037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0017f53c102422473590ce12511beab7637e1c33b596a7d58a80ea98463ad78950000176040517fc75cd50900000000000000000000000000000000000000000000000000000000815260040161061191815260200190565b60028106600103611e595761022089015183037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0017f53c102422473590ce12511beab7637e1c33b596a7d58a80ea98463ad78950000176040517fd76d9b5700000000000000000000000000000000000000000000000000000000815260040161061191815260200190565b6001820397505f5b838910611fdc5788515f90811a906001821b906703ff000000000000821615611ead57507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd08201611fa6565b6c7e000000000000000000000000821615611eeb57507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa98201611fa6565b687e0000000000000000821615611f2557507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc98201611fa6565b6102208d01518c037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0017f53c102422473590ce12511beab7637e1c33b596a7d58a80ea98463ad78950000176040517f69f1e3e600000000000000000000000000000000000000000000000000000000815260040161061191815260200190565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff909b019a831b96909617955050600401611e61565b50509350909150505b935093915050565b5f805f805f80611ffd888861398c565b92965090945092509050612012898486613e2b565b8261201d8383613eaf565b9550955050505050935093915050565b5f80808061203c878787613f01565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08301805184840382529199509294509092505f9161207a816140bb565b9190529698969750505050505050565b6001909101905f80836120ae81856fffffffffdffffffffffffffeffffd9ff612525565b9450848181036121395761022087015186037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0017f53c102422473590ce12511beab7637e1c33b596a7d58a80ea98463ad78950000176040517ff73a1aa800000000000000000000000000000000000000000000000000000000815260040161061191815260200190565b612144878787610c11565b95508561216281876fffffffffdfffffffffffffffffffffff612525565b9650868681106121ee5761022089015188037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0017f53c102422473590ce12511beab7637e1c33b596a7d58a80ea98463ad78950000175b6040517fc4b1913500000000000000000000000000000000000000000000000000000000815260040161061191815260200190565b875160015f91821a1b906b2000000000000000000000008216900361225e576102208a015189037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0017f53c102422473590ce12511beab7637e1c33b596a7d58a80ea98463ad78950000176121b9565b506001909701968761201d8a868686866140e7565b60605f825160020267ffffffffffffffff81111561229357612293614d55565b6040519080825280601f01601f1916602001820160405280156122bd576020820181803683370190505b50905061ffff80196020850160208651028101600285015b818310156122f7578051835186169085161781526020909201916002016122d5565b50939695505050505050565b5f815160010361238e575060208101517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8116601b0b60e082901d5f6123468383836142ab565b905061ffff811115612384576040517f7938075c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b9250610239915050565b81515f0361239d57505f919050565b6040517f1ac6690800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f81516002036124a757602082015160408301517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8216601b0b60e083901d5f6124168383836142ab565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8516601b0b935060e085901d925090505f61244f8484836142ab565b905060ff821180612460575060ff81115b15612497576040517f7938075c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60081b1794506102399350505050565b60028251101561239d576040517ff16066b000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f81515f1461251e576040517f9f16b02000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505f919050565b5f5b5f82600186515f1a1b1611838510161561254657600184019350612527565b509192915050565b5f8080600181878703602081116125655780612568565b60205b915050875192505b8519600184841a1b1615818310161561258e57600182019150612570565b9681019660208290036008810293841c90931b9261261057604080516020810185905201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152908290527fe47fe8b700000000000000000000000000000000000000000000000000000000825261061191600401614f96565b5095969095509350505050565b5f806126298484612c02565b909250905081611c9a5750610120830180515f93845260209384902060408051928352948201855293909401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000909316601084901b62ff00001617909317909252909160ff90911660010190565b600182810180515f928392600560ff93909316602102870192830192909101835b8183101561275d5760018301516021909301805190935f90819060ff1681806126e2838e614307565b915091508186165f03612704575f809b509b5050505050505050505050611c9a565b5f87612714600185038916614332565b016004028b015195505062ffffff90811693508416830391506127489050575060019750601c1a9550611c9a945050505050565b61275183614332565b840193505050506126b9565b505f9788975095505050505050565b81516101e08401515f80825291600190831a1b907ffffffffffffffffffffffffffffffffffffffffffffffffff0000000000000008201610e79576127b08561505a565b610100870180517ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe169052805190955060015f91821a1b9250805b8587101561299557865160015f9190911a1b935064010000260084161561281e57612817888888610c11565b96506127eb565b674000000000000000841615612842576128378761505a565b965060019050612995565b6001886101000151165f0361291357600482036128da5761022088015187037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0017f53c102422473590ce12511beab7637e1c33b596a7d58a80ea98463ad78950000176040517f8c9fdbb300000000000000000000000000000000000000000000000000000000815260040161061191815260200190565b5f6128e689898961440a565b60208581028701018190526101008b0180516001179052909850905061290b8361505a565b9250506127eb565b61022088015187037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0017f53c102422473590ce12511beab7637e1c33b596a7d58a80ea98463ad78950000175b6040517f722cd24a00000000000000000000000000000000000000000000000000000000815260040161061191815260200190565b806129eb5761022088015187037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0017f53c102422473590ce12511beab7637e1c33b596a7d58a80ea98463ad7895000017612960565b50905250919392505050565b6101c08201516002828102820101516101e08401515f9261ffff90921691906104a39083565b612a2683614432565b610100830180517ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb1660081790526020808401515f90811a8501602101805190911a60ff811492919060018101825350508115612aaf576040517f8092d1ea00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050825180516060808601515f90811a87016061018051939461ffff8616949093921a60ff81149291600886048503601c0191600181018253505f60038201537fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe30180517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00001690911790528115612b72576040517f3abd0c5e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050602090920183821b176018820185901b178083529160e0829003612bfa5760408051601083901b6020908117601f9092017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016918252810190915281517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000168117825286525b505050505050565b6101208201516101408301515f8381526020808220919384939290911c91600160ff84161b80821615612c675761ffff83165b8015612c65578360201c8503612c58576001965061ffff8460101c169550612c65565b51925061ffff8316612c35565b505b17610140909601959095525090939092509050565b6060818101515f90811a919082900361113d57602083810180515f1a600101919082815350603e8210612cdb576040517fe826b5f600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050505050565b8083835e505050565b6020810283835e505050565b5f8080612d05868686610e83565b9096509250905080612d935761022086015185037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0017f53c102422473590ce12511beab7637e1c33b596a7d58a80ea98463ad78950000175b6040517fb0e4e5b300000000000000000000000000000000000000000000000000000000815260040161061191815260200190565b5f80612d9e846144be565b6101808901511615612ddf5761016088015160101c5b8015801590612dc1575082155b15612ddd57602081015190519085149250600190910190612db4565b505b61016088015161ffff16612e05600184612df95782612dfd565b8383035b8b9190612a1d565b5081612e1557612e1588856144d5565b50949695505050505050565b6060828101515f1a908115612eb15761022084015183037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0017f53c102422473590ce12511beab7637e1c33b596a7d58a80ea98463ad78950000176040517f6fb11cdc00000000000000000000000000000000000000000000000000000000815260040161061191815260200190565b5050612ebc82614432565b61010082018051600416600890811790915260a0830151602084015160ff8083169360f89290921c9290911c1681035f819003612fe6576004856101000151165f03612f835761022085015184037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0017f53c102422473590ce12511beab7637e1c33b596a7d58a80ea98463ad78950000176040517fab1d3ea700000000000000000000000000000000000000000000000000000000815260040161061191815260200190565b90820190603e8210612fc1576040517fe826b5f600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60f882901b6020860152610200850151612fdb9084614527565b610200860152613101565b600181111561310157808310156130785761022085015184037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0017f53c102422473590ce12511beab7637e1c33b596a7d58a80ea98463ad78950000176040517f78ef278200000000000000000000000000000000000000000000000000000000815260040161061191815260200190565b808311156131015761022085015184037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0017f53c102422473590ce12511beab7637e1c33b596a7d58a80ea98463ad78950000176040517f43168e6800000000000000000000000000000000000000000000000000000000815260040161061191815260200190565b8082036001016020601083028101905b818110156132655760a08801516020848a0181015191831c61ffff16915f1a9060015b8281116132535760208406601c0361314d57925160f01c925b83516102008d015160019190911a9061316690826145ab565b6102008e01525f828514801561317c5750896001145b613187576001613189565b8b5b6102008f015190915061319c90826145f1565b6102008f0152600f8111806131b15750600f82115b15613237576102208e01518d037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0017f53c102422473590ce12511beab7637e1c33b596a7d58a80ea98463ad78950000176040517f7ea1869f00000000000000000000000000000000000000000000000000000000815260040161061191815260200190565b818160041b176001870153505060049390930192600101613134565b50506001909401935050601001613111565b5050505060081b60a0909301929092525050565b60e081015160208083015160f083811c925f9290921a60010191908390036132cd576040517fa806284100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610200850151855180515f928392909160219060101c61ffff165b80156132ff57805190925060101c61ffff166132e8565b506040518a82018051919650601c8401939160049160248901915f90811a805b8d8310156133e45760048202860195506004878a03045b8082111561335457965161ffff16601c810199509690036007613336565b506004810298899003805186529894909401938103865b60078211156133b0575160101c61ffff1680518652601c909501947ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff99091019061336b565b81156133cb575160101c61ffff168051865260048202909501945b50505060019182018051909291909101905f1a8061331f565b50505082895250600488810180517fffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9290940491909101601881901b8817939093179052601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660405260ff1094505083156134b0576040517fe972437e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6134bd6001808a1b615091565b891685891b60f06134cf8b601061501a565b901b171760e08b01526101008a0180517ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7169052604080516020601f9091017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01681815280820183525f80517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00001682178152908d52908c01819052908b0181905260608b0181905260808b0181905260a08b018190526101208b018190526101408b018190526102008b015250505050505050505050565b5f81515f036135b757505f919050565b50602001515f1a90565b5f806135cc846135a7565b60020260010190505f6135df8585614664565b949091019093016020019392505050565b5f806135fc84846135c1565b515f1a949350505050565b8082101561113d5781517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0160f882901c016138415760c08401515b801561383f5760a081901c5161016086015161ffff60e085901c1660208101805160089390931b62ffff0016600187901a1760e81b7cffffffffffffffffffffffffffffffffffffffffffffffffffffffffff909316929092179091526040517f570c7a630000000000000000000000000000000000000000000000000000000081529192915f908190819073ffffffffffffffffffffffffffffffffffffffff86169063570c7a63906136fa908790600401614f96565b5f60405180830381865afa158015613714573d5f803e3d5ffd5b505050506040513d5f823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682016040526137599190810190615130565b92509250925082156138355781516004146137a257816040517fbe2d187d0000000000000000000000000000000000000000000000000000000081526004016106119190614f96565b60208201517fffffffff00000000000000000000000000000000000000000000000000000000167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff88161789525f5b815181101561382a5761382282828151811061380b5761380b6151dd565b60200260200101518c6144d590919063ffffffff16565b6001016137ed565b50505050505061383f565b5050505050613642565b505b5081517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0160f882901c016138bb57606061ffff8260e01c1690505f6003820152600581019050806040517faedfba2f0000000000000000000000000000000000000000000000000000000081526004016106119190614f96565b50600482019150613607565b6101608101516040805161ffff8316808252602080820283019081019093529092909160109190911c90835b808211156139335760208301518252915161ffff16917fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0909101906138f3565b50505050919050565b5f80808061394b86600261501a565b9050806c7e0000007e03ff0000000000005b86821081600184515f1a1b161515161561397c5760018201915061395d565b5090979096508695509350505050565b5f8281806139a1838665200000000000612525565b925085831415836139bb81886703ff000000000000612525565b94508085036139f557507f34bd20690000000000000000000000000000000000000000000000000000000094505f9250829150613e229050565b5f80613a018a886146ba565b90925090507fffffffff00000000000000000000000000000000000000000000000000000000821615613a3f575095505f9350839250613e22915050565b86519095506540000000000060015f9290921a9190911b161515888710169150508015613cce57506001909301925f84613a8281896703ff000000000000612525565b9550808603613abd57507f7bfa48af0000000000000000000000000000000000000000000000000000000095505f9350839250613e22915050565b855b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81018051908a1160015f9290921a9190911b660100000000000016151516600103613b2c577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01613abf565b818114613b83575f80613b3f84846146ba565b90925090507fffffffff00000000000000000000000000000000000000000000000000000000821615613b7f575097505f9550859450613e229350505050565b9350505b5f831215613bbe57507f7bfa48af0000000000000000000000000000000000000000000000000000000096505f9450849350613e2292505050565b8315613bca57825f0392505b80820394505f851315613c0a57507f013b2aaa0000000000000000000000000000000000000000000000000000000096505f9450849350613e2292505050565b855f03613c1957829550613ccb565b5f8590036043811115613c5a57507f32b8b8be0000000000000000000000000000000000000000000000000000000097505f9550859450613e229350505050565b600a0a8681025f88838381613c7157613c7161502d565b0514159050601b82900b8214158180613c875750805b15613cc357507f32b8b8be000000000000000000000000000000000000000000000000000000009a505f9850889750613e229650505050505050565b505084019650505b50505b84516c2000000020000000000000000060015f9290921a9190911b161515878610168015613e135760019095019485613d0e818a65200000000000612525565b965086613d24818b6703ff000000000000612525565b9750808803613d6157507f013b2aaa0000000000000000000000000000000000000000000000000000000097505f9550859450613e229350505050565b505f80613d6e838a6146ba565b90925090507fffffffff00000000000000000000000000000000000000000000000000000000821615613dae575097505f9550859450613e229350505050565b9250508482015f83138015613dc257508581125b80613dd657505f83128015613dd657508581135b15613e0f57507fd556b1110000000000000000000000000000000000000000000000000000000097505f9550859450613e229350505050565b9450505b845f03613e1e575f93505b5050505b92959194509250565b7fffffffff0000000000000000000000000000000000000000000000000000000081161561113d576102208301515f9083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0017f53c102422473590ce12511beab7637e1c33b596a7d58a80ea98463ad78950000179050815f528060045260245ffd5b5f805f613ebc85856147e4565b9150915080610731576040517f22c9f7bb0000000000000000000000000000000000000000000000000000000081526004810186905260248101859052604401610611565b5f80806001850181806f7ffffffffffffffffffffffb0000000081807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8b8b0301602080821015613f4f5750805b875193505b84600185851a1b1615158184101615613f7257600183019250613f54565b505080602003613ffd576102208c01518b037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0017f53c102422473590ce12511beab7637e1c33b596a7d58a80ea98463ad78950000176040517f30515bda00000000000000000000000000000000000000000000000000000000815260040161061191815260200190565b85810180519095505f1a6001811b64040000000016158061401d5750858b145b156140a3576102208d015186037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0017f53c102422473590ce12511beab7637e1c33b596a7d58a80ea98463ad78950000176040517f04022fbf00000000000000000000000000000000000000000000000000000000815260040161061191815260200190565b50949b939a505060018a019850919650505050505050565b5f80601f90505f60e09050818451168082175f528060208601600183016020035e50505f519392505050565b5f60608186860361ffff81111561412d576040517fb6da789c00000000000000000000000000000000000000000000000000000000815260048101829052602401610611565b604080516041888803848101838101929092017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01690935260028281018590520181529350602284019250614183898484612ce2565b6141908783850183612ce2565b50505060c08701515b801561425a5760a081901c516040517fc6c0cbb60000000000000000000000000000000000000000000000000000000081529091905f90819073ffffffffffffffffffffffffffffffffffffffff84169063c6c0cbb6906141fe908890600401614f96565b6040805180830381865afa158015614218573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061423c919061520a565b9150915081156142525794506104a39350505050565b505050614199565b61022088015187037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0017f53c102422473590ce12511beab7637e1c33b596a7d58a80ea98463ad7895000017612d5e565b5f805f6142b98686866148ea565b91509150806142fe576040517f05e476780000000000000000000000000000000000000000000000000000000081526004810187905260248101869052604401610611565b50949350505050565b5f80825f528360205360215f2090506001815f1a1b915062ffffff8116611c9a575060019250929050565b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036143635750610100919050565b507f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f7f5555555555555555555555555555555555555555555555555555555555555555600183901c16909103600281901c7f3333333333333333333333333333333333333333333333333333333333333333908116911601600481901c01167f01010101010101010101010101010101010101010101010101010101010101010260f81c90565b5f805f805f61441a888888610e83565b925092509250821561425a579093509150611fe59050565b8051602080830180515f90811a8086016021015160a0939190831a6144845785518488018051600861ffff909316929092046020038801601e83901a840360010160100290811b909217905260f01092505b50508015612cdb576040517f5b1a42d600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f6144cb61010083615234565b6001901b92915050565b6101608201805160408051808201909152601091821c808252602082018590528351600161ffff909116019282901b92909217909252614514836144be565b6101809094018051909417909352505050565b5f61453283836145f1565b925060ff600884901c8116830190811115614579576040517fe826b5f600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff841660089190911b17905092915050565b5f60ff8316828110156145ea576040517f23b49a2a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050900390565b5f60ff808416830190600885901c811690601086901c90831115614641576040517fe826b5f600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8083111561464c5750815b601081901b600883901b841717935050505092915050565b5f61466e836135a7565b82106146aa5781836040517ffcfaeff100000000000000000000000000000000000000000000000000000000815260040161061192919061526c565b50600202016003015161ffff1690565b81515f90819065200000000000600191831a9190911b161515838510168085019082806146e78488614af1565b90925090507fffffffff00000000000000000000000000000000000000000000000000000000821615614722575093505f9250611c9a915050565b825f03614785577f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8111614756575f614778565b7f0fdc2635000000000000000000000000000000000000000000000000000000005b95509350611c9a92505050565b7f800000000000000000000000000000000000000000000000000000000000000081116147b2575f6147d4565b7f0fdc2635000000000000000000000000000000000000000000000000000000005b95505f0393505050509250929050565b5f601b83900b8314838382614848577d90e40fbeea1d3a4abc8955e946fe31cdcf66f634e100000000000000000086051561482857620186a0860595506005850194505b8586601b0b1461484357600a86059550846001019450614828565b61485e565b855f0361485e57505f925060019150611c9a9050565b848560030b146148ba575f85121561487e57505f9250829150611c9a9050565b6040517fd556b1110000000000000000000000000000000000000000000000000000000081526004810183905260248101829052604401610611565b50507bffffffffffffffffffffffffffffffffffffffffffffffffffffffff841660e084901b1791509250929050565b5f805f851215614930576040517f4a7d166b0000000000000000000000000000000000000000000000000000000081526004810186905260248101859052604401610611565b845f0361494257505f90506001611fe5565b8460ff841685018581121561498d576040517fd556b1110000000000000000000000000000000000000000000000000000000081526004810188905260248101879052604401610611565b5f805f8312156149f7577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb38312156149ce575f809550955050505050611fe5565b825f03600a0a91508184816149e5576149e561502d565b0495505084029091149150611fe59050565b5f831315614ae157604d831315614a4d576040517fc849483b000000000000000000000000000000000000000000000000000000008152600481018a90526024810189905260ff88166044820152606401610611565b82600a0a9150817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81614a8257614a8261502d565b04841115614acf576040517fc849483b000000000000000000000000000000000000000000000000000000008152600481018a90526024810189905260ff88166044820152606401610611565b5091909102925060019150611fe59050565b8360019550955050505050611fe5565b5f80828410614b2457507f34bd20690000000000000000000000000000000000000000000000000000000090505f611c9a565b835f03614b5d576040517fda6966d400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60305f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8501815b878210158015614b955750604d83105b15614bd857815160018401937fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90930192600a0a5f9190911a8590030201614b85565b878210614cfe5781515f1a8490036001811115614c2057507f0fdc26350000000000000000000000000000000000000000000000000000000095505f9450611c9a9350505050565b600a84900a8102828101831115614c6357507f0fdc26350000000000000000000000000000000000000000000000000000000096505f9550611c9a945050505050565b9190910190507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff909101905b878210614cfe5781515f1a60308114614cd357507f0fdc26350000000000000000000000000000000000000000000000000000000095505f9450611c9a9350505050565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90910190614c8f565b5f9890975095505050505050565b614d14615284565b565b5f60208284031215614d26575f80fd5b81357fffffffff0000000000000000000000000000000000000000000000000000000081168114610507575f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715614dc957614dc9614d55565b604052919050565b5f67ffffffffffffffff821115614dea57614dea614d55565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b5f60208284031215614e26575f80fd5b813567ffffffffffffffff811115614e3c575f80fd5b8201601f81018413614e4c575f80fd5b8035614e5f614e5a82614dd1565b614d82565b818152856020838501011115614e73575f80fd5b816020840160208301375f91810160200191909152949350505050565b602080825282518282018290528051604084018190525f9291820190839060608601905b80831015614eea57835173ffffffffffffffffffffffffffffffffffffffff168252928401926001929092019190840190614eb4565b509695505050505050565b5f81518084528060208401602086015e5f6020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b604081525f614f536040830185614ef5565b8281036020848101919091528451808352858201928201905f5b81811015614f8957845183529383019391830191600101614f6d565b5090979650505050505050565b602081525f6105076020830184614ef5565b80516020808301519190811015614fe7577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8160200360031b1b821691505b50919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b8082018082111561018057610180614fed565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361508a5761508a614fed565b5060010190565b8181038181111561018057610180614fed565b80518015158114610239575f80fd5b5f82601f8301126150c2575f80fd5b8151602067ffffffffffffffff8211156150de576150de614d55565b8160051b6150ed828201614d82565b9283528481018201928281019087851115615106575f80fd5b83870192505b848310156151255782518252918301919083019061510c565b979650505050505050565b5f805f60608486031215615142575f80fd5b61514b846150a4565b9250602084015167ffffffffffffffff80821115615167575f80fd5b818601915086601f83011261517a575f80fd5b8151615188614e5a82614dd1565b81815288602083860101111561519c575f80fd5b8160208501602083015e5f60208383010152809550505060408601519150808211156151c6575f80fd5b506151d3868287016150b3565b9150509250925092565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f806040838503121561521b575f80fd5b615224836150a4565b9150602083015190509250929050565b5f82615267577f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b500690565b828152604060208201525f610c4d6040830184614ef5565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52605160045260245ffdfe0288400100420b0280046b0641220186adb8a044003012020f2a881521281ac8811a000000000000000000080000000000100000000000000002000000000000000000290ea98a3a10f9c53927bda61c6395ad0e9fb4a8075dbeaf2d313e9e09b06d681dfe49062ce21ac13f83a6cc2ad2d2123422c3e0052f369e1f27267220a0a68d2f3576963b82189e475d217b131120880f24f4a8242f1af54041f7290afa3e8638acf3d13397e9fd00443a453c406bb548b9059d25a3cd1e11d0c3260b15eb4d16fc94274527bc412baf2cc2321b8f630dca9efe413ce35f1400684846c291e3435d68b13e5f9a151eb98c15239cd9c10c1f698235c8d3843d08d579273459d41a2c9ff617a5b2cd15c0031810f621af127ba34c26bb6c4137b2ad3d1b73563d0210215f36aa563921098e690457fb180376e752066a470128f11de101fcc60522de7ddd183d3d6d4296c37031cba2872e7b3af5304eee7219a8093544082b5f0801f5a523032303230323cf24e324e323cf23cf24e323032303230324e324e324e324e324e324e324e324e324e324e324e324e324e324e324e324e324e324e324e324e324e324e324e324e324e324e324e324e324e324e324e324e324e324e324e324e324e324e324e324e324e324e324e324e324e324e324e324e324e324e324e324e324e324e324e324e324e324e324e324e324e3"; /// @dev The parse meta that is used to lookup word definitions. /// The structure of the parse meta is: @@ -41,7 +41,7 @@ bytes constant RUNTIME_CODE = /// 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"0288400100420b0280046b0641220186adb8a044003012020f2a880521281ac8811a000000000000000000080000000000100000000000000002000000000000000000290ea98a3a10f9c53927bda61c6395ad0e9fb4a8075dbeaf2d313e9e09b06d681dfe49062ce21ac13e83a6cc2ad2d2123422c3e0052f369e1f27267220a0a68d2f357696465d217b131120880f24f4a8242f1af53f41f7290afa3e8638acf3d13397e9fd00443a453b406bb547b9059d25a3cd1e11d0c3260b15eb4d16fc94274427bc412baf2cc2321b8f630dca9efe403ce35f1400684845c291e3425d68b13d5f9a151eb98c15239cd9c10c1f698235c8d3843c08d579273459d41a2c9ff617a5b2cd15c0031810f621af127ba34c26bb6c4137b2ad3d1b73563d0210215f36aa563921098e690457fb180376e752066a470128f11de101fcc60522de7ddd183d3d6d4196c37031cba2872e7b3af5304eee7219a8093543082b5f0801f5a5"; + hex"0288400100420b0280046b0641220186adb8a044003012020f2a881521281ac8811a000000000000000000080000000000100000000000000002000000000000000000290ea98a3a10f9c53927bda61c6395ad0e9fb4a8075dbeaf2d313e9e09b06d681dfe49062ce21ac13f83a6cc2ad2d2123422c3e0052f369e1f27267220a0a68d2f3576963b82189e475d217b131120880f24f4a8242f1af54041f7290afa3e8638acf3d13397e9fd00443a453c406bb548b9059d25a3cd1e11d0c3260b15eb4d16fc94274527bc412baf2cc2321b8f630dca9efe413ce35f1400684846c291e3435d68b13e5f9a151eb98c15239cd9c10c1f698235c8d3843d08d579273459d41a2c9ff617a5b2cd15c0031810f621af127ba34c26bb6c4137b2ad3d1b73563d0210215f36aa563921098e690457fb180376e752066a470128f11de101fcc60522de7ddd183d3d6d4296c37031cba2872e7b3af5304eee7219a8093544082b5f0801f5a5"; /// @dev The build depth of the parser meta. @@ -51,11 +51,11 @@ uint8 constant PARSE_META_BUILD_DEPTH = 2; /// These positional indexes all map to the same indexes looked up in the parse /// meta. bytes constant OPERAND_HANDLER_FUNCTION_POINTERS = - hex"22fb22fb22fb23c724db24db23c723c724db22fb22fb22fb24db24db24db24db24db24db24db24db24db24db24db24db24db24db24db24db24db24db24db24db24db24db24db24db24db24db24db24db24db24db24db24db24db24db24db24db24db24db24db24db24db24db24db24db24db24db24db24db24db24db24db24db24db24db24db24db24db24db24db24db"; + hex"23032303230323cf24e324e323cf23cf24e323032303230324e324e324e324e324e324e324e324e324e324e324e324e324e324e324e324e324e324e324e324e324e324e324e324e324e324e324e324e324e324e324e324e324e324e324e324e324e324e324e324e324e324e324e324e324e324e324e324e324e324e324e324e324e324e324e324e324e324e324e324e324e3"; /// @dev Every two bytes is a function pointer for a literal parser. /// Literal dispatches are determined by the first byte(s) of the literal /// rather than a full word lookup, and are done with simple conditional /// jumps as the possibilities are limited compared to the number of words we /// have. -bytes constant LITERAL_PARSER_FUNCTION_POINTERS = hex"1c991fe520252082"; +bytes constant LITERAL_PARSER_FUNCTION_POINTERS = hex"1ca11fed202d208a"; diff --git a/src/lib/op/LibAllStandardOps.sol b/src/lib/op/LibAllStandardOps.sol index ac28d0865..c600b8970 100644 --- a/src/lib/op/LibAllStandardOps.sol +++ b/src/lib/op/LibAllStandardOps.sol @@ -78,6 +78,7 @@ import {LibOpMin} from "./math/LibOpMin.sol"; import {LibOpMinNegativeValue} from "./math/LibOpMinNegativeValue.sol"; import {LibOpMinPositiveValue} from "./math/LibOpMinPositiveValue.sol"; import {LibOpMul} from "./math/LibOpMul.sol"; +import {LibOpPi} from "./math/LibOpPi.sol"; import {LibOpPower} from "./math/LibOpPower.sol"; import {LibOpSqrt} from "./math/LibOpSqrt.sol"; import {LibOpSub} from "./math/LibOpSub.sol"; @@ -102,7 +103,7 @@ import {LibParseLiteralHex} from "../parse/literal/LibParseLiteralHex.sol"; import {LibParseLiteralSubParseable} from "../parse/literal/LibParseLiteralSubParseable.sol"; /// @dev Number of ops currently provided by `AllStandardOps`. -uint256 constant ALL_STANDARD_OPS_LENGTH = 72; +uint256 constant ALL_STANDARD_OPS_LENGTH = 73; /// @title LibAllStandardOps /// @notice Every opcode available from the core repository laid out as a single @@ -287,6 +288,7 @@ library LibAllStandardOps { "The minimum positive representable float value. This is the smallest number that can be represented that is still greater than zero." ), AuthoringMetaV2("mul", "Multiplies all numbers together."), + AuthoringMetaV2("pi", "The mathematical constant pi."), AuthoringMetaV2("power", "Raises the first number to the power of the second number."), AuthoringMetaV2("sqrt", "Calculates the square root of the input. Errors if the input is negative."), AuthoringMetaV2("sub", "Subtracts all numbers from the first number."), @@ -502,6 +504,8 @@ library LibAllStandardOps { LibParseOperand.handleOperandDisallowed, // mul LibParseOperand.handleOperandDisallowed, + // pi + LibParseOperand.handleOperandDisallowed, // power LibParseOperand.handleOperandDisallowed, // sqrt @@ -620,6 +624,7 @@ library LibAllStandardOps { LibOpMinNegativeValue.integrity, LibOpMinPositiveValue.integrity, LibOpMul.integrity, + LibOpPi.integrity, LibOpPower.integrity, LibOpSqrt.integrity, LibOpSub.integrity, @@ -724,6 +729,7 @@ library LibAllStandardOps { LibOpMinNegativeValue.run, LibOpMinPositiveValue.run, LibOpMul.run, + LibOpPi.run, LibOpPower.run, LibOpSqrt.run, LibOpSub.run, diff --git a/src/lib/op/math/LibOpPi.sol b/src/lib/op/math/LibOpPi.sol new file mode 100644 index 000000000..5e59ac353 --- /dev/null +++ b/src/lib/op/math/LibOpPi.sol @@ -0,0 +1,49 @@ +// SPDX-License-Identifier: LicenseRef-DCL-1.0 +// SPDX-FileCopyrightText: Copyright (c) 2020 Rain Open Source Software Ltd +pragma solidity ^0.8.25; + +import {Pointer} from "rain-solmem-0.1.3/src/lib/LibPointer.sol"; +import {OperandV2, StackItem} from "rain-interpreter-interface-0.1.0/src/interface/IInterpreterV4.sol"; +import {InterpreterState} from "../../state/LibInterpreterState.sol"; +import {IntegrityCheckState} from "../../integrity/LibIntegrityCheck.sol"; +import {Float} from "rain-math-float-0.1.1/src/lib/LibDecimalFloat.sol"; + +/// @dev The mathematical constant pi as a `Float`. +/// 3.141592653589793238462643383279502884197169399375105820974944592308e66, -66 +Float constant FLOAT_PI = + Float.wrap(bytes32(uint256(0xffffffbe1dd4c9e873614f593bba9c6007d9a7ac8d03a4b6c700a65cb537a1b4))); + +/// @title LibOpPi +/// @notice Stacks the mathematical constant pi. +library LibOpPi { + /// @notice `pi` integrity check. Requires 0 inputs and produces 1 output. + /// @return The number of inputs. + /// @return The number of outputs. + function integrity(IntegrityCheckState memory, OperandV2) internal pure returns (uint256, uint256) { + return (0, 1); + } + + /// @notice `pi` opcode. Pushes the mathematical constant pi onto the stack. + /// @param stackTop Pointer to the top of the stack. + /// @return The new stack top pointer after execution. + function run(InterpreterState memory, OperandV2, Pointer stackTop) internal pure returns (Pointer) { + Float pi = FLOAT_PI; + assembly ("memory-safe") { + stackTop := sub(stackTop, 0x20) + mstore(stackTop, pi) + } + return stackTop; + } + + /// @notice Reference implementation of `pi` for testing. + /// @return The output values to push onto the stack. + function referenceFn(InterpreterState memory, OperandV2, StackItem[] memory) + internal + pure + returns (StackItem[] memory) + { + StackItem[] memory outputs = new StackItem[](1); + outputs[0] = StackItem.wrap(Float.unwrap(FLOAT_PI)); + return outputs; + } +} diff --git a/test/src/lib/op/LibAllStandardOps.t.sol b/test/src/lib/op/LibAllStandardOps.t.sol index 3d669c338..978248208 100644 --- a/test/src/lib/op/LibAllStandardOps.t.sol +++ b/test/src/lib/op/LibAllStandardOps.t.sol @@ -201,33 +201,35 @@ contract LibAllStandardOpsTest is Test { //forge-lint: disable-next-line(unsafe-typecast) assertEq(words[58].word, bytes32("mul")); //forge-lint: disable-next-line(unsafe-typecast) - assertEq(words[59].word, bytes32("power")); + assertEq(words[59].word, bytes32("pi")); //forge-lint: disable-next-line(unsafe-typecast) - assertEq(words[60].word, bytes32("sqrt")); + assertEq(words[60].word, bytes32("power")); //forge-lint: disable-next-line(unsafe-typecast) - assertEq(words[61].word, bytes32("sub")); + assertEq(words[61].word, bytes32("sqrt")); + //forge-lint: disable-next-line(unsafe-typecast) + assertEq(words[62].word, bytes32("sub")); // math/growth/ //forge-lint: disable-next-line(unsafe-typecast) - assertEq(words[62].word, bytes32("exponential-growth")); + assertEq(words[63].word, bytes32("exponential-growth")); //forge-lint: disable-next-line(unsafe-typecast) - assertEq(words[63].word, bytes32("linear-growth")); + assertEq(words[64].word, bytes32("linear-growth")); // math/uint256/ //forge-lint: disable-next-line(unsafe-typecast) - assertEq(words[64].word, bytes32("uint256-add")); + assertEq(words[65].word, bytes32("uint256-add")); //forge-lint: disable-next-line(unsafe-typecast) - assertEq(words[65].word, bytes32("uint256-div")); + assertEq(words[66].word, bytes32("uint256-div")); //forge-lint: disable-next-line(unsafe-typecast) - assertEq(words[66].word, bytes32("uint256-max-value")); + assertEq(words[67].word, bytes32("uint256-max-value")); //forge-lint: disable-next-line(unsafe-typecast) - assertEq(words[67].word, bytes32("uint256-mul")); + assertEq(words[68].word, bytes32("uint256-mul")); //forge-lint: disable-next-line(unsafe-typecast) - assertEq(words[68].word, bytes32("uint256-power")); + assertEq(words[69].word, bytes32("uint256-power")); //forge-lint: disable-next-line(unsafe-typecast) - assertEq(words[69].word, bytes32("uint256-sub")); + assertEq(words[70].word, bytes32("uint256-sub")); // store/ //forge-lint: disable-next-line(unsafe-typecast) - assertEq(words[70].word, bytes32("get")); + assertEq(words[71].word, bytes32("get")); //forge-lint: disable-next-line(unsafe-typecast) - assertEq(words[71].word, bytes32("set")); + assertEq(words[72].word, bytes32("set")); } } diff --git a/test/src/lib/op/math/LibOpPi.t.sol b/test/src/lib/op/math/LibOpPi.t.sol new file mode 100644 index 000000000..e7ec5377b --- /dev/null +++ b/test/src/lib/op/math/LibOpPi.t.sol @@ -0,0 +1,82 @@ +// SPDX-License-Identifier: LicenseRef-DCL-1.0 +// SPDX-FileCopyrightText: Copyright (c) 2020 Rain Open Source Software Ltd +pragma solidity =0.8.25; + +import {OpTest, UnexpectedOperand} from "test/abstract/OpTest.sol"; +import {InterpreterState} from "../../../../../src/lib/state/LibInterpreterState.sol"; +import {LibOpPi, FLOAT_PI} from "../../../../../src/lib/op/math/LibOpPi.sol"; +import {LibOperand, OperandV2} from "test/lib/operand/LibOperand.sol"; +import {IntegrityCheckState} from "../../../../../src/lib/integrity/LibIntegrityCheck.sol"; +import { + EvalV4, + StackItem, + FullyQualifiedNamespace, + SourceIndexV2 +} from "rain-interpreter-interface-0.1.0/src/interface/IInterpreterV4.sol"; +import {SignedContextV1} from "rain-interpreter-interface-0.1.0/src/interface/IInterpreterCallerV4.sol"; +import {LibContext} from "rain-interpreter-interface-0.1.0/src/lib/caller/LibContext.sol"; +import {Float} from "rain-math-float-0.1.1/src/lib/LibDecimalFloat.sol"; + +/// @title LibOpPiTest +/// @notice Tests for the mathematical constant pi opcode. +contract LibOpPiTest is OpTest { + /// Directly test the integrity logic of LibOpPi. + function testOpPiIntegrity(IntegrityCheckState memory state, uint8 inputs, uint8 outputs, uint16 operandData) + external + pure + { + inputs = uint8(bound(inputs, 0, 0x0F)); + outputs = uint8(bound(outputs, 0, 0x0F)); + (uint256 calcInputs, uint256 calcOutputs) = + LibOpPi.integrity(state, LibOperand.build(inputs, outputs, operandData)); + + assertEq(calcInputs, 0); + assertEq(calcOutputs, 1); + } + + /// Directly test the runtime logic of LibOpPi. This tests that the + /// opcode correctly pushes the mathematical constant pi onto the stack. + function testOpPiRun(uint16 operandData) external view { + InterpreterState memory state = opTestDefaultInterpreterState(); + OperandV2 operand = LibOperand.build(0, 1, operandData); + StackItem[] memory inputs = new StackItem[](0); + opReferenceCheck(state, operand, LibOpPi.referenceFn, LibOpPi.integrity, LibOpPi.run, inputs); + } + + /// Test the eval of a mathematical constant pi opcode parsed from a string. + function testOpPiEval() external view { + bytes memory bytecode = I_DEPLOYER.parse2("_: pi();"); + + (StackItem[] memory stack, bytes32[] memory kvs) = I_INTERPRETER.eval4( + EvalV4({ + store: I_STORE, + namespace: FullyQualifiedNamespace.wrap(0), + bytecode: bytecode, + sourceIndex: SourceIndexV2.wrap(0), + context: LibContext.build(new bytes32[][](0), new SignedContextV1[](0)), + inputs: new StackItem[](0), + stateOverlay: new bytes32[](0) + }) + ); + assertEq(stack.length, 1); + assertEq(StackItem.unwrap(stack[0]), Float.unwrap(FLOAT_PI)); + assertEq(kvs.length, 0); + } + + function testOpPiEvalOneInput() external { + checkBadInputs("_: pi(0x00);", 1, 0, 1); + } + + function testOpPiEvalZeroOutputs() external { + checkBadOutputs(": pi();", 0, 1, 0); + } + + function testOpPiEvalTwoOutputs() external { + checkBadOutputs("_ _: pi();", 0, 1, 2); + } + + /// Test that operand is disallowed. + function testOpPiEvalOperandDisallowed() external { + checkUnhappyParse("_: pi<0>();", abi.encodeWithSelector(UnexpectedOperand.selector)); + } +} From 3b532de9bc699f7e87cca214d84423ff003c105d Mon Sep 17 00:00:00 2001 From: David Meister Date: Mon, 15 Jun 2026 15:21:40 +0000 Subject: [PATCH 2/4] Regenerate committed ABI fixtures for pi word The pi opcode changes the interpreter bytecode, which cascades through the expression deployer, parser, and Rainlang registry. Refresh the committed forge ABI artifacts so the copy-artifacts determinism check passes. Co-Authored-By: Claude Opus 4.8 --- crates/bindings/abi/Rainlang.json | 4 ++-- crates/test_fixtures/abi/Rainlang.json | 4 ++-- crates/test_fixtures/abi/RainlangExpressionDeployer.json | 4 ++-- crates/test_fixtures/abi/RainlangInterpreter.json | 4 ++-- crates/test_fixtures/abi/RainlangParser.json | 4 ++-- 5 files changed, 10 insertions(+), 10 deletions(-) diff --git a/crates/bindings/abi/Rainlang.json b/crates/bindings/abi/Rainlang.json index b393ecf3d..d15716e56 100644 --- a/crates/bindings/abi/Rainlang.json +++ b/crates/bindings/abi/Rainlang.json @@ -73,9 +73,9 @@ } ], "bytecode": { - "object": "0x6080604052348015600e575f80fd5b506101f78061001c5f395ff3fe608060405234801561000f575f80fd5b5060043610610064575f3560e01c8063107628021161004d57806310762802146100cb5780634501e517146100e5578063f2c4da93146100ff575f80fd5b806301ffc9a7146100685780630c1916a414610090575b5f80fd5b61007b6100763660046101b1565b610119565b60405190151581526020015b60405180910390f35b739179445a637e6ae72bb38273944fab96834488dd5b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610087565b73c9e1d673ed122193b28376016ac506de2fa20bee6100a6565b73b3a710b89a5569893da4ca0db7d178593b5be8a06100a6565b731aa775533e28b1d843e1a589034984e3a62005dc6100a6565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082167fabaa01220000000000000000000000000000000000000000000000000000000014806101ab57507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b92915050565b5f602082840312156101c1575f80fd5b81357fffffffff00000000000000000000000000000000000000000000000000000000811681146101f0575f80fd5b939250505056" + "object": "0x6080604052348015600e575f80fd5b506101f78061001c5f395ff3fe608060405234801561000f575f80fd5b5060043610610064575f3560e01c8063107628021161004d57806310762802146100cb5780634501e517146100e5578063f2c4da93146100ff575f80fd5b806301ffc9a7146100685780630c1916a414610090575b5f80fd5b61007b6100763660046101b1565b610119565b60405190151581526020015b60405180910390f35b73088bdb2b554e3cdeda4137beef92ffee1e9f4dbf5b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610087565b73c0bffccb665d3ebca5aba3816d94f35c8467d6f76100a6565b737e694007bb400ab2147a2060d2e48703f3fa1cef6100a6565b731aa775533e28b1d843e1a589034984e3a62005dc6100a6565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082167fabaa01220000000000000000000000000000000000000000000000000000000014806101ab57507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b92915050565b5f602082840312156101c1575f80fd5b81357fffffffff00000000000000000000000000000000000000000000000000000000811681146101f0575f80fd5b939250505056" }, "deployedBytecode": { - "object": "0x608060405234801561000f575f80fd5b5060043610610064575f3560e01c8063107628021161004d57806310762802146100cb5780634501e517146100e5578063f2c4da93146100ff575f80fd5b806301ffc9a7146100685780630c1916a414610090575b5f80fd5b61007b6100763660046101b1565b610119565b60405190151581526020015b60405180910390f35b739179445a637e6ae72bb38273944fab96834488dd5b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610087565b73c9e1d673ed122193b28376016ac506de2fa20bee6100a6565b73b3a710b89a5569893da4ca0db7d178593b5be8a06100a6565b731aa775533e28b1d843e1a589034984e3a62005dc6100a6565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082167fabaa01220000000000000000000000000000000000000000000000000000000014806101ab57507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b92915050565b5f602082840312156101c1575f80fd5b81357fffffffff00000000000000000000000000000000000000000000000000000000811681146101f0575f80fd5b939250505056" + "object": "0x608060405234801561000f575f80fd5b5060043610610064575f3560e01c8063107628021161004d57806310762802146100cb5780634501e517146100e5578063f2c4da93146100ff575f80fd5b806301ffc9a7146100685780630c1916a414610090575b5f80fd5b61007b6100763660046101b1565b610119565b60405190151581526020015b60405180910390f35b73088bdb2b554e3cdeda4137beef92ffee1e9f4dbf5b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610087565b73c0bffccb665d3ebca5aba3816d94f35c8467d6f76100a6565b737e694007bb400ab2147a2060d2e48703f3fa1cef6100a6565b731aa775533e28b1d843e1a589034984e3a62005dc6100a6565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082167fabaa01220000000000000000000000000000000000000000000000000000000014806101ab57507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b92915050565b5f602082840312156101c1575f80fd5b81357fffffffff00000000000000000000000000000000000000000000000000000000811681146101f0575f80fd5b939250505056" } } diff --git a/crates/test_fixtures/abi/Rainlang.json b/crates/test_fixtures/abi/Rainlang.json index b393ecf3d..d15716e56 100644 --- a/crates/test_fixtures/abi/Rainlang.json +++ b/crates/test_fixtures/abi/Rainlang.json @@ -73,9 +73,9 @@ } ], "bytecode": { - "object": "0x6080604052348015600e575f80fd5b506101f78061001c5f395ff3fe608060405234801561000f575f80fd5b5060043610610064575f3560e01c8063107628021161004d57806310762802146100cb5780634501e517146100e5578063f2c4da93146100ff575f80fd5b806301ffc9a7146100685780630c1916a414610090575b5f80fd5b61007b6100763660046101b1565b610119565b60405190151581526020015b60405180910390f35b739179445a637e6ae72bb38273944fab96834488dd5b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610087565b73c9e1d673ed122193b28376016ac506de2fa20bee6100a6565b73b3a710b89a5569893da4ca0db7d178593b5be8a06100a6565b731aa775533e28b1d843e1a589034984e3a62005dc6100a6565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082167fabaa01220000000000000000000000000000000000000000000000000000000014806101ab57507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b92915050565b5f602082840312156101c1575f80fd5b81357fffffffff00000000000000000000000000000000000000000000000000000000811681146101f0575f80fd5b939250505056" + "object": "0x6080604052348015600e575f80fd5b506101f78061001c5f395ff3fe608060405234801561000f575f80fd5b5060043610610064575f3560e01c8063107628021161004d57806310762802146100cb5780634501e517146100e5578063f2c4da93146100ff575f80fd5b806301ffc9a7146100685780630c1916a414610090575b5f80fd5b61007b6100763660046101b1565b610119565b60405190151581526020015b60405180910390f35b73088bdb2b554e3cdeda4137beef92ffee1e9f4dbf5b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610087565b73c0bffccb665d3ebca5aba3816d94f35c8467d6f76100a6565b737e694007bb400ab2147a2060d2e48703f3fa1cef6100a6565b731aa775533e28b1d843e1a589034984e3a62005dc6100a6565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082167fabaa01220000000000000000000000000000000000000000000000000000000014806101ab57507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b92915050565b5f602082840312156101c1575f80fd5b81357fffffffff00000000000000000000000000000000000000000000000000000000811681146101f0575f80fd5b939250505056" }, "deployedBytecode": { - "object": "0x608060405234801561000f575f80fd5b5060043610610064575f3560e01c8063107628021161004d57806310762802146100cb5780634501e517146100e5578063f2c4da93146100ff575f80fd5b806301ffc9a7146100685780630c1916a414610090575b5f80fd5b61007b6100763660046101b1565b610119565b60405190151581526020015b60405180910390f35b739179445a637e6ae72bb38273944fab96834488dd5b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610087565b73c9e1d673ed122193b28376016ac506de2fa20bee6100a6565b73b3a710b89a5569893da4ca0db7d178593b5be8a06100a6565b731aa775533e28b1d843e1a589034984e3a62005dc6100a6565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082167fabaa01220000000000000000000000000000000000000000000000000000000014806101ab57507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b92915050565b5f602082840312156101c1575f80fd5b81357fffffffff00000000000000000000000000000000000000000000000000000000811681146101f0575f80fd5b939250505056" + "object": "0x608060405234801561000f575f80fd5b5060043610610064575f3560e01c8063107628021161004d57806310762802146100cb5780634501e517146100e5578063f2c4da93146100ff575f80fd5b806301ffc9a7146100685780630c1916a414610090575b5f80fd5b61007b6100763660046101b1565b610119565b60405190151581526020015b60405180910390f35b73088bdb2b554e3cdeda4137beef92ffee1e9f4dbf5b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610087565b73c0bffccb665d3ebca5aba3816d94f35c8467d6f76100a6565b737e694007bb400ab2147a2060d2e48703f3fa1cef6100a6565b731aa775533e28b1d843e1a589034984e3a62005dc6100a6565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082167fabaa01220000000000000000000000000000000000000000000000000000000014806101ab57507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b92915050565b5f602082840312156101c1575f80fd5b81357fffffffff00000000000000000000000000000000000000000000000000000000811681146101f0575f80fd5b939250505056" } } diff --git a/crates/test_fixtures/abi/RainlangExpressionDeployer.json b/crates/test_fixtures/abi/RainlangExpressionDeployer.json index a9b90ad65..6f677c59d 100644 --- a/crates/test_fixtures/abi/RainlangExpressionDeployer.json +++ b/crates/test_fixtures/abi/RainlangExpressionDeployer.json @@ -481,9 +481,9 @@ } ], "bytecode": { - "object": "0x6080604052348015600e575f80fd5b50611ca88061001c5f395ff3fe608060405234801561000f575f80fd5b5060043610610064575f3560e01c80636f5aa28d1161004d5780636f5aa28d146100b0578063a3869e14146100de578063b92d7553146100fe575f80fd5b806301ffc9a7146100685780635514ca2014610090575b5f80fd5b61007b610076366004611619565b610106565b60405190151581526020015b60405180910390f35b6100a361009e366004611658565b610282565b60405161008791906116c4565b6040517f0ae1ecb6c0f6314beaf4d4cd803ba14c900b0eecb1ecd39a52739cff9ae2c34a8152602001610087565b6100f16100ec366004611813565b610347565b60405161008791906118d9565b6100f1610468565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082167f6f5aa28d00000000000000000000000000000000000000000000000000000000148061019857507fffffffff0000000000000000000000000000000000000000000000000000000082167fa3869e1400000000000000000000000000000000000000000000000000000000145b806101e457507fffffffff0000000000000000000000000000000000000000000000000000000082167f5514ca2000000000000000000000000000000000000000000000000000000000145b8061023057507fffffffff0000000000000000000000000000000000000000000000000000000082167fb92d755300000000000000000000000000000000000000000000000000000000145b8061027c57507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b92915050565b604080516020810182526060815290517f5514ca20000000000000000000000000000000000000000000000000000000008152739179445a637e6ae72bb38273944fab96834488dd90635514ca20906102e190869086906004016118eb565b5f60405180830381865afa1580156102fb573d5f803e3d5ffd5b505050506040513d5f823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201604052610340919081019061195a565b9392505050565b6040517f7764fd9c0000000000000000000000000000000000000000000000000000000081526060905f908190739179445a637e6ae72bb38273944fab96834488dd90637764fd9c9061039e9087906004016118d9565b5f60405180830381865afa1580156103b8573d5f803e3d5ffd5b505050506040513d5f823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682016040526103fd9190810190611a39565b915091505f610416838351905160406020909202010190565b60408051602083820181019092528281529192508101610437818686610477565b5f61045b6040518060c0016040528060908152602001611c186090913987876104ba565b5091979650505050505050565b6060610472610879565b905090565b80600182510160200281015b8082101561049e578151855260209485019490910190610483565b50506104b56104aa8390565b848451602001610b4c565b505050565b60605f6104c684610b55565b85519091506020860190600290046104dd86610b6f565b8260020267ffffffffffffffff8111156104f9576104f9611729565b6040519080825280601f01601f191660200182016040528015610523576020820181803683370190505b509350602084015f5b8481101561086d575f806105408a84610d8c565b915091508184538060018501536002840193505f61055f8b848c610daf565b90505f601861056e8d87610e16565b0390505f61057c8d87610e45565b600402820190505b808210156107b757815162ffffff811690601d81901a600f81169160049190911c90601c1a61160f8c82106106015760808801516040517fc8344ab1000000000000000000000000000000000000000000000000000000008152600481019190915260248101839052604481018e90526064015b60405180910390fd5b50600281028d015160f01c5f806106168a8885565b9150915085821461066a5760808a01516040517fddf56071000000000000000000000000000000000000000000000000000000008152600481019190915260248101839052604481018790526064016105f8565b8481146106ba5760808a01516040517ffc8b5603000000000000000000000000000000000000000000000000000000008152600481019190915260248101829052604481018690526064016105f8565b895182111561070c5760808a01518a516040517f2cab6bff00000000000000000000000000000000000000000000000000000000815260048101929092526024820152604481018390526064016105f8565b8951829003808b5260408b0151111561076e5760808a01518a516040808d015190517f1bc5ab0f0000000000000000000000000000000000000000000000000000000081526004810193909352602483019190915260448201526064016105f8565b89518101808b5260208b0151101561078857895160208b01525b600181111561079957895160408b01525b50505060808701805160010190525050506004929092019150610584565b6107c18d87610e5c565b8360200151146108155782602001516107da8e88610e5c565b6040517f4d9c18dc000000000000000000000000000000000000000000000000000000008152600481019290925260248201526044016105f8565b8251841461085c5782516040517f4689f0b30000000000000000000000000000000000000000000000000000000081526004810191909152602481018590526044016105f8565b50506001909301925061052c915050565b50505050509392505050565b606061160f5f604890508091505f6040518061092001604052808467ffffffffffffffff1667ffffffffffffffff168152602001610e748152602001610ef08152602001610f5381526020016111ae81526020016111b781526020016111c181526020016111ca81526020016111e481526020016111b78152602001611289815260200161128981526020016112e481526020016113ad81526020016113ba81526020016111b781526020016111c181526020016113ba81526020016111b781526020016111c181526020016111c181526020016111b781526020016111b781526020016111b781526020016111ae81526020016111ae81526020016111ae81526020016111ae81526020016113c481526020016111b781526020016113e8815260200161140181526020016111b781526020016113c481526020016111b781526020016111b781526020016113ba81526020016111c181526020016111b781526020016111b781526020016111c1815260200161140a81526020016111b781526020016111c1815260200161140a81526020016111ae81526020016111c181526020016111c181526020016111c181526020016111c181526020016111b781526020016111c181526020016111c1815260200161140a81526020016111ae81526020016111ae815260200161140a81526020016111ae81526020016111ae815260200161140a81526020016111b781526020016111c1815260200161140a81526020016113ba81526020016113ba815260200161140a815260200161140a81526020016111ae815260200161140a815260200161140a815260200161140a81526020016111c18152602001611401815250905060608190506048815114610b3a5780516040517fc8b569010000000000000000000000000000000000000000000000000000000081526004810191909152602481018490526044016105f8565b610b4381611423565b94505050505090565b8083835e505050565b5f81515f03610b6557505f919050565b50602001515f1a90565b5f610b7982610b55565b90508015610d4a5781516001600283020190811115610bc657826040517f17f4bc5e0000000000000000000000000000000000000000000000000000000081526004016105f891906118d9565b82516020828501810191850101602160027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff860102860181019086015b808210610d0657815160f01c8481016004810185811115610c5157896040517e39ba560000000000000000000000000000000000000000000000000000000081526004016105f891906118d9565b81515f81901a90600181901a90600281901a9060031a80821180610c7457508281115b15610caf578d876040517feaf45f4f0000000000000000000000000000000000000000000000000000000081526004016105f8929190611b2a565b505050600481028201878114610cf3578b6040517ffbb8027a0000000000000000000000000000000000000000000000000000000081526004016105f891906118d9565b8397506002870396505050505050610c03565b838314610d4157866040517fde67b29a0000000000000000000000000000000000000000000000000000000081526004016105f891906118d9565b50505050505050565b600182511115610d8857816040517fd013da5d0000000000000000000000000000000000000000000000000000000081526004016105f891906118d9565b5050565b5f805f610d998585610e16565b51600281901a9660039190911a95509350505050565b610de46040518060c001604052805f81526020015f81526020015f8152602001606081526020015f8152602001606081525090565b506040805160c081018252838152602081018490529081019290925260608201525f608082015260a081019190915290565b5f80610e2184610b55565b60020260010190505f610e3485856114b3565b949091019093016020019392505050565b5f80610e518484610e16565b515f1a949350505050565b5f80610e688484610e16565b5160011a949350505050565b81515f90819061ffff8416908110610ecf57608085015185516040517feaa16f3300000000000000000000000000000000000000000000000000000000815260048101929092526024820152604481018290526064016105f8565b8460400151811115610ee357604085018190525b505f946001945092505050565b6060820151515f90819061ffff8416908110610ee35760808501516060860151516040517feb78945400000000000000000000000000000000000000000000000000000000815260048101929092526024820152604481018290526064016105f8565b6060820151515f90819061ffff8416908110610fb65760808501516060860151516040517feb78945400000000000000000000000000000000000000000000000000000000815260048101929092526024820152604481018290526064016105f8565b5f85606001518281518110610fcd57610fcd611b4b565b602002602001015190505f80610fe6839060a082901c90565b91509150611014827f18003f8e00000000000000000000000000000000000000000000000000000000611509565b611062576040517f23016c8900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff831660048201526024016105f8565b6040517f40c04edc00000000000000000000000000000000000000000000000000000000815260048101829052600f601089901c81166024830181905260148a901c9091166044830181905290915f90819073ffffffffffffffffffffffffffffffffffffffff8716906340c04edc906064016040805180830381865afa1580156110ef573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111139190611b78565b9150915083821461115a576040517f528cc0fb00000000000000000000000000000000000000000000000000000000815260048101859052602481018390526044016105f8565b82811461119d576040517fc5ff08dc00000000000000000000000000000000000000000000000000000000815260048101849052602481018290526044016105f8565b909b909a5098505050505050505050565b505f9160019150565b5060029160019150565b50600191829150565b5f806111d684846111e4565b506001958695509350505050565b5f8060ff83811690600885901c1680830361122b576040517f46f0ca6900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6101006112388284611b9a565b111561127a576040517f8abcdd3f00000000000000000000000000000000000000000000000000000000815260048101839052602481018290526044016105f8565b50600295600195509350505050565b5f8061ffff831660ff81118061129d575080155b156112d7576040517fc1be16a1000000000000000000000000000000000000000000000000000000008152600481018290526024016105f8565b5060019485945092505050565b60a08201515f90819061ffff841690600f601486901c811691601087901c90911690849081906113149086610d8c565b9150915081831461135b576040517f9199e58e00000000000000000000000000000000000000000000000000000000815260048101849052602481018390526044016105f8565b8381101561139f576040517fff13710800000000000000000000000000000000000000000000000000000000815260048101829052602481018590526044016105f8565b509791965090945050505050565b60101c600f169160019150565b5060039160019150565b5f80600f601084901c16806113da5760016113dc565b805b95600195509350505050565b5f80600f601084901c16600281116113da5760026113dc565b506002915f9150565b5f80600f601084901c16600181116113da5760026113dc565b60605f825160020267ffffffffffffffff81111561144357611443611729565b6040519080825280601f01601f19166020018201604052801561146d576020820181803683370190505b50905061ffff80196020850160208651028101600285015b818310156114a757805183518616908516178152602090920191600201611485565b50939695505050505050565b5f6114bd83610b55565b82106114f95781836040517ffcfaeff10000000000000000000000000000000000000000000000000000000081526004016105f8929190611bd2565b50600202016003015161ffff1690565b5f61151383611524565b80156103405750610340838361159e565b5f61154f827f01ffc9a70000000000000000000000000000000000000000000000000000000061159e565b15611597575f80611580847fffffffff000000000000000000000000000000000000000000000000000000006115c2565b9150915081801561158f575080155b949350505050565b505f919050565b5f805f6115ab85856115c2565b915091508180156115b95750805b95945050505050565b7f01ffc9a7000000000000000000000000000000000000000000000000000000005f818152600483905290819060208260248188617530fa92505f511515601f3d11169150509250929050565b611617611bea565b565b5f60208284031215611629575f80fd5b81357fffffffff0000000000000000000000000000000000000000000000000000000081168114610340575f80fd5b5f8060208385031215611669575f80fd5b823567ffffffffffffffff80821115611680575f80fd5b818501915085601f830112611693575f80fd5b8135818111156116a1575f80fd5b8660208285010111156116b2575f80fd5b60209290920196919550909350505050565b602080825282518282018290528051604084018190525f9291820190839060608601905b8083101561171e57835173ffffffffffffffffffffffffffffffffffffffff1682529284019260019290920191908401906116e8565b509695505050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6040516020810167ffffffffffffffff8111828210171561177957611779611729565b60405290565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156117c6576117c6611729565b604052919050565b5f67ffffffffffffffff8211156117e7576117e7611729565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b5f60208284031215611823575f80fd5b813567ffffffffffffffff811115611839575f80fd5b8201601f81018413611849575f80fd5b803561185c611857826117ce565b61177f565b818152856020838501011115611870575f80fd5b816020840160208301375f91810160200191909152949350505050565b5f81518084528060208401602086015e5f6020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b602081525f610340602083018461188d565b60208152816020820152818360408301375f818301604090810191909152601f9092017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0160101919050565b5f67ffffffffffffffff82111561195057611950611729565b5060051b60200190565b5f602080838503121561196b575f80fd5b825167ffffffffffffffff80821115611982575f80fd5b8185019150828287031215611995575f80fd5b61199d611756565b8251828111156119ab575f80fd5b80840193505086601f8401126119bf575f80fd5b825191506119cf61185783611937565b82815260059290921b830184019184810190888411156119ed575f80fd5b938501935b83851015611a2c57845173ffffffffffffffffffffffffffffffffffffffff81168114611a1d575f80fd5b825293850193908501906119f2565b8252509695505050505050565b5f8060408385031215611a4a575f80fd5b825167ffffffffffffffff80821115611a61575f80fd5b818501915085601f830112611a74575f80fd5b81516020611a84611857836117ce565b8281528882848701011115611a97575f80fd5b828286018383015e5f81840183015287820151909650935082841115611abb575f80fd5b838701935087601f850112611ace575f80fd5b83519250611ade61185784611937565b83815260059390931b8401810192818101925088841115611afd575f80fd5b938101935b83851015611b1b57845183529381019391810191611b02565b80955050505050509250929050565b604081525f611b3c604083018561188d565b90508260208301529392505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f8060408385031215611b89575f80fd5b505080516020909101519092909150565b8082018082111561027c577f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b828152604060208201525f61158f604083018461188d565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52605160045260245ffdfe0e740ef00f5311ae11b711c111ca11e411b71289128912e413ad13ba11b711c113ba11b711c111c111b711b711b711ae11ae11ae11ae13c411b713e8140111b713c411b711b713ba11c111b711b711c1140a11b711c1140a11ae11c111c111c111c111b711c111c1140a11ae11ae140a11ae11ae140a11b711c1140a13ba13ba140a140a11ae140a140a140a11c11401" + "object": "0x6080604052348015600e575f80fd5b50611cb28061001c5f395ff3fe608060405234801561000f575f80fd5b5060043610610064575f3560e01c80636f5aa28d1161004d5780636f5aa28d146100b0578063a3869e14146100de578063b92d7553146100fe575f80fd5b806301ffc9a7146100685780635514ca2014610090575b5f80fd5b61007b610076366004611621565b610106565b60405190151581526020015b60405180910390f35b6100a361009e366004611660565b610282565b60405161008791906116cc565b6040517fc5a28e7d9dcddeae423dae076cbc7510e07229c5aac6e894727caa6ebf1353fa8152602001610087565b6100f16100ec36600461181b565b610347565b60405161008791906118e1565b6100f1610468565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082167f6f5aa28d00000000000000000000000000000000000000000000000000000000148061019857507fffffffff0000000000000000000000000000000000000000000000000000000082167fa3869e1400000000000000000000000000000000000000000000000000000000145b806101e457507fffffffff0000000000000000000000000000000000000000000000000000000082167f5514ca2000000000000000000000000000000000000000000000000000000000145b8061023057507fffffffff0000000000000000000000000000000000000000000000000000000082167fb92d755300000000000000000000000000000000000000000000000000000000145b8061027c57507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b92915050565b604080516020810182526060815290517f5514ca2000000000000000000000000000000000000000000000000000000000815273088bdb2b554e3cdeda4137beef92ffee1e9f4dbf90635514ca20906102e190869086906004016118f3565b5f60405180830381865afa1580156102fb573d5f803e3d5ffd5b505050506040513d5f823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682016040526103409190810190611962565b9392505050565b6040517f7764fd9c0000000000000000000000000000000000000000000000000000000081526060905f90819073088bdb2b554e3cdeda4137beef92ffee1e9f4dbf90637764fd9c9061039e9087906004016118e1565b5f60405180830381865afa1580156103b8573d5f803e3d5ffd5b505050506040513d5f823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682016040526103fd9190810190611a41565b915091505f610416838351905160406020909202010190565b60408051602083820181019092528281529192508101610437818686610477565b5f61045b6040518060c0016040528060928152602001611c206092913987876104ba565b5091979650505050505050565b6060610472610879565b905090565b80600182510160200281015b8082101561049e578151855260209485019490910190610483565b50506104b56104aa8390565b848451602001610b54565b505050565b60605f6104c684610b5d565b85519091506020860190600290046104dd86610b77565b8260020267ffffffffffffffff8111156104f9576104f9611731565b6040519080825280601f01601f191660200182016040528015610523576020820181803683370190505b509350602084015f5b8481101561086d575f806105408a84610d94565b915091508184538060018501536002840193505f61055f8b848c610db7565b90505f601861056e8d87610e1e565b0390505f61057c8d87610e4d565b600402820190505b808210156107b757815162ffffff811690601d81901a600f81169160049190911c90601c1a6116178c82106106015760808801516040517fc8344ab1000000000000000000000000000000000000000000000000000000008152600481019190915260248101839052604481018e90526064015b60405180910390fd5b50600281028d015160f01c5f806106168a8885565b9150915085821461066a5760808a01516040517fddf56071000000000000000000000000000000000000000000000000000000008152600481019190915260248101839052604481018790526064016105f8565b8481146106ba5760808a01516040517ffc8b5603000000000000000000000000000000000000000000000000000000008152600481019190915260248101829052604481018690526064016105f8565b895182111561070c5760808a01518a516040517f2cab6bff00000000000000000000000000000000000000000000000000000000815260048101929092526024820152604481018390526064016105f8565b8951829003808b5260408b0151111561076e5760808a01518a516040808d015190517f1bc5ab0f0000000000000000000000000000000000000000000000000000000081526004810193909352602483019190915260448201526064016105f8565b89518101808b5260208b0151101561078857895160208b01525b600181111561079957895160408b01525b50505060808701805160010190525050506004929092019150610584565b6107c18d87610e64565b8360200151146108155782602001516107da8e88610e64565b6040517f4d9c18dc000000000000000000000000000000000000000000000000000000008152600481019290925260248201526044016105f8565b8251841461085c5782516040517f4689f0b30000000000000000000000000000000000000000000000000000000081526004810191909152602481018590526044016105f8565b50506001909301925061052c915050565b50505050509392505050565b60606116175f604990508091505f6040518061094001604052808467ffffffffffffffff1667ffffffffffffffff168152602001610e7c8152602001610ef88152602001610f5b81526020016111b681526020016111bf81526020016111c981526020016111d281526020016111ec81526020016111bf8152602001611291815260200161129181526020016112ec81526020016113b581526020016113c281526020016111bf81526020016111c981526020016113c281526020016111bf81526020016111c981526020016111c981526020016111bf81526020016111bf81526020016111bf81526020016111b681526020016111b681526020016111b681526020016111b681526020016113cc81526020016111bf81526020016113f0815260200161140981526020016111bf81526020016113cc81526020016111bf81526020016111bf81526020016113c281526020016111c981526020016111bf81526020016111bf81526020016111c9815260200161141281526020016111bf81526020016111c9815260200161141281526020016111b681526020016111c981526020016111c981526020016111c981526020016111c981526020016111bf81526020016111c981526020016111c9815260200161141281526020016111b681526020016111b6815260200161141281526020016111b681526020016111b6815260200161141281526020016111b681526020016111bf81526020016111c9815260200161141281526020016113c281526020016113c28152602001611412815260200161141281526020016111b681526020016114128152602001611412815260200161141281526020016111c98152602001611409815250905060608190506049815114610b425780516040517fc8b569010000000000000000000000000000000000000000000000000000000081526004810191909152602481018490526044016105f8565b610b4b8161142b565b94505050505090565b8083835e505050565b5f81515f03610b6d57505f919050565b50602001515f1a90565b5f610b8182610b5d565b90508015610d525781516001600283020190811115610bce57826040517f17f4bc5e0000000000000000000000000000000000000000000000000000000081526004016105f891906118e1565b82516020828501810191850101602160027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff860102860181019086015b808210610d0e57815160f01c8481016004810185811115610c5957896040517e39ba560000000000000000000000000000000000000000000000000000000081526004016105f891906118e1565b81515f81901a90600181901a90600281901a9060031a80821180610c7c57508281115b15610cb7578d876040517feaf45f4f0000000000000000000000000000000000000000000000000000000081526004016105f8929190611b32565b505050600481028201878114610cfb578b6040517ffbb8027a0000000000000000000000000000000000000000000000000000000081526004016105f891906118e1565b8397506002870396505050505050610c0b565b838314610d4957866040517fde67b29a0000000000000000000000000000000000000000000000000000000081526004016105f891906118e1565b50505050505050565b600182511115610d9057816040517fd013da5d0000000000000000000000000000000000000000000000000000000081526004016105f891906118e1565b5050565b5f805f610da18585610e1e565b51600281901a9660039190911a95509350505050565b610dec6040518060c001604052805f81526020015f81526020015f8152602001606081526020015f8152602001606081525090565b506040805160c081018252838152602081018490529081019290925260608201525f608082015260a081019190915290565b5f80610e2984610b5d565b60020260010190505f610e3c85856114bb565b949091019093016020019392505050565b5f80610e598484610e1e565b515f1a949350505050565b5f80610e708484610e1e565b5160011a949350505050565b81515f90819061ffff8416908110610ed757608085015185516040517feaa16f3300000000000000000000000000000000000000000000000000000000815260048101929092526024820152604481018290526064016105f8565b8460400151811115610eeb57604085018190525b505f946001945092505050565b6060820151515f90819061ffff8416908110610eeb5760808501516060860151516040517feb78945400000000000000000000000000000000000000000000000000000000815260048101929092526024820152604481018290526064016105f8565b6060820151515f90819061ffff8416908110610fbe5760808501516060860151516040517feb78945400000000000000000000000000000000000000000000000000000000815260048101929092526024820152604481018290526064016105f8565b5f85606001518281518110610fd557610fd5611b53565b602002602001015190505f80610fee839060a082901c90565b9150915061101c827f18003f8e00000000000000000000000000000000000000000000000000000000611511565b61106a576040517f23016c8900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff831660048201526024016105f8565b6040517f40c04edc00000000000000000000000000000000000000000000000000000000815260048101829052600f601089901c81166024830181905260148a901c9091166044830181905290915f90819073ffffffffffffffffffffffffffffffffffffffff8716906340c04edc906064016040805180830381865afa1580156110f7573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061111b9190611b80565b91509150838214611162576040517f528cc0fb00000000000000000000000000000000000000000000000000000000815260048101859052602481018390526044016105f8565b8281146111a5576040517fc5ff08dc00000000000000000000000000000000000000000000000000000000815260048101849052602481018290526044016105f8565b909b909a5098505050505050505050565b505f9160019150565b5060029160019150565b50600191829150565b5f806111de84846111ec565b506001958695509350505050565b5f8060ff83811690600885901c16808303611233576040517f46f0ca6900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6101006112408284611ba2565b1115611282576040517f8abcdd3f00000000000000000000000000000000000000000000000000000000815260048101839052602481018290526044016105f8565b50600295600195509350505050565b5f8061ffff831660ff8111806112a5575080155b156112df576040517fc1be16a1000000000000000000000000000000000000000000000000000000008152600481018290526024016105f8565b5060019485945092505050565b60a08201515f90819061ffff841690600f601486901c811691601087901c909116908490819061131c9086610d94565b91509150818314611363576040517f9199e58e00000000000000000000000000000000000000000000000000000000815260048101849052602481018390526044016105f8565b838110156113a7576040517fff13710800000000000000000000000000000000000000000000000000000000815260048101829052602481018590526044016105f8565b509791965090945050505050565b60101c600f169160019150565b5060039160019150565b5f80600f601084901c16806113e25760016113e4565b805b95600195509350505050565b5f80600f601084901c16600281116113e25760026113e4565b506002915f9150565b5f80600f601084901c16600181116113e25760026113e4565b60605f825160020267ffffffffffffffff81111561144b5761144b611731565b6040519080825280601f01601f191660200182016040528015611475576020820181803683370190505b50905061ffff80196020850160208651028101600285015b818310156114af5780518351861690851617815260209092019160020161148d565b50939695505050505050565b5f6114c583610b5d565b82106115015781836040517ffcfaeff10000000000000000000000000000000000000000000000000000000081526004016105f8929190611bda565b50600202016003015161ffff1690565b5f61151b8361152c565b8015610340575061034083836115a6565b5f611557827f01ffc9a7000000000000000000000000000000000000000000000000000000006115a6565b1561159f575f80611588847fffffffff000000000000000000000000000000000000000000000000000000006115ca565b91509150818015611597575080155b949350505050565b505f919050565b5f805f6115b385856115ca565b915091508180156115c15750805b95945050505050565b7f01ffc9a7000000000000000000000000000000000000000000000000000000005f818152600483905290819060208260248188617530fa92505f511515601f3d11169150509250929050565b61161f611bf2565b565b5f60208284031215611631575f80fd5b81357fffffffff0000000000000000000000000000000000000000000000000000000081168114610340575f80fd5b5f8060208385031215611671575f80fd5b823567ffffffffffffffff80821115611688575f80fd5b818501915085601f83011261169b575f80fd5b8135818111156116a9575f80fd5b8660208285010111156116ba575f80fd5b60209290920196919550909350505050565b602080825282518282018290528051604084018190525f9291820190839060608601905b8083101561172657835173ffffffffffffffffffffffffffffffffffffffff1682529284019260019290920191908401906116f0565b509695505050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6040516020810167ffffffffffffffff8111828210171561178157611781611731565b60405290565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156117ce576117ce611731565b604052919050565b5f67ffffffffffffffff8211156117ef576117ef611731565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b5f6020828403121561182b575f80fd5b813567ffffffffffffffff811115611841575f80fd5b8201601f81018413611851575f80fd5b803561186461185f826117d6565b611787565b818152856020838501011115611878575f80fd5b816020840160208301375f91810160200191909152949350505050565b5f81518084528060208401602086015e5f6020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b602081525f6103406020830184611895565b60208152816020820152818360408301375f818301604090810191909152601f9092017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0160101919050565b5f67ffffffffffffffff82111561195857611958611731565b5060051b60200190565b5f6020808385031215611973575f80fd5b825167ffffffffffffffff8082111561198a575f80fd5b818501915082828703121561199d575f80fd5b6119a561175e565b8251828111156119b3575f80fd5b80840193505086601f8401126119c7575f80fd5b825191506119d761185f8361193f565b82815260059290921b830184019184810190888411156119f5575f80fd5b938501935b83851015611a3457845173ffffffffffffffffffffffffffffffffffffffff81168114611a25575f80fd5b825293850193908501906119fa565b8252509695505050505050565b5f8060408385031215611a52575f80fd5b825167ffffffffffffffff80821115611a69575f80fd5b818501915085601f830112611a7c575f80fd5b81516020611a8c61185f836117d6565b8281528882848701011115611a9f575f80fd5b828286018383015e5f81840183015287820151909650935082841115611ac3575f80fd5b838701935087601f850112611ad6575f80fd5b83519250611ae661185f8461193f565b83815260059390931b8401810192818101925088841115611b05575f80fd5b938101935b83851015611b2357845183529381019391810191611b0a565b80955050505050509250929050565b604081525f611b446040830185611895565b90508260208301529392505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f8060408385031215611b91575f80fd5b505080516020909101519092909150565b8082018082111561027c577f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b828152604060208201525f6115976040830184611895565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52605160045260245ffdfe0e7c0ef80f5b11b611bf11c911d211ec11bf1291129112ec13b513c211bf11c913c211bf11c911c911bf11bf11bf11b611b611b611b613cc11bf13f0140911bf13cc11bf11bf13c211c911bf11bf11c9141211bf11c9141211b611c911c911c911c911bf11c911c9141211b611b6141211b611b6141211b611bf11c9141213c213c21412141211b614121412141211c91409" }, "deployedBytecode": { - "object": "0x608060405234801561000f575f80fd5b5060043610610064575f3560e01c80636f5aa28d1161004d5780636f5aa28d146100b0578063a3869e14146100de578063b92d7553146100fe575f80fd5b806301ffc9a7146100685780635514ca2014610090575b5f80fd5b61007b610076366004611619565b610106565b60405190151581526020015b60405180910390f35b6100a361009e366004611658565b610282565b60405161008791906116c4565b6040517f0ae1ecb6c0f6314beaf4d4cd803ba14c900b0eecb1ecd39a52739cff9ae2c34a8152602001610087565b6100f16100ec366004611813565b610347565b60405161008791906118d9565b6100f1610468565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082167f6f5aa28d00000000000000000000000000000000000000000000000000000000148061019857507fffffffff0000000000000000000000000000000000000000000000000000000082167fa3869e1400000000000000000000000000000000000000000000000000000000145b806101e457507fffffffff0000000000000000000000000000000000000000000000000000000082167f5514ca2000000000000000000000000000000000000000000000000000000000145b8061023057507fffffffff0000000000000000000000000000000000000000000000000000000082167fb92d755300000000000000000000000000000000000000000000000000000000145b8061027c57507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b92915050565b604080516020810182526060815290517f5514ca20000000000000000000000000000000000000000000000000000000008152739179445a637e6ae72bb38273944fab96834488dd90635514ca20906102e190869086906004016118eb565b5f60405180830381865afa1580156102fb573d5f803e3d5ffd5b505050506040513d5f823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201604052610340919081019061195a565b9392505050565b6040517f7764fd9c0000000000000000000000000000000000000000000000000000000081526060905f908190739179445a637e6ae72bb38273944fab96834488dd90637764fd9c9061039e9087906004016118d9565b5f60405180830381865afa1580156103b8573d5f803e3d5ffd5b505050506040513d5f823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682016040526103fd9190810190611a39565b915091505f610416838351905160406020909202010190565b60408051602083820181019092528281529192508101610437818686610477565b5f61045b6040518060c0016040528060908152602001611c186090913987876104ba565b5091979650505050505050565b6060610472610879565b905090565b80600182510160200281015b8082101561049e578151855260209485019490910190610483565b50506104b56104aa8390565b848451602001610b4c565b505050565b60605f6104c684610b55565b85519091506020860190600290046104dd86610b6f565b8260020267ffffffffffffffff8111156104f9576104f9611729565b6040519080825280601f01601f191660200182016040528015610523576020820181803683370190505b509350602084015f5b8481101561086d575f806105408a84610d8c565b915091508184538060018501536002840193505f61055f8b848c610daf565b90505f601861056e8d87610e16565b0390505f61057c8d87610e45565b600402820190505b808210156107b757815162ffffff811690601d81901a600f81169160049190911c90601c1a61160f8c82106106015760808801516040517fc8344ab1000000000000000000000000000000000000000000000000000000008152600481019190915260248101839052604481018e90526064015b60405180910390fd5b50600281028d015160f01c5f806106168a8885565b9150915085821461066a5760808a01516040517fddf56071000000000000000000000000000000000000000000000000000000008152600481019190915260248101839052604481018790526064016105f8565b8481146106ba5760808a01516040517ffc8b5603000000000000000000000000000000000000000000000000000000008152600481019190915260248101829052604481018690526064016105f8565b895182111561070c5760808a01518a516040517f2cab6bff00000000000000000000000000000000000000000000000000000000815260048101929092526024820152604481018390526064016105f8565b8951829003808b5260408b0151111561076e5760808a01518a516040808d015190517f1bc5ab0f0000000000000000000000000000000000000000000000000000000081526004810193909352602483019190915260448201526064016105f8565b89518101808b5260208b0151101561078857895160208b01525b600181111561079957895160408b01525b50505060808701805160010190525050506004929092019150610584565b6107c18d87610e5c565b8360200151146108155782602001516107da8e88610e5c565b6040517f4d9c18dc000000000000000000000000000000000000000000000000000000008152600481019290925260248201526044016105f8565b8251841461085c5782516040517f4689f0b30000000000000000000000000000000000000000000000000000000081526004810191909152602481018590526044016105f8565b50506001909301925061052c915050565b50505050509392505050565b606061160f5f604890508091505f6040518061092001604052808467ffffffffffffffff1667ffffffffffffffff168152602001610e748152602001610ef08152602001610f5381526020016111ae81526020016111b781526020016111c181526020016111ca81526020016111e481526020016111b78152602001611289815260200161128981526020016112e481526020016113ad81526020016113ba81526020016111b781526020016111c181526020016113ba81526020016111b781526020016111c181526020016111c181526020016111b781526020016111b781526020016111b781526020016111ae81526020016111ae81526020016111ae81526020016111ae81526020016113c481526020016111b781526020016113e8815260200161140181526020016111b781526020016113c481526020016111b781526020016111b781526020016113ba81526020016111c181526020016111b781526020016111b781526020016111c1815260200161140a81526020016111b781526020016111c1815260200161140a81526020016111ae81526020016111c181526020016111c181526020016111c181526020016111c181526020016111b781526020016111c181526020016111c1815260200161140a81526020016111ae81526020016111ae815260200161140a81526020016111ae81526020016111ae815260200161140a81526020016111b781526020016111c1815260200161140a81526020016113ba81526020016113ba815260200161140a815260200161140a81526020016111ae815260200161140a815260200161140a815260200161140a81526020016111c18152602001611401815250905060608190506048815114610b3a5780516040517fc8b569010000000000000000000000000000000000000000000000000000000081526004810191909152602481018490526044016105f8565b610b4381611423565b94505050505090565b8083835e505050565b5f81515f03610b6557505f919050565b50602001515f1a90565b5f610b7982610b55565b90508015610d4a5781516001600283020190811115610bc657826040517f17f4bc5e0000000000000000000000000000000000000000000000000000000081526004016105f891906118d9565b82516020828501810191850101602160027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff860102860181019086015b808210610d0657815160f01c8481016004810185811115610c5157896040517e39ba560000000000000000000000000000000000000000000000000000000081526004016105f891906118d9565b81515f81901a90600181901a90600281901a9060031a80821180610c7457508281115b15610caf578d876040517feaf45f4f0000000000000000000000000000000000000000000000000000000081526004016105f8929190611b2a565b505050600481028201878114610cf3578b6040517ffbb8027a0000000000000000000000000000000000000000000000000000000081526004016105f891906118d9565b8397506002870396505050505050610c03565b838314610d4157866040517fde67b29a0000000000000000000000000000000000000000000000000000000081526004016105f891906118d9565b50505050505050565b600182511115610d8857816040517fd013da5d0000000000000000000000000000000000000000000000000000000081526004016105f891906118d9565b5050565b5f805f610d998585610e16565b51600281901a9660039190911a95509350505050565b610de46040518060c001604052805f81526020015f81526020015f8152602001606081526020015f8152602001606081525090565b506040805160c081018252838152602081018490529081019290925260608201525f608082015260a081019190915290565b5f80610e2184610b55565b60020260010190505f610e3485856114b3565b949091019093016020019392505050565b5f80610e518484610e16565b515f1a949350505050565b5f80610e688484610e16565b5160011a949350505050565b81515f90819061ffff8416908110610ecf57608085015185516040517feaa16f3300000000000000000000000000000000000000000000000000000000815260048101929092526024820152604481018290526064016105f8565b8460400151811115610ee357604085018190525b505f946001945092505050565b6060820151515f90819061ffff8416908110610ee35760808501516060860151516040517feb78945400000000000000000000000000000000000000000000000000000000815260048101929092526024820152604481018290526064016105f8565b6060820151515f90819061ffff8416908110610fb65760808501516060860151516040517feb78945400000000000000000000000000000000000000000000000000000000815260048101929092526024820152604481018290526064016105f8565b5f85606001518281518110610fcd57610fcd611b4b565b602002602001015190505f80610fe6839060a082901c90565b91509150611014827f18003f8e00000000000000000000000000000000000000000000000000000000611509565b611062576040517f23016c8900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff831660048201526024016105f8565b6040517f40c04edc00000000000000000000000000000000000000000000000000000000815260048101829052600f601089901c81166024830181905260148a901c9091166044830181905290915f90819073ffffffffffffffffffffffffffffffffffffffff8716906340c04edc906064016040805180830381865afa1580156110ef573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111139190611b78565b9150915083821461115a576040517f528cc0fb00000000000000000000000000000000000000000000000000000000815260048101859052602481018390526044016105f8565b82811461119d576040517fc5ff08dc00000000000000000000000000000000000000000000000000000000815260048101849052602481018290526044016105f8565b909b909a5098505050505050505050565b505f9160019150565b5060029160019150565b50600191829150565b5f806111d684846111e4565b506001958695509350505050565b5f8060ff83811690600885901c1680830361122b576040517f46f0ca6900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6101006112388284611b9a565b111561127a576040517f8abcdd3f00000000000000000000000000000000000000000000000000000000815260048101839052602481018290526044016105f8565b50600295600195509350505050565b5f8061ffff831660ff81118061129d575080155b156112d7576040517fc1be16a1000000000000000000000000000000000000000000000000000000008152600481018290526024016105f8565b5060019485945092505050565b60a08201515f90819061ffff841690600f601486901c811691601087901c90911690849081906113149086610d8c565b9150915081831461135b576040517f9199e58e00000000000000000000000000000000000000000000000000000000815260048101849052602481018390526044016105f8565b8381101561139f576040517fff13710800000000000000000000000000000000000000000000000000000000815260048101829052602481018590526044016105f8565b509791965090945050505050565b60101c600f169160019150565b5060039160019150565b5f80600f601084901c16806113da5760016113dc565b805b95600195509350505050565b5f80600f601084901c16600281116113da5760026113dc565b506002915f9150565b5f80600f601084901c16600181116113da5760026113dc565b60605f825160020267ffffffffffffffff81111561144357611443611729565b6040519080825280601f01601f19166020018201604052801561146d576020820181803683370190505b50905061ffff80196020850160208651028101600285015b818310156114a757805183518616908516178152602090920191600201611485565b50939695505050505050565b5f6114bd83610b55565b82106114f95781836040517ffcfaeff10000000000000000000000000000000000000000000000000000000081526004016105f8929190611bd2565b50600202016003015161ffff1690565b5f61151383611524565b80156103405750610340838361159e565b5f61154f827f01ffc9a70000000000000000000000000000000000000000000000000000000061159e565b15611597575f80611580847fffffffff000000000000000000000000000000000000000000000000000000006115c2565b9150915081801561158f575080155b949350505050565b505f919050565b5f805f6115ab85856115c2565b915091508180156115b95750805b95945050505050565b7f01ffc9a7000000000000000000000000000000000000000000000000000000005f818152600483905290819060208260248188617530fa92505f511515601f3d11169150509250929050565b611617611bea565b565b5f60208284031215611629575f80fd5b81357fffffffff0000000000000000000000000000000000000000000000000000000081168114610340575f80fd5b5f8060208385031215611669575f80fd5b823567ffffffffffffffff80821115611680575f80fd5b818501915085601f830112611693575f80fd5b8135818111156116a1575f80fd5b8660208285010111156116b2575f80fd5b60209290920196919550909350505050565b602080825282518282018290528051604084018190525f9291820190839060608601905b8083101561171e57835173ffffffffffffffffffffffffffffffffffffffff1682529284019260019290920191908401906116e8565b509695505050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6040516020810167ffffffffffffffff8111828210171561177957611779611729565b60405290565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156117c6576117c6611729565b604052919050565b5f67ffffffffffffffff8211156117e7576117e7611729565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b5f60208284031215611823575f80fd5b813567ffffffffffffffff811115611839575f80fd5b8201601f81018413611849575f80fd5b803561185c611857826117ce565b61177f565b818152856020838501011115611870575f80fd5b816020840160208301375f91810160200191909152949350505050565b5f81518084528060208401602086015e5f6020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b602081525f610340602083018461188d565b60208152816020820152818360408301375f818301604090810191909152601f9092017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0160101919050565b5f67ffffffffffffffff82111561195057611950611729565b5060051b60200190565b5f602080838503121561196b575f80fd5b825167ffffffffffffffff80821115611982575f80fd5b8185019150828287031215611995575f80fd5b61199d611756565b8251828111156119ab575f80fd5b80840193505086601f8401126119bf575f80fd5b825191506119cf61185783611937565b82815260059290921b830184019184810190888411156119ed575f80fd5b938501935b83851015611a2c57845173ffffffffffffffffffffffffffffffffffffffff81168114611a1d575f80fd5b825293850193908501906119f2565b8252509695505050505050565b5f8060408385031215611a4a575f80fd5b825167ffffffffffffffff80821115611a61575f80fd5b818501915085601f830112611a74575f80fd5b81516020611a84611857836117ce565b8281528882848701011115611a97575f80fd5b828286018383015e5f81840183015287820151909650935082841115611abb575f80fd5b838701935087601f850112611ace575f80fd5b83519250611ade61185784611937565b83815260059390931b8401810192818101925088841115611afd575f80fd5b938101935b83851015611b1b57845183529381019391810191611b02565b80955050505050509250929050565b604081525f611b3c604083018561188d565b90508260208301529392505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f8060408385031215611b89575f80fd5b505080516020909101519092909150565b8082018082111561027c577f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b828152604060208201525f61158f604083018461188d565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52605160045260245ffdfe0e740ef00f5311ae11b711c111ca11e411b71289128912e413ad13ba11b711c113ba11b711c111c111b711b711b711ae11ae11ae11ae13c411b713e8140111b713c411b711b713ba11c111b711b711c1140a11b711c1140a11ae11c111c111c111c111b711c111c1140a11ae11ae140a11ae11ae140a11b711c1140a13ba13ba140a140a11ae140a140a140a11c11401" + "object": "0x608060405234801561000f575f80fd5b5060043610610064575f3560e01c80636f5aa28d1161004d5780636f5aa28d146100b0578063a3869e14146100de578063b92d7553146100fe575f80fd5b806301ffc9a7146100685780635514ca2014610090575b5f80fd5b61007b610076366004611621565b610106565b60405190151581526020015b60405180910390f35b6100a361009e366004611660565b610282565b60405161008791906116cc565b6040517fc5a28e7d9dcddeae423dae076cbc7510e07229c5aac6e894727caa6ebf1353fa8152602001610087565b6100f16100ec36600461181b565b610347565b60405161008791906118e1565b6100f1610468565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082167f6f5aa28d00000000000000000000000000000000000000000000000000000000148061019857507fffffffff0000000000000000000000000000000000000000000000000000000082167fa3869e1400000000000000000000000000000000000000000000000000000000145b806101e457507fffffffff0000000000000000000000000000000000000000000000000000000082167f5514ca2000000000000000000000000000000000000000000000000000000000145b8061023057507fffffffff0000000000000000000000000000000000000000000000000000000082167fb92d755300000000000000000000000000000000000000000000000000000000145b8061027c57507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b92915050565b604080516020810182526060815290517f5514ca2000000000000000000000000000000000000000000000000000000000815273088bdb2b554e3cdeda4137beef92ffee1e9f4dbf90635514ca20906102e190869086906004016118f3565b5f60405180830381865afa1580156102fb573d5f803e3d5ffd5b505050506040513d5f823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682016040526103409190810190611962565b9392505050565b6040517f7764fd9c0000000000000000000000000000000000000000000000000000000081526060905f90819073088bdb2b554e3cdeda4137beef92ffee1e9f4dbf90637764fd9c9061039e9087906004016118e1565b5f60405180830381865afa1580156103b8573d5f803e3d5ffd5b505050506040513d5f823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682016040526103fd9190810190611a41565b915091505f610416838351905160406020909202010190565b60408051602083820181019092528281529192508101610437818686610477565b5f61045b6040518060c0016040528060928152602001611c206092913987876104ba565b5091979650505050505050565b6060610472610879565b905090565b80600182510160200281015b8082101561049e578151855260209485019490910190610483565b50506104b56104aa8390565b848451602001610b54565b505050565b60605f6104c684610b5d565b85519091506020860190600290046104dd86610b77565b8260020267ffffffffffffffff8111156104f9576104f9611731565b6040519080825280601f01601f191660200182016040528015610523576020820181803683370190505b509350602084015f5b8481101561086d575f806105408a84610d94565b915091508184538060018501536002840193505f61055f8b848c610db7565b90505f601861056e8d87610e1e565b0390505f61057c8d87610e4d565b600402820190505b808210156107b757815162ffffff811690601d81901a600f81169160049190911c90601c1a6116178c82106106015760808801516040517fc8344ab1000000000000000000000000000000000000000000000000000000008152600481019190915260248101839052604481018e90526064015b60405180910390fd5b50600281028d015160f01c5f806106168a8885565b9150915085821461066a5760808a01516040517fddf56071000000000000000000000000000000000000000000000000000000008152600481019190915260248101839052604481018790526064016105f8565b8481146106ba5760808a01516040517ffc8b5603000000000000000000000000000000000000000000000000000000008152600481019190915260248101829052604481018690526064016105f8565b895182111561070c5760808a01518a516040517f2cab6bff00000000000000000000000000000000000000000000000000000000815260048101929092526024820152604481018390526064016105f8565b8951829003808b5260408b0151111561076e5760808a01518a516040808d015190517f1bc5ab0f0000000000000000000000000000000000000000000000000000000081526004810193909352602483019190915260448201526064016105f8565b89518101808b5260208b0151101561078857895160208b01525b600181111561079957895160408b01525b50505060808701805160010190525050506004929092019150610584565b6107c18d87610e64565b8360200151146108155782602001516107da8e88610e64565b6040517f4d9c18dc000000000000000000000000000000000000000000000000000000008152600481019290925260248201526044016105f8565b8251841461085c5782516040517f4689f0b30000000000000000000000000000000000000000000000000000000081526004810191909152602481018590526044016105f8565b50506001909301925061052c915050565b50505050509392505050565b60606116175f604990508091505f6040518061094001604052808467ffffffffffffffff1667ffffffffffffffff168152602001610e7c8152602001610ef88152602001610f5b81526020016111b681526020016111bf81526020016111c981526020016111d281526020016111ec81526020016111bf8152602001611291815260200161129181526020016112ec81526020016113b581526020016113c281526020016111bf81526020016111c981526020016113c281526020016111bf81526020016111c981526020016111c981526020016111bf81526020016111bf81526020016111bf81526020016111b681526020016111b681526020016111b681526020016111b681526020016113cc81526020016111bf81526020016113f0815260200161140981526020016111bf81526020016113cc81526020016111bf81526020016111bf81526020016113c281526020016111c981526020016111bf81526020016111bf81526020016111c9815260200161141281526020016111bf81526020016111c9815260200161141281526020016111b681526020016111c981526020016111c981526020016111c981526020016111c981526020016111bf81526020016111c981526020016111c9815260200161141281526020016111b681526020016111b6815260200161141281526020016111b681526020016111b6815260200161141281526020016111b681526020016111bf81526020016111c9815260200161141281526020016113c281526020016113c28152602001611412815260200161141281526020016111b681526020016114128152602001611412815260200161141281526020016111c98152602001611409815250905060608190506049815114610b425780516040517fc8b569010000000000000000000000000000000000000000000000000000000081526004810191909152602481018490526044016105f8565b610b4b8161142b565b94505050505090565b8083835e505050565b5f81515f03610b6d57505f919050565b50602001515f1a90565b5f610b8182610b5d565b90508015610d525781516001600283020190811115610bce57826040517f17f4bc5e0000000000000000000000000000000000000000000000000000000081526004016105f891906118e1565b82516020828501810191850101602160027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff860102860181019086015b808210610d0e57815160f01c8481016004810185811115610c5957896040517e39ba560000000000000000000000000000000000000000000000000000000081526004016105f891906118e1565b81515f81901a90600181901a90600281901a9060031a80821180610c7c57508281115b15610cb7578d876040517feaf45f4f0000000000000000000000000000000000000000000000000000000081526004016105f8929190611b32565b505050600481028201878114610cfb578b6040517ffbb8027a0000000000000000000000000000000000000000000000000000000081526004016105f891906118e1565b8397506002870396505050505050610c0b565b838314610d4957866040517fde67b29a0000000000000000000000000000000000000000000000000000000081526004016105f891906118e1565b50505050505050565b600182511115610d9057816040517fd013da5d0000000000000000000000000000000000000000000000000000000081526004016105f891906118e1565b5050565b5f805f610da18585610e1e565b51600281901a9660039190911a95509350505050565b610dec6040518060c001604052805f81526020015f81526020015f8152602001606081526020015f8152602001606081525090565b506040805160c081018252838152602081018490529081019290925260608201525f608082015260a081019190915290565b5f80610e2984610b5d565b60020260010190505f610e3c85856114bb565b949091019093016020019392505050565b5f80610e598484610e1e565b515f1a949350505050565b5f80610e708484610e1e565b5160011a949350505050565b81515f90819061ffff8416908110610ed757608085015185516040517feaa16f3300000000000000000000000000000000000000000000000000000000815260048101929092526024820152604481018290526064016105f8565b8460400151811115610eeb57604085018190525b505f946001945092505050565b6060820151515f90819061ffff8416908110610eeb5760808501516060860151516040517feb78945400000000000000000000000000000000000000000000000000000000815260048101929092526024820152604481018290526064016105f8565b6060820151515f90819061ffff8416908110610fbe5760808501516060860151516040517feb78945400000000000000000000000000000000000000000000000000000000815260048101929092526024820152604481018290526064016105f8565b5f85606001518281518110610fd557610fd5611b53565b602002602001015190505f80610fee839060a082901c90565b9150915061101c827f18003f8e00000000000000000000000000000000000000000000000000000000611511565b61106a576040517f23016c8900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff831660048201526024016105f8565b6040517f40c04edc00000000000000000000000000000000000000000000000000000000815260048101829052600f601089901c81166024830181905260148a901c9091166044830181905290915f90819073ffffffffffffffffffffffffffffffffffffffff8716906340c04edc906064016040805180830381865afa1580156110f7573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061111b9190611b80565b91509150838214611162576040517f528cc0fb00000000000000000000000000000000000000000000000000000000815260048101859052602481018390526044016105f8565b8281146111a5576040517fc5ff08dc00000000000000000000000000000000000000000000000000000000815260048101849052602481018290526044016105f8565b909b909a5098505050505050505050565b505f9160019150565b5060029160019150565b50600191829150565b5f806111de84846111ec565b506001958695509350505050565b5f8060ff83811690600885901c16808303611233576040517f46f0ca6900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6101006112408284611ba2565b1115611282576040517f8abcdd3f00000000000000000000000000000000000000000000000000000000815260048101839052602481018290526044016105f8565b50600295600195509350505050565b5f8061ffff831660ff8111806112a5575080155b156112df576040517fc1be16a1000000000000000000000000000000000000000000000000000000008152600481018290526024016105f8565b5060019485945092505050565b60a08201515f90819061ffff841690600f601486901c811691601087901c909116908490819061131c9086610d94565b91509150818314611363576040517f9199e58e00000000000000000000000000000000000000000000000000000000815260048101849052602481018390526044016105f8565b838110156113a7576040517fff13710800000000000000000000000000000000000000000000000000000000815260048101829052602481018590526044016105f8565b509791965090945050505050565b60101c600f169160019150565b5060039160019150565b5f80600f601084901c16806113e25760016113e4565b805b95600195509350505050565b5f80600f601084901c16600281116113e25760026113e4565b506002915f9150565b5f80600f601084901c16600181116113e25760026113e4565b60605f825160020267ffffffffffffffff81111561144b5761144b611731565b6040519080825280601f01601f191660200182016040528015611475576020820181803683370190505b50905061ffff80196020850160208651028101600285015b818310156114af5780518351861690851617815260209092019160020161148d565b50939695505050505050565b5f6114c583610b5d565b82106115015781836040517ffcfaeff10000000000000000000000000000000000000000000000000000000081526004016105f8929190611bda565b50600202016003015161ffff1690565b5f61151b8361152c565b8015610340575061034083836115a6565b5f611557827f01ffc9a7000000000000000000000000000000000000000000000000000000006115a6565b1561159f575f80611588847fffffffff000000000000000000000000000000000000000000000000000000006115ca565b91509150818015611597575080155b949350505050565b505f919050565b5f805f6115b385856115ca565b915091508180156115c15750805b95945050505050565b7f01ffc9a7000000000000000000000000000000000000000000000000000000005f818152600483905290819060208260248188617530fa92505f511515601f3d11169150509250929050565b61161f611bf2565b565b5f60208284031215611631575f80fd5b81357fffffffff0000000000000000000000000000000000000000000000000000000081168114610340575f80fd5b5f8060208385031215611671575f80fd5b823567ffffffffffffffff80821115611688575f80fd5b818501915085601f83011261169b575f80fd5b8135818111156116a9575f80fd5b8660208285010111156116ba575f80fd5b60209290920196919550909350505050565b602080825282518282018290528051604084018190525f9291820190839060608601905b8083101561172657835173ffffffffffffffffffffffffffffffffffffffff1682529284019260019290920191908401906116f0565b509695505050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6040516020810167ffffffffffffffff8111828210171561178157611781611731565b60405290565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156117ce576117ce611731565b604052919050565b5f67ffffffffffffffff8211156117ef576117ef611731565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b5f6020828403121561182b575f80fd5b813567ffffffffffffffff811115611841575f80fd5b8201601f81018413611851575f80fd5b803561186461185f826117d6565b611787565b818152856020838501011115611878575f80fd5b816020840160208301375f91810160200191909152949350505050565b5f81518084528060208401602086015e5f6020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b602081525f6103406020830184611895565b60208152816020820152818360408301375f818301604090810191909152601f9092017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0160101919050565b5f67ffffffffffffffff82111561195857611958611731565b5060051b60200190565b5f6020808385031215611973575f80fd5b825167ffffffffffffffff8082111561198a575f80fd5b818501915082828703121561199d575f80fd5b6119a561175e565b8251828111156119b3575f80fd5b80840193505086601f8401126119c7575f80fd5b825191506119d761185f8361193f565b82815260059290921b830184019184810190888411156119f5575f80fd5b938501935b83851015611a3457845173ffffffffffffffffffffffffffffffffffffffff81168114611a25575f80fd5b825293850193908501906119fa565b8252509695505050505050565b5f8060408385031215611a52575f80fd5b825167ffffffffffffffff80821115611a69575f80fd5b818501915085601f830112611a7c575f80fd5b81516020611a8c61185f836117d6565b8281528882848701011115611a9f575f80fd5b828286018383015e5f81840183015287820151909650935082841115611ac3575f80fd5b838701935087601f850112611ad6575f80fd5b83519250611ae661185f8461193f565b83815260059390931b8401810192818101925088841115611b05575f80fd5b938101935b83851015611b2357845183529381019391810191611b0a565b80955050505050509250929050565b604081525f611b446040830185611895565b90508260208301529392505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f8060408385031215611b91575f80fd5b505080516020909101519092909150565b8082018082111561027c577f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b828152604060208201525f6115976040830184611895565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52605160045260245ffdfe0e7c0ef80f5b11b611bf11c911d211ec11bf1291129112ec13b513c211bf11c913c211bf11c911c911bf11bf11bf11b611b611b611b613cc11bf13f0140911bf13cc11bf11bf13c211c911bf11bf11c9141211bf11c9141211b611c911c911c911c911bf11c911c9141211b611b6141211b611b6141211b611bf11c9141213c213c21412141211b614121412141211c91409" } } diff --git a/crates/test_fixtures/abi/RainlangInterpreter.json b/crates/test_fixtures/abi/RainlangInterpreter.json index 9c0df17cb..f9946c65b 100644 --- a/crates/test_fixtures/abi/RainlangInterpreter.json +++ b/crates/test_fixtures/abi/RainlangInterpreter.json @@ -399,9 +399,9 @@ } ], "bytecode": { - "object": "0x608060405234801561000f575f80fd5b5061001861003d565b515f0361003857604051632413c92160e01b815260040160405180910390fd5b61005d565b60606040518060c0016040528060908152602001615d7760909139905090565b615d0d8061006a5f395ff3fe608060405234801561000f575f80fd5b506004361061003f575f3560e01c806301ffc9a714610043578063514b5d4f1461006b578063d04dfe2314610080575b5f80fd5b6100566100513660046154a0565b6100a1565b60405190151581526020015b60405180910390f35b610073610185565b604051610062919061552b565b61009361008e36600461553d565b610194565b6040516100629291906155ae565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082167fd04dfe2300000000000000000000000000000000000000000000000000000000148061013357507fffffffff0000000000000000000000000000000000000000000000000000000082167f514b5d4f00000000000000000000000000000000000000000000000000000000145b8061017f57507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b92915050565b606061018f610390565b905090565b6060805f61021b84830135602086018035906101b09088615627565b6101bd6080890189615642565b6101c691615745565b6101ce61063c565b6101db60408b018b615808565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525092979695949392505061065c9050565b9050600261022c60c0860186615642565b610237929150615896565b156102895761024960c0850185615642565b6040517f01c71f3d000000000000000000000000000000000000000000000000000000008152610280925060040190815260200190565b60405180910390fd5b5f5b61029860c0860186615642565b905081101561031b576060820151610304906102b760c0880188615642565b848181106102c7576102c76158a9565b90506020020135878060c001906102de9190615642565b6102e9866001615903565b8181106102f8576102f86158a9565b905060200201356107a7565b6060830152610314600282615903565b905061028b565b5061038661032c60a0860186615642565b808060200260200160405190810160405280939291908181526020018383602002808284375f92019190915250859392507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff91505061087d565b9250925050915091565b6040805161092081018252604880825261097c60208301526109cb92820192909252610a0d606082810191909152610bce6080830152610c4e60a0830152610c6060c0830152610c7860e0830152610cba610100830152610d0f610120830152610d21610140830152610d33610160830152610d45610180830152610dea6101a0830152610e276101c0830152610ff36101e083015261115d6102008301526112486102208301526113ea61024083018190526115396102608401526116096102808401526116cd6102a084015261181c6102c08401526102e083015261190a6103008301526119396103208301819052610340830152611968610360830152611997610380830152611a1f6103a0830152611a336103c0830152611b206103e0830152611b84610400830152611b9c610420830152611c17610440830152611c2f610460830152611c47610480830152611c806104a0830152611caa6104c0830152611cc26104e0830152611cda610500830152611ce7610520830152611de2610540830152611e04610560830152611e11610580830152611ec96105a0830152611f186105c0830152611f5b6105e0830152611f7f610600830152611f8c610620830152611f9961064083015261203261066083015261207b6106808301526120886106a08301526121076106c08301526121566106e08301526121a56107008301526121f26107208301526122416107408301526122906107608301526123486107808301526123746107a08301526123966107c083015261244e6107e083015261248f6108008301526124b661082083015261250361084083015261255061086083015261259f6108808301526125ec6108a08301526126396108c08301526126866108e08301526127776109008301529190819080610633816127a9565b94505050505090565b60606040518060c0016040528060908152602001615c7d60909139905090565b6106bd60405180610120016040528060608152602001606081526020015f81526020015f81526020015f81526020015f73ffffffffffffffffffffffffffffffffffffffff1681526020016060815260200160608152602001606081525090565b602087810180516040600191820184028b018181015182515f91821a808252948501870281019093526041808301968381019593600285020190910191908401905b8381101561073d57875160f01c83015160408051600192831a80825283016020908102909101918290529084526002909901989290920191016106ff565b505050506040518061012001604052808281526020018481526020018b81526020015f81526020018a81526020018973ffffffffffffffffffffffffffffffffffffffff168152602001888152602001838152602001878152509450505050509695505050505050565b5f82815260208120600f900660100284811c61ffff1690815b82156107da57825186146107da57604083015192506107c0565b821580156108285760405193506060840160405286845285602085015281604085015260028860f01c0161ffff60f01b1989168160f01b1798505061ffff831b19881684841b17975061082f565b8560208501525b50505061ffff811115610871576040517fcadaf56d00000000000000000000000000000000000000000000000000000000815260048101829052602401610280565b849150505b9392505050565b6060805f806108948760e00151886040015161282d565b915091505f80885f01518960400151815181106108b3576108b36158a9565b60200260200101519150819050838851146109075787516040517fd628439f000000000000000000000000000000000000000000000000000000008152610280918691600401918252602082015260400190565b87511561092c575f60208951028203915060208901905061092a81838b51612850565b505b61093c898a60400151838561285c565b90505f83881061094c578361094e565b875b90506060602083039050818152806109698c60600151612aed565b975097505050505050505b935093915050565b604083015183516020600192830181029091015161ffff8516909201029003517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0909101908152809392505050565b60208084015161ffff841660010190910201517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0909101908152809392505050565b602083015180515f9161ffff851691600f601087901c811692601488901c9091169185919085908110610a4257610a426158a9565b602002602001015190505f80610a5b839060a082901c90565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08a0180518882526040517f58c07152000000000000000000000000000000000000000000000000000000008152939550919350915f9073ffffffffffffffffffffffffffffffffffffffff8616906358c0715290610ae09087908790600401615916565b5f60405180830381865afa158015610afa573d5f803e3d5ffd5b505050506040513d5f823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201604052610b3f9190810190615936565b905080518714610b885780516040517fc3385cb0000000000000000000000000000000000000000000000000000000008152610280918991600401918252602082015260400190565b818352602088028b019a50602081016020880281015b80821015610bbb5760208d039c5081518d52602082019150610b9e565b509a9d9c50505050505050505050505050565b60c083015180515f9160ff85811692600887901c90911691849184908110610bf857610bf86158a9565b60200260200101518281518110610c1157610c116158a9565b60209081029190910101517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0909501948552509295945050505050565b60208101805182511681529392505050565b80515f90610c6d81612d60565b835250909392505050565b80516001600884901c60ff9081169190911b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0193161c919091168152919050565b805160209091018051600160ff600886901c81169190911b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01941684811b199091169390921690911b919091178152919050565b60208101805182511781529392505050565b805161ffff83161b8152809392505050565b805161ffff83161c8152809392505050565b8251600161ffff841690810160209081028301515f93600f601088901c811693601489901c90911692908190850288015b80891015610d935760208203915088518252602089019850610d76565b5060408a01805190879052610daa8b82848661285c565b60408c0182905260208602998a9003999092508201895b81841015610dd9578351815260209384019301610dc1565b50989b9a5050505050505050505050565b60109190911c600f166020028082207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09190920101908152919050565b805160208201516040909201805190925f929173ffffffffffffffffffffffffffffffffffffffff83168314610e8c576040517f0255ddd800000000000000000000000000000000000000000000000000000000815260048101849052602401610280565b8173ffffffffffffffffffffffffffffffffffffffff168214610ede576040517f0255ddd800000000000000000000000000000000000000000000000000000000815260048101839052602401610280565b8073ffffffffffffffffffffffffffffffffffffffff168114610f30576040517f0255ddd800000000000000000000000000000000000000000000000000000000815260048101829052602401610280565b6040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff838116600483015282811660248301525f919085169063dd62ed3e90604401602060405180830381865afa158015610fa5573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610fc991906159b7565b90505f610fd585612e38565b90505f610fe28383612ee1565b508852509598975050505050505050565b80516020909101805190915f9173ffffffffffffffffffffffffffffffffffffffff82168214611052576040517f0255ddd800000000000000000000000000000000000000000000000000000000815260048101839052602401610280565b8073ffffffffffffffffffffffffffffffffffffffff1681146110a4576040517f0255ddd800000000000000000000000000000000000000000000000000000000815260048101829052602401610280565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff82811660048301525f91908416906370a0823190602401602060405180830381865afa158015611111573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061113591906159b7565b90505f61114184612e38565b90505f61114e8383612f22565b87525094979650505050505050565b80515f9073ffffffffffffffffffffffffffffffffffffffff811681146111b3576040517f0255ddd800000000000000000000000000000000000000000000000000000000815260048101829052602401610280565b5f8173ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156111fd573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061122191906159b7565b90505f61122d83612e38565b90505f61123a8383612f22565b865250939695505050505050565b805160208201516040909201805190925f929173ffffffffffffffffffffffffffffffffffffffff831683146112ad576040517f0255ddd800000000000000000000000000000000000000000000000000000000815260048101849052602401610280565b8173ffffffffffffffffffffffffffffffffffffffff1682146112ff576040517f0255ddd800000000000000000000000000000000000000000000000000000000815260048101839052602401610280565b8073ffffffffffffffffffffffffffffffffffffffff168114611351576040517f0255ddd800000000000000000000000000000000000000000000000000000000815260048101829052602401610280565b6040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff838116600483015282811660248301525f919085169063dd62ed3e90604401602060405180830381865afa1580156113c6573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061123a91906159b7565b80516020909101805190915f9173ffffffffffffffffffffffffffffffffffffffff82168214611449576040517f0255ddd800000000000000000000000000000000000000000000000000000000815260048101839052602401610280565b8073ffffffffffffffffffffffffffffffffffffffff16811461149b576040517f0255ddd800000000000000000000000000000000000000000000000000000000815260048101829052602401610280565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff82811660048301525f91908416906370a0823190602401602060405180830381865afa158015611508573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061152c91906159b7565b8552509295945050505050565b80515f9073ffffffffffffffffffffffffffffffffffffffff8116811461158f576040517f0255ddd800000000000000000000000000000000000000000000000000000000815260048101829052602401610280565b5f8173ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156115d9573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115fd91906159b7565b84525091949350505050565b80515f9073ffffffffffffffffffffffffffffffffffffffff8116811461165f576040517f0255ddd800000000000000000000000000000000000000000000000000000000815260048101829052602401610280565b5f8173ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156116a9573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115fd91906159ce565b80516020909101805190915f9173ffffffffffffffffffffffffffffffffffffffff8216821461172c576040517f0255ddd800000000000000000000000000000000000000000000000000000000815260048101839052602401610280565b8073ffffffffffffffffffffffffffffffffffffffff16811461177e576040517f0255ddd800000000000000000000000000000000000000000000000000000000815260048101829052602401610280565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff82811660048301525f91908416906370a0823190602401602060405180830381865afa1580156117eb573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061180f91906159b7565b90505f61123a825f612f22565b80516020909101805190915f9173ffffffffffffffffffffffffffffffffffffffff8216821461187b576040517f0255ddd800000000000000000000000000000000000000000000000000000000815260048101839052602401610280565b6040517f6352211e000000000000000000000000000000000000000000000000000000008152600481018290525f9073ffffffffffffffffffffffffffffffffffffffff841690636352211e90602401602060405180830381865afa1580156118e6573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061152c91906159ce565b437fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09190910190815292915050565b427fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09190910190815292915050565b467fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09190910190815292915050565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe06020600f601085901c1602828101918201925f928391905b80821015611a1357815192507bffffffffffffffffffffffffffffffffffffffffffffffffffffffff831615611a0857828652611a13565b8160200191506119d0565b50939695505050505050565b805160209091018051909114815292915050565b5f805f80805f80600f8960101c169350600284069250879150602083850302820190506020831502810397508215611a6a57805194505b5f5b81831015611ab55750815195507bffffffffffffffffffffffffffffffffffffffffffffffffffffffff86161580611aaa5760208301518952611ab5565b826040019250611a6c565b8015611b1157604080518082019091525f6020820152600887901c601f88168083019190915281525b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610280919061552b565b50969998505050505050505050565b805160208201516040909201915f91907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8216611b7a57604080518082019091525f6020820152600882901c601f8316808301919091528152611ade565b5091949350505050565b80516020909101805190915f918261152c8383612f46565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe06020600f601085901c1602828101918201925f928391905b80821015611a1357815192507bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8316611c0c575f8652611a13565b816020019150611bd5565b80516020909101805190915f918261152c8383612f94565b80516020909101805190915f918261152c8383612fe3565b805160407bffffffffffffffffffffffffffffffffffffffffffffffffffffffff90911615156020028203810151910190815292915050565b80515f90817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8216156115fd565b80516020909101805190915f918261152c8383613033565b80516020909101805190915f918261152c8383613082565b80515f90610c6d816130d2565b805160208201516040909201915f91907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff808316601b90810b9160e085811d9291851690910b9084901d611d398484848461311d565b9094509250600f60108a901c1660025b81811015611d9f5789516020909a019996507bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8716601b0b935060e087901d9250611d928686868661311d565b9096509450600101611d49565b5050611dab8484613253565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe098909801978852509598975050505050505050565b80516020909101805190915f916115fd6002611dfe8484613359565b906133bb565b80515f90610c6d81613400565b805160208201516040909201915f91907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff808316601b90810b9160e085811d9291851690910b9084901d611e63848484846134bc565b9094509250600f60108a901c1660025b81811015611d9f5789516020909a019996507bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8716601b0b935060e087901d9250611ebc868686866134bc565b9096509450600101611e73565b7fffffffbe19cfc6ef4f44cf88f14500d013df534fcaad48fca1d5ca47bea26fcc7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09190910190815292915050565b80515f90610c6d7fffffffbe19cfc6ef4f44cf88f14500d013df534fcaad48fca1d5ca47bea26fcc8273c51a14251b0dcf0ae24a96b7153991378938f5f5613ad7565b80515f90610c6d60028273c51a14251b0dcf0ae24a96b7153991378938f5f5613ad7565b80515f90610c6d81613d31565b80515f90610c6d81613dd7565b80516020909101805190915f9182611fb18382613033565b90505f611fbe8382613033565b90505f61201c7fffffffff0000000000000000000000000000000000000000000000000000000573c51a14251b0dcf0ae24a96b7153991378938f5f5612015612006886130d2565b61200f8a6130d2565b90613e22565b9190613ad7565b90508115158315151461123a5761114e81613e67565b80515f906120498161204381613400565b90613e99565b90507bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8116612072575060015b82525092915050565b80515f90610c6d81613ede565b805160208201516040909201915f91906120a28282613f10565b9150600f601086901c1660025b818110156120d557855160209096019592506120cb8484613f10565b93506001016120af565b5050507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0929092019182525092915050565b7f80000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09190910190815292915050565b7f7fffffff7fffffffffffffffffffffffffffffffffffffffffffffffffffffff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09190910190815292915050565b805160208201516040909201915f91906121bf8282613f2c565b9150600f601086901c1660025b818110156120d557855160209096019592506121e88484613f2c565b93506001016121cc565b7f7fffffff800000000000000000000000000000000000000000000000000000007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09190910190815292915050565b7f80000000000000000000000000000000000000000000000000000000000000017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09190910190815292915050565b805160208201516040909201915f91907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff808316601b90810b9160e085811d9291851690910b9084901d6122e284848484613f37565b9094509250600f60108a901c1660025b81811015611d9f5789516020909a019996507bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8716601b0b935060e087901d925061233b86868686613f37565b90965094506001016122f2565b80516020909101805190915f916115fd828273c51a14251b0dcf0ae24a96b7153991378938f5f5613ad7565b80515f90610c6d8173c51a14251b0dcf0ae24a96b7153991378938f5f5614056565b805160208201516040909201915f91907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff808316601b90810b9160e085811d9291851690910b9084901d6123e884848484614082565b9094509250600f60108a901c1660025b81811015611d9f5789516020909a019996507bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8716601b0b935060e087901d925061244186868686614082565b90965094506001016123f8565b805160208201516040909201805190925f929161152c6124888273c51a14251b0dcf0ae24a96b7153991378938f5f5612015866001613359565b8490613e22565b805160208201516040909201805190925f929161152c6124af8383613e22565b8490613359565b805160208201516040909201915f91906124d08183615903565b9150600f601086901c1660025b818110156120d557855160209096019592506124f98385615903565b93506001016124dd565b805160208201516040909201915f919061251d81836159e9565b9150600f601086901c1660025b818110156120d5578551602090960195925061254683856159e9565b935060010161252a565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09190910190815292915050565b805160208201516040909201915f91906125b981836159fc565b9150600f601086901c1660025b818110156120d557855160209096019592506125e283856159fc565b93506001016125c6565b805160208201516040909201915f91906126068183615b31565b9150600f601086901c1660025b818110156120d5578551602090960195925061262f8385615b31565b9350600101612613565b805160208201516040909201915f91906126538183615b3c565b9150600f601086901c1660025b818110156120d5578551602090960195925061267c8385615b3c565b9350600101612660565b805160608401515f91908290819061269e90846140ac565b91509150815f036127685760a087015160808801516040517f295f36d70000000000000000000000000000000000000000000000000000000081526004810191909152602481018590525f9173ffffffffffffffffffffffffffffffffffffffff169063295f36d790604401602060405180830381865afa158015612725573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061274991906159b7565b606089015190915061275c9085836107a7565b6060890152855261276c565b8085525b509295945050505050565b8051602082015160608501516040909301925f9291906127989083836107a7565b606087015250829150509392505050565b60605f825160020267ffffffffffffffff8111156127c9576127c96156a6565b6040519080825280601f01601f1916602001820160405280156127f3576020820181803683370190505b50905061ffff80196020850160208651028101600285015b81831015611a135780518351861690851617815260209092019160020161280b565b5f805f61283a85856140f3565b51600281901a9660039190911a95509350505050565b6020810283835e505050565b5f80856040015190505f805f805f60028b61010001515161287d91906159e9565b60e08c01516101008d0151602080830151600261ffff9b909b168b8102850160219081015160f01c5f93841a9d909d029095019b909b019384015160258086019b50600791831a91821691829003600402909501909401985092965001935090915061549890805b86881015612a675787519050600284825f1a060285015160f01c925062ffffff8160e01c16915061291b8e838e8663ffffffff16565b9b506002848260041a060285015160f01c925062ffffff8160c01c1691506129488e838e8663ffffffff16565b9b506002848260081a060285015160f01c925062ffffff8160a01c1691506129758e838e8663ffffffff16565b9b5060028482600c1a060285015160f01c925062ffffff8160801c1691506129a28e838e8663ffffffff16565b9b506002848260101a060285015160f01c925062ffffff8160601c1691506129cf8e838e8663ffffffff16565b9b506002848260141a060285015160f01c925062ffffff8160401c1691506129fc8e838e8663ffffffff16565b9b506002848260181a060285015160f01c925062ffffff8160201c169150612a298e838e8663ffffffff16565b9b5060028482601c1a060285015160f01c925062ffffff81169150612a538e838e8663ffffffff16565b9b50612a60602089615903565b97506128e5565b612a72601c89615b3c565b9750612a7f8660046159fc565b612a899089615903565b96505b86881015612acf5750508551601c81901a83900660020284015160f01c915062ffffff811690612abb8e838e86565b9b50612ac8600489615903565b9750612a8c565b612adb8d8a8e8e614122565b50999c9b505050505050505050505050565b6040805160f083901c602081810283010190925290815261ffff63ffffffff67ffffffffffffffff6fffffffffffffffffffffffffffffffff612b59565b5f5b8215612b5357825182526020830151602083015260408301519250604082019150612b2d565b50919050565b602085018660101b60901c8015612c49578060401c8015612bc7578060201c8015612b8b57612b888185612b2b565b93505b508086168015612bc5578060101c8015612bac57612ba98186612b2b565b94505b508088168015612bc357612bc08186612b2b565b94505b505b505b508084168015612c47578060201c8015612c0b578060101c8015612bf257612bef8186612b2b565b94505b508088168015612c0957612c068186612b2b565b94505b505b508086168015612c45578060101c8015612c2c57612c298186612b2b565b94505b508088168015612c4357612c408186612b2b565b94505b505b505b505b508682168015612d55578060401c8015612cd3578060201c8015612c97578060101c8015612c7e57612c7b8186612b2b565b94505b508088168015612c9557612c928186612b2b565b94505b505b508086168015612cd1578060101c8015612cb857612cb58186612b2b565b94505b508088168015612ccf57612ccc8186612b2b565b94505b505b505b508084168015612d53578060201c8015612d17578060101c8015612cfe57612cfb8186612b2b565b94505b508088168015612d1557612d128186612b2b565b94505b505b508086168015612d51578060101c8015612d3857612d358186612b2b565b94505b508088168015612d4f57612d4c8186612b2b565b94505b505b505b505b505050505050919050565b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203612d915750610100919050565b507f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f7f5555555555555555555555555555555555555555555555555555555555555555600183901c16909103600281901c7f3333333333333333333333333333333333333333333333333333333333333333908116911601600481901c01167f01010101010101010101010101010101010101010101010101010101010101010260f81c90565b5f612e416141b5565b6040517ff5c36eaf00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8316600482015273200e12d10bb0c5e4a17e7018f0f1161919bb93899063f5c36eaf90602401602060405180830381865afa158015612ebd573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061017f9190615b4f565b5f805f805f612ef0878761425b565b9250925092505f80612f028585613253565b9150915081838015612f115750815b9650965050505050505b9250929050565b5f805f612f2f85856142b7565b91509150612f3d8282614319565b95945050505050565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838116601b90810b9160e086811d9291861690910b9085901d612f8984848484614373565b979650505050505050565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838116601b90810b9160e086811d9291861690910b9085901d612fd78484848461438a565b12979650505050505050565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838116601b90810b9160e086811d9291861690910b9085901d6130268484848461438a565b1315979650505050505050565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838116601b90810b9160e086811d9291861690910b9085901d6130768484848461438a565b13979650505050505050565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838116601b90810b9160e086811d9291861690910b9085901d6130c58484848461438a565b1215979650505050505050565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8216601b0b60e083901d828212156131125761310c828261445e565b90925090505b5f612f3d8383614501565b5f808515841517801561314957865f0361313d578484925092505061324a565b8686925092505061324a565b613153878761455f565b9097509550613162858561455f565b909550935085841315613176579395929492935b838603604c81111561318f57878793509350505061324a565b80600a0a86816131a1576131a1615869565b0595505086850180881860ff90811c151589881890911c1516801561323c57877f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03613223576040517fd556b111000000000000000000000000000000000000000000000000000000008152600481018a905260248101899052604401610280565b600a968790059690980586019760019790970196613240565b8198505b5050868692509250505b94509492505050565b5f601b83900b83148383826132b7577d90e40fbeea1d3a4abc8955e946fe31cdcf66f634e100000000000000000086051561329757620186a0860595506005850194505b8586601b0b146132b257600a86059550846001019450613297565b6132cd565b855f036132cd57505f925060019150612f1b9050565b848560030b14613329575f8512156132ed57505f9250829150612f1b9050565b6040517fd556b1110000000000000000000000000000000000000000000000000000000081526004810183905260248101829052604401610280565b50507bffffffffffffffffffffffffffffffffffffffffffffffffffffffff841660e084901b1791509250929050565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838116601b90810b9160e086811d9291861690910b9085901d848061339e8686868661311d565b915091505f6133ad8383614501565b9a9950505050505050505050565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838116601b90810b9160e086811d9291861690910b9085901d848061339e868686866134bc565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8216601b0b60e083901d82811261343757509192915050565b5f8061344384846145b5565b91509150805f03613458575093949350505050565b5f8113156134b1576134ac82847f161bcca7119915b50764b4abe86529797775a5f17195100000000000000000007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb461311d565b935091505b5f612f898385614501565b5f80835f03613501576040517f7a97930f0000000000000000000000000000000000000000000000000000000081526004810187905260248101869052604401610280565b855f0361351257505f90508061324a565b5f805f806135208a8a61461d565b919b5099509150613531888861461d565b919950975090505f6135428b6148be565b90505f61354e8a6148be565b90507f161bcca7119915b50764b4abe86529797775a5f1719510000000000000000000604c8183101561396b5784156135ac57507f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee80000000000000000009050604b61392a565b6f4b3b4ca85a86c47a098a2240000000008310156136d857678ac7230489e8000083101561363c576402540be40083101561360a57620186a08310156135fa5750620186a0905060056138b3565b506402540be4009050600a6138b3565b655af3107a40008310156136295750655af3107a40009050600e6138b3565b50678ac7230489e80000905060136138b3565b6b204fce5e3e2502611000000083101561368e5769152d02c7e14af6800000831015613677575069152d02c7e14af6800000905060176138b3565b506b204fce5e3e250261100000009050601c6138b3565b6d314dc6448d9338c15b0a000000008310156136bd57506d314dc6448d9338c15b0a00000000905060216138b3565b506f4b3b4ca85a86c47a098a224000000000905060266138b3565b780197d4df19d605767337e9f14d3eec8920e4000000000000008310156137d05773af298d050e4395d69670b12b7f4100000000000083101561376b577172cb5bd86321e38cb6ce6682e8000000000083101561374c57507172cb5bd86321e38cb6ce6682e800000000009050602b6138b3565b5073af298d050e4395d69670b12b7f41000000000000905060306138b3565b76010b46c6cdd6e3e0828f4db456ff0c8ea00000000000008310156137ac575076010b46c6cdd6e3e0828f4db456ff0c8ea0000000000000905060356138b3565b50780197d4df19d605767337e9f14d3eec8920e4000000000000009050603a6138b3565b7c03b58e88c75313ec9d329eaaa18fb92f75215b17100000000000000000831015613866577a026e4d30eccc3215dd8f3157d27e23acbdcfe6800000000000000083101561383e57507a026e4d30eccc3215dd8f3157d27e23acbdcfe680000000000000009050603f6138b3565b507c03b58e88c75313ec9d329eaaa18fb92f75215b17100000000000000000905060446138b3565b7e05a8e89d75252446eb5d5d5b1cc5edf20a1a059e10ca0000000000000000008310156138b357507e05a8e89d75252446eb5d5d5b1cc5edf20a1a059e10ca000000000000000000905060495b8183116138e757600a820491507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff016138b3565b815f0361392a576040517f05e51ecb000000000000000000000000000000000000000000000000000000008152600481018d9052602481018c9052604401610280565b8561396b576040517f05e51ecb000000000000000000000000000000000000000000000000000000008152600481018f9052602481018e9052604401610280565b807f8000000000000000000000000000000000000000000000000000000000000000018d1261399e57808d039c50613a11565b7f80000000000000000000000000000000000000000000000000000000000000009c90038c015f811315613a1157807f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038b136139fe57998a0199613a11565b5f8099509950505050505050505061324a565b5f808e128015613a2057505f8c135b15613a5d577f80000000000000000000000000000000000000000000000000000000000000008e01808d13613a55575f613a59565b808d035b9150505b8b818f01039750613a7a8f8e613a7488878961491f565b8b614a04565b90995097505f811315613ac457604c811315613aa4575f809a509a5050505050505050505061324a565b80600a0a8981613ab657613ab6615869565b059850885f03613ac4575f97505b5096985094965061324a95505050505050565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff848116601b0b9060e086901d908516613b145750600191506108769050565b5f8213613bad57815f03613b7157613b2c855f613033565b15613b66576040517f8be8297200000000000000000000000000000000000000000000000000000000815260048101869052602401610280565b505f91506108769050565b6040517fcceba0f10000000000000000000000000000000000000000000000000000000081526004810183905260248101829052604401610280565b613bb8856001612f46565b8015613bc95750613bc9865f612f94565b15613bd8578592505050610876565b613be2855f613033565b15613c0b57613c02613bf387613ede565b613bfc87613e67565b86613ad7565b92505050610876565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8516601b0b60e086901d5f80613c3e84846145b5565b915091505f613c4e83855f614b0b565b905060015f8080613c858f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8116601b0b9160e09190911d90565b915091505b60018510613ccc5784600116600103613caf57613ca984848484613f37565b90945092505b600185901c9450613cc282828484613f37565b9092509050613c8a565b5f80613cd98f8e8e614c22565b91509150613ce982828a8d613f37565b9092509050613cf98f8383614f57565b9092509050613d0a82828888613f37565b90925090505f613d1a8383614501565b9e5050505050505050505050505050509392505050565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8216601b0b60e083901d828112613d6857509192915050565b5f80613d7484846145b5565b915091505f84128015613d8657508015155b156134b1576134ac82847f161bcca7119915b50764b4abe86529797775a5f17195100000000000000000007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb4614082565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8216601b0b60e083901d82613e0a83836145b5565b9150505f613e188284614501565b9695505050505050565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838116601b90810b9160e086811d9291861690910b9085901d848061339e86868686613f37565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8216601b0b60e083901d61310c828261445e565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838116601b90810b9160e086811d9291861690910b9085901d848061339e86868686614082565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8216601b0b60e083901d61310c82826150c8565b5f613f1b8383612f94565b613f255781610876565b5090919050565b5f613f1b8383613033565b5f8085158415178015613f4f575f92505f915061404c565b613f598487615b6f565b91505f613f65886148be565b90505f613f71876148be565b90505f613f7e8383615121565b5090505f6f0785ee10d5da46d900f436a000000000821115613fb3576f0785ee10d5da46d900f436a000000000820491506025015b670de0b6b3a7640000821115613fd457670de0b6b3a7640000820491506012015b633b9aca00821115613fed57633b9aca00820491506009015b61271082111561400257612710820491506004015b811561401657600a82049150600101614002565b6140208187615b6f565b95506140428b8a61403c878761403787600a615b31565b61491f565b89614a04565b9097509550505050505b5094509492505050565b5f610876837fffffffff0000000000000000000000000000000000000000000000000000000584613ad7565b5f8061408e848461445e565b909450925061409f8686868661311d565b9150915094509492505050565b5f80825f526010600f60205f20060261ffff85821c165b80156140ea57805185036140e15760019350602081015192506140ea565b604001516140c3565b50509250929050565b5f806140fe8461515c565b60020260010190505f6141118585615176565b949091019093016020019392505050565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08201805163ffff0000601087901b1661ffff86161782527f312f5ae588c6ff62cd3f006af06cd48c98d7321649db7d8b2c396a81a204655591905f808686036004017ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8801865afa5090525050505050565b73200e12d10bb0c5e4a17e7018f0f1161919bb93893b158061420c575073200e12d10bb0c5e4a17e7018f0f1161919bb93893f7f1de7d717526cba131d684e312dedbf0852adef9cced9e36798ae4937f7145d4114155b15614259576040517f73e6d7b300000000000000000000000000000000000000000000000000000000815273200e12d10bb0c5e4a17e7018f0f1161919bb93896004820152602401610280565b565b5f808060ff841681037f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8611156142a657600a860460018201600a88065f14935093509350506142b0565b8593509150600190505b9250925092565b5f805f805f6142c6878761425b565b9250925092508061430d576040517fc47179660000000000000000000000000000000000000000000000000000000081526004810184905260248101839052604401610280565b50909590945092505050565b5f805f6143268585613253565b915091508061436b576040517f22c9f7bb0000000000000000000000000000000000000000000000000000000081526004810186905260248101859052604401610280565b509392505050565b5f6143808585858561438a565b1495945050505050565b5f80851584151781871282861218178584141780156143af578685925092505061324a565b505f858413156143c3575092949193919260015b8386035f8112604c82131780156143f65782156143e8575f899450945050505061324a565b885f9450945050505061324a565b600a82900a8981028a82828161440e5761440e615869565b051461443a57841561442a575f8b96509650505050505061324a565b8a5f96509650505050505061324a565b841561444f57889650945061324a9350505050565b955087945061324a9350505050565b5f807f800000000000000000000000000000000000000000000000000000000000000084036144f7577f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83036144ea576040517fd556b1110000000000000000000000000000000000000000000000000000000081526004810185905260248101849052604401610280565b600a840593508260010192505b50505f9190910391565b5f805f61450e8585613253565b915091508015801561451e575081155b1561436b576040517f8eba4d070000000000000000000000000000000000000000000000000000000081526004810186905260248101859052604401610280565b5f805f805f61456e878761461d565b9250925092508061430d576040517f05e51ecb0000000000000000000000000000000000000000000000000000000081526004810188905260248101879052604401610280565b5f805f83126145c857508290505f612f1b565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb48312156145fa57505f905082612f1b565b5f839003600a0a80858161461057614610615869565b0794859003959350505050565b5f805f845f0361463557505f915081905060016142b0565b7f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee800000000000000000085055f03614849576f4b3b4ca85a86c47a098a224000000000850515801561469e57507f80000000000000000000000000000000000000000000000000000000000000268412155b156146bf576f4b3b4ca85a86c47a098a224000000000850294506026840393505b7728c87cb5c89a2571ebfdcb54864ada834a00000000000000850515801561470757507f80000000000000000000000000000000000000000000000000000000000000138412155b1561472057678ac7230489e80000850294506013840393505b7b097edd871cfda3a5697758bf0e3cbb5ac5741c640000000000000000850515801561476c57507f800000000000000000000000000000000000000000000000000000000000000a8412155b15614782576402540be40085029450600a840393505b7e3899162693736ac531a5a58f1fbb4b746504382ca7e400000000000000000085051580156147d157507f80000000000000000000000000000000000000000000000000000000000000028412155b156147e757606485029450600284039350614782565b7f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee8000000000000000000850515801561483757507f80000000000000000000000000000000000000000000000000000000000000018412155b1561484957600a850294506001840393505b600a8086029081058614801561487f57507f80000000000000000000000000000000000000000000000000000000000000018512155b1561488e578095506001850394505b50939492935050507f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee80000000000000000008305151590565b5f8082121561491b577f8000000000000000000000000000000000000000000000000000000000000000820361491557507f8000000000000000000000000000000000000000000000000000000000000000919050565b505f0390565b5090565b5f805f61492c8686615121565b91509150815f036149505783818161494657614946615869565b0492505050610876565b83821061499a576040517f6c59da12000000000000000000000000000000000000000000000000000000008152600481018790526024810186905260448101859052606401610280565b5f84868809600186198101871696879004966002600389028118808a02820302808a02820302808a02820302808a02820302808a02820302808a02909103025f82900382900490920185841190960395909502919093039390930492909217029150509392505050565b5f805f8587181215614ace577f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff841115614abb57614a637f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6001615903565b8403614a9357507f800000000000000000000000000000000000000000000000000000000000000090508161324a565b614a9e600a856159e9565b614aa790615b96565b614ab2846001615b6f565b9150915061324a565b614ac484615b96565b839150915061324a565b7f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff841115614b0157614aa7600a856159e9565b508290508161324a565b5f818303614b1a575082610876565b82821315614b5d57828203604c811380614b3457505f8113155b15614b42575f915050610876565b80600a0a8581614b5457614b54615869565b05915050610876565b818303604c811380614b6f57505f8113155b15614bb7576040517f1d5d6d10000000000000000000000000000000000000000000000000000000008152600481018690526024810185905260448101849052606401610280565b600a81900a85810286828281614bcf57614bcf615869565b0514614c18576040517f1d5d6d10000000000000000000000000000000000000000000000000000000008152600481018890526024810187905260448101869052606401610280565b9250610876915050565b5f808383614c30828261455f565b90965094505f8613614cb157855f03614c75576040517f561fc7b500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517f5d3fd4db0000000000000000000000000000000000000000000000000000000081526004810183905260248101829052604401610280565b5050837f161bcca7119915b50764b4abe86529797775a5f171951000000000000000000003614cef57614ce583604c615b6f565b5f91509150610974565b7f161bcca7119915b50764b4abe86529797775a5f171951000000000000000000084121580614d3e577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb5614d60565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb45b5f0b8412614f1b575f805f805f85614d7957604b614d7c565b604c5b614d86908a615b6f565b90505f8087614db3577d90e40fbeea1d3a4abc8955e946fe31cdcf66f634e1000000000000000000614dd4565b7e05a8e89d75252446eb5d5d5b1cc5edf20a1a059e10ca0000000000000000005b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff169050808c81614e0657614e06615869565b05818102955090850193507ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc18019050614e3f8c826151cc565b7d90e40fbeea1d3a4abc8955e946fe31cdcf66f634e10000000000000000000295508594508a8414614ecb576123278114614ea657614e818c826001016151cc565b7d90e40fbeea1d3a4abc8955e946fe31cdcf66f634e100000000000000000002614ec8565b7f161bcca7119915b50764b4abe86529797775a5f17195100000000000000000005b94505b50614efb838b848c89897fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb4615253565b909a509850614f0c8a8a835f61311d565b97509750505050505050610974565b614f2585856150c8565b9095509350614f35868686614c22565b9095509350614f44858561445e565b9250925050610974565b50935093915050565b5f805f841215614f9357614f6b848461445e565b9094509250614f7b858585614f57565b9094509250614f8a84846150c8565b91509150610974565b5f80614f9f86866145b5565b9092509050845f8080614fb285856152f0565b9194509250905061270d612710614fca600182615bc6565b8514614fe157614fdb8d86866153df565b90925090505b831561506c575f614ff3866001615b6f565b90505b80848583028161500857615008615869565b051461501f57600a84059350600a88059750614ff6565b61506061502c8588615bec565b896150378785615bec565b8f87877ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc615253565b909d509b506150939050565b819b507ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc9a505b5050505050866150a484835f614b0b565b6150af886001615b6f565b6150b99190615b6f565b94509450505050935093915050565b5f806151167f161bcca7119915b50764b4abe86529797775a5f17195100000000000000000007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb486866134bc565b915091509250929050565b5f807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83850993909202808410938190039390930393915050565b5f81515f0361516c57505f919050565b50602001515f1a90565b5f6151808361515c565b82106151bc5781836040517ffcfaeff1000000000000000000000000000000000000000000000000000000008152600401610280929190615c37565b50600202016003015161ffff1690565b5f806151db600a6123286159e9565b6151e69060026159fc565b6151f1906001615903565b90505f615201600a6123286159e9565b90506002600a8504026001015f8052600281601e883c505f51617fff8116935061800081161561523057918101915b505f80526001600a8506600a6064870402018301601f873c50505f510192915050565b5f808888036152665750839050816152e4565b5f805f806152768c8b8f8d614082565b915091505f806152888a8a8d8c614082565b9150915061529884848484613f37565b8096508197505050505050505f806152b28b8b8f8d614082565b915091505f806152c4868686866134bc565b915091505f806152d684848f8e61311d565b909a50985050505050505050505b97509795505050505050565b5f805f837ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0361532857508391505f905060016142b0565b7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8412156153b6577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb084121561538757505f91505082151560016142b0565b5f846004015f03600a0a90505f8187816153a3576153a3615869565b05945050808402861415925090506142b0565b5f84126153cb57505f915081905060016142b0565b50505060048101600a0a82025f60016142b0565b5f808060646153f1600a6123286159e9565b6153fe600a6123286159e9565b6154099060026159fc565b615414906001615903565b61541e9190615903565b6154289190615903565b905061546c565b5f8052600280600a8504028301601e833c5f80516107d0840193505f80526001600a8606600a6064880402018501601f853c5f5101949350505050565b61547785828861542f565b92508315614f4e5761548d60018601828861542f565b915050935093915050565b614259615c4f565b5f602082840312156154b0575f80fd5b81357fffffffff0000000000000000000000000000000000000000000000000000000081168114610876575f80fd5b5f81518084528060208401602086015e5f6020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b602081525f61087660208301846154df565b5f6020828403121561554d575f80fd5b813567ffffffffffffffff811115615563575f80fd5b820160e08185031215610876575f80fd5b5f815180845260208085019450602084015f5b838110156155a357815187529582019590820190600101615587565b509495945050505050565b604081525f6155c06040830185615574565b8281036020848101919091528451808352858201928201905f5b818110156155f6578451835293830193918301916001016155da565b5090979650505050505050565b73ffffffffffffffffffffffffffffffffffffffff81168114615624575f80fd5b50565b5f60208284031215615637575f80fd5b813561087681615603565b5f8083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112615675575f80fd5b83018035915067ffffffffffffffff82111561568f575f80fd5b6020019150600581901b3603821315612f1b575f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff8111828210171561571a5761571a6156a6565b604052919050565b5f67ffffffffffffffff82111561573b5761573b6156a6565b5060051b60200190565b5f61575761575284615722565b6156d3565b83815260208082019190600586811b860136811115615774575f80fd5b865b818110156157fb57803567ffffffffffffffff811115615794575f80fd5b880136601f8201126157a4575f80fd5b80356157b261575282615722565b81815290851b820186019086810190368311156157cd575f80fd5b928701925b828410156157eb578335825292870192908701906157d2565b8952505050948301948301615776565b5092979650505050505050565b5f8083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261583b575f80fd5b83018035915067ffffffffffffffff821115615855575f80fd5b602001915036819003821315612f1b575f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f826158a4576158a4615869565b500690565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b8082018082111561017f5761017f6158d6565b828152604060208201525f61592e6040830184615574565b949350505050565b5f6020808385031215615947575f80fd5b825167ffffffffffffffff81111561595d575f80fd5b8301601f8101851361596d575f80fd5b805161597b61575282615722565b81815260059190911b82018301908381019087831115615999575f80fd5b928401925b82841015612f895783518252928401929084019061599e565b5f602082840312156159c7575f80fd5b5051919050565b5f602082840312156159de575f80fd5b815161087681615603565b5f826159f7576159f7615869565b500490565b808202811582820484141761017f5761017f6158d6565b600181815b80851115615a6c57817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115615a5257615a526158d6565b80851615615a5f57918102915b93841c9390800290615a18565b509250929050565b5f82615a825750600161017f565b81615a8e57505f61017f565b8160018114615aa45760028114615aae57615aca565b600191505061017f565b60ff841115615abf57615abf6158d6565b50506001821b61017f565b5060208310610133831016604e8410600b8410161715615aed575081810a61017f565b615af78383615a13565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115615b2957615b296158d6565b029392505050565b5f6108768383615a74565b8181038181111561017f5761017f6158d6565b5f60208284031215615b5f575f80fd5b815160ff81168114610876575f80fd5b8082018281125f831280158216821582161715615b8e57615b8e6158d6565b505092915050565b5f7f80000000000000000000000000000000000000000000000000000000000000008203614915576149156158d6565b8181035f831280158383131683831282161715615be557615be56158d6565b5092915050565b8082025f82127f800000000000000000000000000000000000000000000000000000000000000084141615615c2357615c236158d6565b818105831482151761017f5761017f6158d6565b828152604060208201525f61592e60408301846154df565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52605160045260245ffdfe097c09cb0a0d0bce0c4e0c600c780cba0d0f0d210d330d450dea0e270ff3115d124813ea1539160916cd181c13ea190a19391939196819971a1f1a331b201b841b9c1c171c2f1c471c801caa1cc21cda1ce71de21e041e111ec91f181f5b1f7f1f8c1f992032207b20882107215621a521f222412290234823742396244e248f24b625032550259f25ec263926862777097c09cb0a0d0bce0c4e0c600c780cba0d0f0d210d330d450dea0e270ff3115d124813ea1539160916cd181c13ea190a19391939196819971a1f1a331b201b841b9c1c171c2f1c471c801caa1cc21cda1ce71de21e041e111ec91f181f5b1f7f1f8c1f992032207b20882107215621a521f222412290234823742396244e248f24b625032550259f25ec263926862777" + "object": "0x608060405234801561000f575f80fd5b5061001861003d565b515f0361003857604051632413c92160e01b815260040160405180910390fd5b61005d565b60606040518060c0016040528060928152602001615dd160929139905090565b615d678061006a5f395ff3fe608060405234801561000f575f80fd5b506004361061003f575f3560e01c806301ffc9a714610043578063514b5d4f1461006b578063d04dfe2314610080575b5f80fd5b6100566100513660046154f8565b6100a1565b60405190151581526020015b60405180910390f35b610073610185565b6040516100629190615583565b61009361008e366004615595565b610194565b604051610062929190615606565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082167fd04dfe2300000000000000000000000000000000000000000000000000000000148061013357507fffffffff0000000000000000000000000000000000000000000000000000000082167f514b5d4f00000000000000000000000000000000000000000000000000000000145b8061017f57507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b92915050565b606061018f610390565b905090565b6060805f61021b84830135602086018035906101b0908861567f565b6101bd608089018961569a565b6101c69161579d565b6101ce610645565b6101db60408b018b615860565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152509297969594939250506106659050565b9050600261022c60c086018661569a565b6102379291506158ee565b156102895761024960c085018561569a565b6040517f01c71f3d000000000000000000000000000000000000000000000000000000008152610280925060040190815260200190565b60405180910390fd5b5f5b61029860c086018661569a565b905081101561031b576060820151610304906102b760c088018861569a565b848181106102c7576102c7615901565b90506020020135878060c001906102de919061569a565b6102e986600161595b565b8181106102f8576102f8615901565b905060200201356107b0565b606083015261031460028261595b565b905061028b565b5061038661032c60a086018661569a565b808060200260200160405190810160405280939291908181526020018383602002808284375f92019190915250859392507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff915050610886565b9250925050915091565b6040805161094081018252604980825261098560208301526109d492820192909252610a16606082810191909152610bd76080830152610c5760a0830152610c6960c0830152610c8160e0830152610cc3610100830152610d18610120830152610d2a610140830152610d3c610160830152610d4e610180830152610df36101a0830152610e306101c0830152610ffc6101e08301526111666102008301526112516102208301526113f361024083018190526115426102608401526116126102808401526116d66102a08401526118256102c08401526102e083015261191361030083015261194261032083018190526103408301526119716103608301526119a0610380830152611a286103a0830152611a3c6103c0830152611b296103e0830152611b8d610400830152611ba5610420830152611c20610440830152611c38610460830152611c50610480830152611c896104a0830152611cb36104c0830152611ccb6104e0830152611ce3610500830152611cf0610520830152611deb610540830152611e0d610560830152611e1a610580830152611ed26105a0830152611f216105c0830152611f646105e0830152611f88610600830152611f95610620830152611fa261064083015261203b6106608301526120846106808301526120916106a08301526121106106c083015261215f6106e08301526121ae6107008301526121fb61072083015261224a6107408301526122996107608301526123516107808301526123a06107a08301526123cc6107c08301526123ee6107e08301526124a66108008301526124e761082083015261250e61084083015261255b6108608301526125a86108808301526125f76108a08301526126446108c08301526126916108e08301526126de6109008301526127cf610920830152919081908061063c81612801565b94505050505090565b60606040518060c0016040528060928152602001615cd560929139905090565b6106c660405180610120016040528060608152602001606081526020015f81526020015f81526020015f81526020015f73ffffffffffffffffffffffffffffffffffffffff1681526020016060815260200160608152602001606081525090565b602087810180516040600191820184028b018181015182515f91821a808252948501870281019093526041808301968381019593600285020190910191908401905b8381101561074657875160f01c83015160408051600192831a8082528301602090810290910191829052908452600290990198929092019101610708565b505050506040518061012001604052808281526020018481526020018b81526020015f81526020018a81526020018973ffffffffffffffffffffffffffffffffffffffff168152602001888152602001838152602001878152509450505050509695505050505050565b5f82815260208120600f900660100284811c61ffff1690815b82156107e357825186146107e357604083015192506107c9565b821580156108315760405193506060840160405286845285602085015281604085015260028860f01c0161ffff60f01b1989168160f01b1798505061ffff831b19881684841b179750610838565b8560208501525b50505061ffff81111561087a576040517fcadaf56d00000000000000000000000000000000000000000000000000000000815260048101829052602401610280565b849150505b9392505050565b6060805f8061089d8760e001518860400151612885565b915091505f80885f01518960400151815181106108bc576108bc615901565b60200260200101519150819050838851146109105787516040517fd628439f000000000000000000000000000000000000000000000000000000008152610280918691600401918252602082015260400190565b875115610935575f60208951028203915060208901905061093381838b516128a8565b505b610945898a6040015183856128b4565b90505f8388106109555783610957565b875b90506060602083039050818152806109728c60600151612b45565b975097505050505050505b935093915050565b604083015183516020600192830181029091015161ffff8516909201029003517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0909101908152809392505050565b60208084015161ffff841660010190910201517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0909101908152809392505050565b602083015180515f9161ffff851691600f601087901c811692601488901c9091169185919085908110610a4b57610a4b615901565b602002602001015190505f80610a64839060a082901c90565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08a0180518882526040517f58c07152000000000000000000000000000000000000000000000000000000008152939550919350915f9073ffffffffffffffffffffffffffffffffffffffff8616906358c0715290610ae9908790879060040161596e565b5f60405180830381865afa158015610b03573d5f803e3d5ffd5b505050506040513d5f823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201604052610b48919081019061598e565b905080518714610b915780516040517fc3385cb0000000000000000000000000000000000000000000000000000000008152610280918991600401918252602082015260400190565b818352602088028b019a50602081016020880281015b80821015610bc45760208d039c5081518d52602082019150610ba7565b509a9d9c50505050505050505050505050565b60c083015180515f9160ff85811692600887901c90911691849184908110610c0157610c01615901565b60200260200101518281518110610c1a57610c1a615901565b60209081029190910101517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0909501948552509295945050505050565b60208101805182511681529392505050565b80515f90610c7681612db8565b835250909392505050565b80516001600884901c60ff9081169190911b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0193161c919091168152919050565b805160209091018051600160ff600886901c81169190911b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01941684811b199091169390921690911b919091178152919050565b60208101805182511781529392505050565b805161ffff83161b8152809392505050565b805161ffff83161c8152809392505050565b8251600161ffff841690810160209081028301515f93600f601088901c811693601489901c90911692908190850288015b80891015610d9c5760208203915088518252602089019850610d7f565b5060408a01805190879052610db38b8284866128b4565b60408c0182905260208602998a9003999092508201895b81841015610de2578351815260209384019301610dca565b50989b9a5050505050505050505050565b60109190911c600f166020028082207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09190920101908152919050565b805160208201516040909201805190925f929173ffffffffffffffffffffffffffffffffffffffff83168314610e95576040517f0255ddd800000000000000000000000000000000000000000000000000000000815260048101849052602401610280565b8173ffffffffffffffffffffffffffffffffffffffff168214610ee7576040517f0255ddd800000000000000000000000000000000000000000000000000000000815260048101839052602401610280565b8073ffffffffffffffffffffffffffffffffffffffff168114610f39576040517f0255ddd800000000000000000000000000000000000000000000000000000000815260048101829052602401610280565b6040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff838116600483015282811660248301525f919085169063dd62ed3e90604401602060405180830381865afa158015610fae573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610fd29190615a0f565b90505f610fde85612e90565b90505f610feb8383612f39565b508852509598975050505050505050565b80516020909101805190915f9173ffffffffffffffffffffffffffffffffffffffff8216821461105b576040517f0255ddd800000000000000000000000000000000000000000000000000000000815260048101839052602401610280565b8073ffffffffffffffffffffffffffffffffffffffff1681146110ad576040517f0255ddd800000000000000000000000000000000000000000000000000000000815260048101829052602401610280565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff82811660048301525f91908416906370a0823190602401602060405180830381865afa15801561111a573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061113e9190615a0f565b90505f61114a84612e90565b90505f6111578383612f7a565b87525094979650505050505050565b80515f9073ffffffffffffffffffffffffffffffffffffffff811681146111bc576040517f0255ddd800000000000000000000000000000000000000000000000000000000815260048101829052602401610280565b5f8173ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611206573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061122a9190615a0f565b90505f61123683612e90565b90505f6112438383612f7a565b865250939695505050505050565b805160208201516040909201805190925f929173ffffffffffffffffffffffffffffffffffffffff831683146112b6576040517f0255ddd800000000000000000000000000000000000000000000000000000000815260048101849052602401610280565b8173ffffffffffffffffffffffffffffffffffffffff168214611308576040517f0255ddd800000000000000000000000000000000000000000000000000000000815260048101839052602401610280565b8073ffffffffffffffffffffffffffffffffffffffff16811461135a576040517f0255ddd800000000000000000000000000000000000000000000000000000000815260048101829052602401610280565b6040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff838116600483015282811660248301525f919085169063dd62ed3e90604401602060405180830381865afa1580156113cf573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906112439190615a0f565b80516020909101805190915f9173ffffffffffffffffffffffffffffffffffffffff82168214611452576040517f0255ddd800000000000000000000000000000000000000000000000000000000815260048101839052602401610280565b8073ffffffffffffffffffffffffffffffffffffffff1681146114a4576040517f0255ddd800000000000000000000000000000000000000000000000000000000815260048101829052602401610280565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff82811660048301525f91908416906370a0823190602401602060405180830381865afa158015611511573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115359190615a0f565b8552509295945050505050565b80515f9073ffffffffffffffffffffffffffffffffffffffff81168114611598576040517f0255ddd800000000000000000000000000000000000000000000000000000000815260048101829052602401610280565b5f8173ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156115e2573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906116069190615a0f565b84525091949350505050565b80515f9073ffffffffffffffffffffffffffffffffffffffff81168114611668576040517f0255ddd800000000000000000000000000000000000000000000000000000000815260048101829052602401610280565b5f8173ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156116b2573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906116069190615a26565b80516020909101805190915f9173ffffffffffffffffffffffffffffffffffffffff82168214611735576040517f0255ddd800000000000000000000000000000000000000000000000000000000815260048101839052602401610280565b8073ffffffffffffffffffffffffffffffffffffffff168114611787576040517f0255ddd800000000000000000000000000000000000000000000000000000000815260048101829052602401610280565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff82811660048301525f91908416906370a0823190602401602060405180830381865afa1580156117f4573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906118189190615a0f565b90505f611243825f612f7a565b80516020909101805190915f9173ffffffffffffffffffffffffffffffffffffffff82168214611884576040517f0255ddd800000000000000000000000000000000000000000000000000000000815260048101839052602401610280565b6040517f6352211e000000000000000000000000000000000000000000000000000000008152600481018290525f9073ffffffffffffffffffffffffffffffffffffffff841690636352211e90602401602060405180830381865afa1580156118ef573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115359190615a26565b437fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09190910190815292915050565b427fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09190910190815292915050565b467fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09190910190815292915050565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe06020600f601085901c1602828101918201925f928391905b80821015611a1c57815192507bffffffffffffffffffffffffffffffffffffffffffffffffffffffff831615611a1157828652611a1c565b8160200191506119d9565b50939695505050505050565b805160209091018051909114815292915050565b5f805f80805f80600f8960101c169350600284069250879150602083850302820190506020831502810397508215611a7357805194505b5f5b81831015611abe5750815195507bffffffffffffffffffffffffffffffffffffffffffffffffffffffff86161580611ab35760208301518952611abe565b826040019250611a75565b8015611b1a57604080518082019091525f6020820152600887901c601f88168083019190915281525b6040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102809190615583565b50969998505050505050505050565b805160208201516040909201915f91907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8216611b8357604080518082019091525f6020820152600882901c601f8316808301919091528152611ae7565b5091949350505050565b80516020909101805190915f91826115358383612f9e565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe06020600f601085901c1602828101918201925f928391905b80821015611a1c57815192507bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8316611c15575f8652611a1c565b816020019150611bde565b80516020909101805190915f91826115358383612fec565b80516020909101805190915f9182611535838361303b565b805160407bffffffffffffffffffffffffffffffffffffffffffffffffffffffff90911615156020028203810151910190815292915050565b80515f90817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff821615611606565b80516020909101805190915f9182611535838361308b565b80516020909101805190915f918261153583836130da565b80515f90610c768161312a565b805160208201516040909201915f91907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff808316601b90810b9160e085811d9291851690910b9084901d611d4284848484613175565b9094509250600f60108a901c1660025b81811015611da85789516020909a019996507bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8716601b0b935060e087901d9250611d9b86868686613175565b9096509450600101611d52565b5050611db484846132ab565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe098909801978852509598975050505050505050565b80516020909101805190915f916116066002611e0784846133b1565b90613413565b80515f90610c7681613458565b805160208201516040909201915f91907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff808316601b90810b9160e085811d9291851690910b9084901d611e6c84848484613514565b9094509250600f60108a901c1660025b81811015611da85789516020909a019996507bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8716601b0b935060e087901d9250611ec586868686613514565b9096509450600101611e7c565b7fffffffbe19cfc6ef4f44cf88f14500d013df534fcaad48fca1d5ca47bea26fcc7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09190910190815292915050565b80515f90610c767fffffffbe19cfc6ef4f44cf88f14500d013df534fcaad48fca1d5ca47bea26fcc8273c51a14251b0dcf0ae24a96b7153991378938f5f5613b2f565b80515f90610c7660028273c51a14251b0dcf0ae24a96b7153991378938f5f5613b2f565b80515f90610c7681613d89565b80515f90610c7681613e2f565b80516020909101805190915f9182611fba838261308b565b90505f611fc7838261308b565b90505f6120257fffffffff0000000000000000000000000000000000000000000000000000000573c51a14251b0dcf0ae24a96b7153991378938f5f561201e61200f8861312a565b6120188a61312a565b90613e7a565b9190613b2f565b9050811515831515146112435761115781613ebf565b80515f906120528161204c81613458565b90613ef1565b90507bffffffffffffffffffffffffffffffffffffffffffffffffffffffff811661207b575060015b82525092915050565b80515f90610c7681613f36565b805160208201516040909201915f91906120ab8282613f68565b9150600f601086901c1660025b818110156120de57855160209096019592506120d48484613f68565b93506001016120b8565b5050507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0929092019182525092915050565b7f80000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09190910190815292915050565b7f7fffffff7fffffffffffffffffffffffffffffffffffffffffffffffffffffff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09190910190815292915050565b805160208201516040909201915f91906121c88282613f84565b9150600f601086901c1660025b818110156120de57855160209096019592506121f18484613f84565b93506001016121d5565b7f7fffffff800000000000000000000000000000000000000000000000000000007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09190910190815292915050565b7f80000000000000000000000000000000000000000000000000000000000000017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09190910190815292915050565b805160208201516040909201915f91907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff808316601b90810b9160e085811d9291851690910b9084901d6122eb84848484613f8f565b9094509250600f60108a901c1660025b81811015611da85789516020909a019996507bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8716601b0b935060e087901d925061234486868686613f8f565b90965094506001016122fb565b7fffffffbe1dd4c9e873614f593bba9c6007d9a7ac8d03a4b6c700a65cb537a1b47fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09190910190815292915050565b80516020909101805190915f91611606828273c51a14251b0dcf0ae24a96b7153991378938f5f5613b2f565b80515f90610c768173c51a14251b0dcf0ae24a96b7153991378938f5f56140ae565b805160208201516040909201915f91907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff808316601b90810b9160e085811d9291851690910b9084901d612440848484846140da565b9094509250600f60108a901c1660025b81811015611da85789516020909a019996507bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8716601b0b935060e087901d9250612499868686866140da565b9096509450600101612450565b805160208201516040909201805190925f92916115356124e08273c51a14251b0dcf0ae24a96b7153991378938f5f561201e8660016133b1565b8490613e7a565b805160208201516040909201805190925f92916115356125078383613e7a565b84906133b1565b805160208201516040909201915f9190612528818361595b565b9150600f601086901c1660025b818110156120de5785516020909601959250612551838561595b565b9350600101612535565b805160208201516040909201915f91906125758183615a41565b9150600f601086901c1660025b818110156120de578551602090960195925061259e8385615a41565b9350600101612582565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09190910190815292915050565b805160208201516040909201915f91906126118183615a54565b9150600f601086901c1660025b818110156120de578551602090960195925061263a8385615a54565b935060010161261e565b805160208201516040909201915f919061265e8183615b89565b9150600f601086901c1660025b818110156120de57855160209096019592506126878385615b89565b935060010161266b565b805160208201516040909201915f91906126ab8183615b94565b9150600f601086901c1660025b818110156120de57855160209096019592506126d48385615b94565b93506001016126b8565b805160608401515f9190829081906126f69084614104565b91509150815f036127c05760a087015160808801516040517f295f36d70000000000000000000000000000000000000000000000000000000081526004810191909152602481018590525f9173ffffffffffffffffffffffffffffffffffffffff169063295f36d790604401602060405180830381865afa15801561277d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906127a19190615a0f565b60608901519091506127b49085836107b0565b606089015285526127c4565b8085525b509295945050505050565b8051602082015160608501516040909301925f9291906127f09083836107b0565b606087015250829150509392505050565b60605f825160020267ffffffffffffffff811115612821576128216156fe565b6040519080825280601f01601f19166020018201604052801561284b576020820181803683370190505b50905061ffff80196020850160208651028101600285015b81831015611a1c57805183518616908516178152602090920191600201612863565b5f805f612892858561414b565b51600281901a9660039190911a95509350505050565b6020810283835e505050565b5f80856040015190505f805f805f60028b6101000151516128d59190615a41565b60e08c01516101008d0151602080830151600261ffff9b909b168b8102850160219081015160f01c5f93841a9d909d029095019b909b019384015160258086019b50600791831a9182169182900360040290950190940198509296500193509091506154f090805b86881015612abf5787519050600284825f1a060285015160f01c925062ffffff8160e01c1691506129738e838e8663ffffffff16565b9b506002848260041a060285015160f01c925062ffffff8160c01c1691506129a08e838e8663ffffffff16565b9b506002848260081a060285015160f01c925062ffffff8160a01c1691506129cd8e838e8663ffffffff16565b9b5060028482600c1a060285015160f01c925062ffffff8160801c1691506129fa8e838e8663ffffffff16565b9b506002848260101a060285015160f01c925062ffffff8160601c169150612a278e838e8663ffffffff16565b9b506002848260141a060285015160f01c925062ffffff8160401c169150612a548e838e8663ffffffff16565b9b506002848260181a060285015160f01c925062ffffff8160201c169150612a818e838e8663ffffffff16565b9b5060028482601c1a060285015160f01c925062ffffff81169150612aab8e838e8663ffffffff16565b9b50612ab860208961595b565b975061293d565b612aca601c89615b94565b9750612ad7866004615a54565b612ae1908961595b565b96505b86881015612b275750508551601c81901a83900660020284015160f01c915062ffffff811690612b138e838e86565b9b50612b2060048961595b565b9750612ae4565b612b338d8a8e8e61417a565b50999c9b505050505050505050505050565b6040805160f083901c602081810283010190925290815261ffff63ffffffff67ffffffffffffffff6fffffffffffffffffffffffffffffffff612bb1565b5f5b8215612bab57825182526020830151602083015260408301519250604082019150612b85565b50919050565b602085018660101b60901c8015612ca1578060401c8015612c1f578060201c8015612be357612be08185612b83565b93505b508086168015612c1d578060101c8015612c0457612c018186612b83565b94505b508088168015612c1b57612c188186612b83565b94505b505b505b508084168015612c9f578060201c8015612c63578060101c8015612c4a57612c478186612b83565b94505b508088168015612c6157612c5e8186612b83565b94505b505b508086168015612c9d578060101c8015612c8457612c818186612b83565b94505b508088168015612c9b57612c988186612b83565b94505b505b505b505b508682168015612dad578060401c8015612d2b578060201c8015612cef578060101c8015612cd657612cd38186612b83565b94505b508088168015612ced57612cea8186612b83565b94505b505b508086168015612d29578060101c8015612d1057612d0d8186612b83565b94505b508088168015612d2757612d248186612b83565b94505b505b505b508084168015612dab578060201c8015612d6f578060101c8015612d5657612d538186612b83565b94505b508088168015612d6d57612d6a8186612b83565b94505b505b508086168015612da9578060101c8015612d9057612d8d8186612b83565b94505b508088168015612da757612da48186612b83565b94505b505b505b505b505050505050919050565b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203612de95750610100919050565b507f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f7f5555555555555555555555555555555555555555555555555555555555555555600183901c16909103600281901c7f3333333333333333333333333333333333333333333333333333333333333333908116911601600481901c01167f01010101010101010101010101010101010101010101010101010101010101010260f81c90565b5f612e9961420d565b6040517ff5c36eaf00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8316600482015273200e12d10bb0c5e4a17e7018f0f1161919bb93899063f5c36eaf90602401602060405180830381865afa158015612f15573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061017f9190615ba7565b5f805f805f612f4887876142b3565b9250925092505f80612f5a85856132ab565b9150915081838015612f695750815b9650965050505050505b9250929050565b5f805f612f87858561430f565b91509150612f958282614371565b95945050505050565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838116601b90810b9160e086811d9291861690910b9085901d612fe1848484846143cb565b979650505050505050565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838116601b90810b9160e086811d9291861690910b9085901d61302f848484846143e2565b12979650505050505050565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838116601b90810b9160e086811d9291861690910b9085901d61307e848484846143e2565b1315979650505050505050565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838116601b90810b9160e086811d9291861690910b9085901d6130ce848484846143e2565b13979650505050505050565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838116601b90810b9160e086811d9291861690910b9085901d61311d848484846143e2565b1215979650505050505050565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8216601b0b60e083901d8282121561316a5761316482826144b6565b90925090505b5f612f958383614559565b5f80851584151780156131a157865f0361319557848492509250506132a2565b868692509250506132a2565b6131ab87876145b7565b90975095506131ba85856145b7565b9095509350858413156131ce579395929492935b838603604c8111156131e75787879350935050506132a2565b80600a0a86816131f9576131f96158c1565b0595505086850180881860ff90811c151589881890911c1516801561329457877f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0361327b576040517fd556b111000000000000000000000000000000000000000000000000000000008152600481018a905260248101899052604401610280565b600a968790059690980586019760019790970196613298565b8198505b5050868692509250505b94509492505050565b5f601b83900b831483838261330f577d90e40fbeea1d3a4abc8955e946fe31cdcf66f634e10000000000000000008605156132ef57620186a0860595506005850194505b8586601b0b1461330a57600a860595508460010194506132ef565b613325565b855f0361332557505f925060019150612f739050565b848560030b14613381575f85121561334557505f9250829150612f739050565b6040517fd556b1110000000000000000000000000000000000000000000000000000000081526004810183905260248101829052604401610280565b50507bffffffffffffffffffffffffffffffffffffffffffffffffffffffff841660e084901b1791509250929050565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838116601b90810b9160e086811d9291861690910b9085901d84806133f686868686613175565b915091505f6134058383614559565b9a9950505050505050505050565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838116601b90810b9160e086811d9291861690910b9085901d84806133f686868686613514565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8216601b0b60e083901d82811261348f57509192915050565b5f8061349b848461460d565b91509150805f036134b0575093949350505050565b5f8113156135095761350482847f161bcca7119915b50764b4abe86529797775a5f17195100000000000000000007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb4613175565b935091505b5f612fe18385614559565b5f80835f03613559576040517f7a97930f0000000000000000000000000000000000000000000000000000000081526004810187905260248101869052604401610280565b855f0361356a57505f9050806132a2565b5f805f806135788a8a614675565b919b50995091506135898888614675565b919950975090505f61359a8b614916565b90505f6135a68a614916565b90507f161bcca7119915b50764b4abe86529797775a5f1719510000000000000000000604c818310156139c357841561360457507f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee80000000000000000009050604b613982565b6f4b3b4ca85a86c47a098a22400000000083101561373057678ac7230489e80000831015613694576402540be40083101561366257620186a08310156136525750620186a09050600561390b565b506402540be4009050600a61390b565b655af3107a40008310156136815750655af3107a40009050600e61390b565b50678ac7230489e800009050601361390b565b6b204fce5e3e250261100000008310156136e65769152d02c7e14af68000008310156136cf575069152d02c7e14af68000009050601761390b565b506b204fce5e3e250261100000009050601c61390b565b6d314dc6448d9338c15b0a0000000083101561371557506d314dc6448d9338c15b0a000000009050602161390b565b506f4b3b4ca85a86c47a098a2240000000009050602661390b565b780197d4df19d605767337e9f14d3eec8920e4000000000000008310156138285773af298d050e4395d69670b12b7f410000000000008310156137c3577172cb5bd86321e38cb6ce6682e800000000008310156137a457507172cb5bd86321e38cb6ce6682e800000000009050602b61390b565b5073af298d050e4395d69670b12b7f410000000000009050603061390b565b76010b46c6cdd6e3e0828f4db456ff0c8ea0000000000000831015613804575076010b46c6cdd6e3e0828f4db456ff0c8ea00000000000009050603561390b565b50780197d4df19d605767337e9f14d3eec8920e4000000000000009050603a61390b565b7c03b58e88c75313ec9d329eaaa18fb92f75215b171000000000000000008310156138be577a026e4d30eccc3215dd8f3157d27e23acbdcfe6800000000000000083101561389657507a026e4d30eccc3215dd8f3157d27e23acbdcfe680000000000000009050603f61390b565b507c03b58e88c75313ec9d329eaaa18fb92f75215b171000000000000000009050604461390b565b7e05a8e89d75252446eb5d5d5b1cc5edf20a1a059e10ca00000000000000000083101561390b57507e05a8e89d75252446eb5d5d5b1cc5edf20a1a059e10ca000000000000000000905060495b81831161393f57600a820491507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0161390b565b815f03613982576040517f05e51ecb000000000000000000000000000000000000000000000000000000008152600481018d9052602481018c9052604401610280565b856139c3576040517f05e51ecb000000000000000000000000000000000000000000000000000000008152600481018f9052602481018e9052604401610280565b807f8000000000000000000000000000000000000000000000000000000000000000018d126139f657808d039c50613a69565b7f80000000000000000000000000000000000000000000000000000000000000009c90038c015f811315613a6957807f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038b13613a5657998a0199613a69565b5f809950995050505050505050506132a2565b5f808e128015613a7857505f8c135b15613ab5577f80000000000000000000000000000000000000000000000000000000000000008e01808d13613aad575f613ab1565b808d035b9150505b8b818f01039750613ad28f8e613acc888789614977565b8b614a5c565b90995097505f811315613b1c57604c811315613afc575f809a509a505050505050505050506132a2565b80600a0a8981613b0e57613b0e6158c1565b059850885f03613b1c575f97505b509698509496506132a295505050505050565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff848116601b0b9060e086901d908516613b6c57506001915061087f9050565b5f8213613c0557815f03613bc957613b84855f61308b565b15613bbe576040517f8be8297200000000000000000000000000000000000000000000000000000000815260048101869052602401610280565b505f915061087f9050565b6040517fcceba0f10000000000000000000000000000000000000000000000000000000081526004810183905260248101829052604401610280565b613c10856001612f9e565b8015613c215750613c21865f612fec565b15613c3057859250505061087f565b613c3a855f61308b565b15613c6357613c5a613c4b87613f36565b613c5487613ebf565b86613b2f565b9250505061087f565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8516601b0b60e086901d5f80613c96848461460d565b915091505f613ca683855f614b63565b905060015f8080613cdd8f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8116601b0b9160e09190911d90565b915091505b60018510613d245784600116600103613d0757613d0184848484613f8f565b90945092505b600185901c9450613d1a82828484613f8f565b9092509050613ce2565b5f80613d318f8e8e614c7a565b91509150613d4182828a8d613f8f565b9092509050613d518f8383614faf565b9092509050613d6282828888613f8f565b90925090505f613d728383614559565b9e5050505050505050505050505050509392505050565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8216601b0b60e083901d828112613dc057509192915050565b5f80613dcc848461460d565b915091505f84128015613dde57508015155b156135095761350482847f161bcca7119915b50764b4abe86529797775a5f17195100000000000000000007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb46140da565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8216601b0b60e083901d82613e62838361460d565b9150505f613e708284614559565b9695505050505050565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838116601b90810b9160e086811d9291861690910b9085901d84806133f686868686613f8f565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8216601b0b60e083901d61316482826144b6565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838116601b90810b9160e086811d9291861690910b9085901d84806133f6868686866140da565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8216601b0b60e083901d6131648282615120565b5f613f738383612fec565b613f7d578161087f565b5090919050565b5f613f73838361308b565b5f8085158415178015613fa7575f92505f91506140a4565b613fb18487615bc7565b91505f613fbd88614916565b90505f613fc987614916565b90505f613fd68383615179565b5090505f6f0785ee10d5da46d900f436a00000000082111561400b576f0785ee10d5da46d900f436a000000000820491506025015b670de0b6b3a764000082111561402c57670de0b6b3a7640000820491506012015b633b9aca0082111561404557633b9aca00820491506009015b61271082111561405a57612710820491506004015b811561406e57600a8204915060010161405a565b6140788187615bc7565b955061409a8b8a614094878761408f87600a615b89565b614977565b89614a5c565b9097509550505050505b5094509492505050565b5f61087f837fffffffff0000000000000000000000000000000000000000000000000000000584613b2f565b5f806140e684846144b6565b90945092506140f786868686613175565b9150915094509492505050565b5f80825f526010600f60205f20060261ffff85821c165b80156141425780518503614139576001935060208101519250614142565b6040015161411b565b50509250929050565b5f80614156846151b4565b60020260010190505f61416985856151ce565b949091019093016020019392505050565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08201805163ffff0000601087901b1661ffff86161782527f312f5ae588c6ff62cd3f006af06cd48c98d7321649db7d8b2c396a81a204655591905f808686036004017ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8801865afa5090525050505050565b73200e12d10bb0c5e4a17e7018f0f1161919bb93893b1580614264575073200e12d10bb0c5e4a17e7018f0f1161919bb93893f7f1de7d717526cba131d684e312dedbf0852adef9cced9e36798ae4937f7145d4114155b156142b1576040517f73e6d7b300000000000000000000000000000000000000000000000000000000815273200e12d10bb0c5e4a17e7018f0f1161919bb93896004820152602401610280565b565b5f808060ff841681037f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8611156142fe57600a860460018201600a88065f1493509350935050614308565b8593509150600190505b9250925092565b5f805f805f61431e87876142b3565b92509250925080614365576040517fc47179660000000000000000000000000000000000000000000000000000000081526004810184905260248101839052604401610280565b50909590945092505050565b5f805f61437e85856132ab565b91509150806143c3576040517f22c9f7bb0000000000000000000000000000000000000000000000000000000081526004810186905260248101859052604401610280565b509392505050565b5f6143d8858585856143e2565b1495945050505050565b5f808515841517818712828612181785841417801561440757868592509250506132a2565b505f8584131561441b575092949193919260015b8386035f8112604c821317801561444e578215614440575f89945094505050506132a2565b885f945094505050506132a2565b600a82900a8981028a828281614466576144666158c1565b0514614492578415614482575f8b9650965050505050506132a2565b8a5f9650965050505050506132a2565b84156144a75788965094506132a29350505050565b95508794506132a29350505050565b5f807f8000000000000000000000000000000000000000000000000000000000000000840361454f577f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8303614542576040517fd556b1110000000000000000000000000000000000000000000000000000000081526004810185905260248101849052604401610280565b600a840593508260010192505b50505f9190910391565b5f805f61456685856132ab565b9150915080158015614576575081155b156143c3576040517f8eba4d070000000000000000000000000000000000000000000000000000000081526004810186905260248101859052604401610280565b5f805f805f6145c68787614675565b92509250925080614365576040517f05e51ecb0000000000000000000000000000000000000000000000000000000081526004810188905260248101879052604401610280565b5f805f831261462057508290505f612f73565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb483121561465257505f905082612f73565b5f839003600a0a808581614668576146686158c1565b0794859003959350505050565b5f805f845f0361468d57505f91508190506001614308565b7f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee800000000000000000085055f036148a1576f4b3b4ca85a86c47a098a22400000000085051580156146f657507f80000000000000000000000000000000000000000000000000000000000000268412155b15614717576f4b3b4ca85a86c47a098a224000000000850294506026840393505b7728c87cb5c89a2571ebfdcb54864ada834a00000000000000850515801561475f57507f80000000000000000000000000000000000000000000000000000000000000138412155b1561477857678ac7230489e80000850294506013840393505b7b097edd871cfda3a5697758bf0e3cbb5ac5741c64000000000000000085051580156147c457507f800000000000000000000000000000000000000000000000000000000000000a8412155b156147da576402540be40085029450600a840393505b7e3899162693736ac531a5a58f1fbb4b746504382ca7e4000000000000000000850515801561482957507f80000000000000000000000000000000000000000000000000000000000000028412155b1561483f576064850294506002840393506147da565b7f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee8000000000000000000850515801561488f57507f80000000000000000000000000000000000000000000000000000000000000018412155b156148a157600a850294506001840393505b600a808602908105861480156148d757507f80000000000000000000000000000000000000000000000000000000000000018512155b156148e6578095506001850394505b50939492935050507f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee80000000000000000008305151590565b5f80821215614973577f8000000000000000000000000000000000000000000000000000000000000000820361496d57507f8000000000000000000000000000000000000000000000000000000000000000919050565b505f0390565b5090565b5f805f6149848686615179565b91509150815f036149a85783818161499e5761499e6158c1565b049250505061087f565b8382106149f2576040517f6c59da12000000000000000000000000000000000000000000000000000000008152600481018790526024810186905260448101859052606401610280565b5f84868809600186198101871696879004966002600389028118808a02820302808a02820302808a02820302808a02820302808a02820302808a02909103025f82900382900490920185841190960395909502919093039390930492909217029150509392505050565b5f805f8587181215614b26577f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff841115614b1357614abb7f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600161595b565b8403614aeb57507f80000000000000000000000000000000000000000000000000000000000000009050816132a2565b614af6600a85615a41565b614aff90615bee565b614b0a846001615bc7565b915091506132a2565b614b1c84615bee565b83915091506132a2565b7f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff841115614b5957614aff600a85615a41565b50829050816132a2565b5f818303614b7257508261087f565b82821315614bb557828203604c811380614b8c57505f8113155b15614b9a575f91505061087f565b80600a0a8581614bac57614bac6158c1565b0591505061087f565b818303604c811380614bc757505f8113155b15614c0f576040517f1d5d6d10000000000000000000000000000000000000000000000000000000008152600481018690526024810185905260448101849052606401610280565b600a81900a85810286828281614c2757614c276158c1565b0514614c70576040517f1d5d6d10000000000000000000000000000000000000000000000000000000008152600481018890526024810187905260448101869052606401610280565b925061087f915050565b5f808383614c8882826145b7565b90965094505f8613614d0957855f03614ccd576040517f561fc7b500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517f5d3fd4db0000000000000000000000000000000000000000000000000000000081526004810183905260248101829052604401610280565b5050837f161bcca7119915b50764b4abe86529797775a5f171951000000000000000000003614d4757614d3d83604c615bc7565b5f9150915061097d565b7f161bcca7119915b50764b4abe86529797775a5f171951000000000000000000084121580614d96577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb5614db8565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb45b5f0b8412614f73575f805f805f85614dd157604b614dd4565b604c5b614dde908a615bc7565b90505f8087614e0b577d90e40fbeea1d3a4abc8955e946fe31cdcf66f634e1000000000000000000614e2c565b7e05a8e89d75252446eb5d5d5b1cc5edf20a1a059e10ca0000000000000000005b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff169050808c81614e5e57614e5e6158c1565b05818102955090850193507ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc18019050614e978c82615224565b7d90e40fbeea1d3a4abc8955e946fe31cdcf66f634e10000000000000000000295508594508a8414614f23576123278114614efe57614ed98c82600101615224565b7d90e40fbeea1d3a4abc8955e946fe31cdcf66f634e100000000000000000002614f20565b7f161bcca7119915b50764b4abe86529797775a5f17195100000000000000000005b94505b50614f53838b848c89897fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb46152ab565b909a509850614f648a8a835f613175565b9750975050505050505061097d565b614f7d8585615120565b9095509350614f8d868686614c7a565b9095509350614f9c85856144b6565b925092505061097d565b50935093915050565b5f805f841215614feb57614fc384846144b6565b9094509250614fd3858585614faf565b9094509250614fe28484615120565b9150915061097d565b5f80614ff7868661460d565b9092509050845f808061500a8585615348565b9194509250905061270d612710615022600182615c1e565b8514615039576150338d8686615437565b90925090505b83156150c4575f61504b866001615bc7565b90505b808485830281615060576150606158c1565b051461507757600a84059350600a8805975061504e565b6150b86150848588615c44565b8961508f8785615c44565b8f87877ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc6152ab565b909d509b506150eb9050565b819b507ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc9a505b5050505050866150fc84835f614b63565b615107886001615bc7565b6151119190615bc7565b94509450505050935093915050565b5f8061516e7f161bcca7119915b50764b4abe86529797775a5f17195100000000000000000007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb48686613514565b915091509250929050565b5f807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83850993909202808410938190039390930393915050565b5f81515f036151c457505f919050565b50602001515f1a90565b5f6151d8836151b4565b82106152145781836040517ffcfaeff1000000000000000000000000000000000000000000000000000000008152600401610280929190615c8f565b50600202016003015161ffff1690565b5f80615233600a612328615a41565b61523e906002615a54565b61524990600161595b565b90505f615259600a612328615a41565b90506002600a8504026001015f8052600281601e883c505f51617fff8116935061800081161561528857918101915b505f80526001600a8506600a6064870402018301601f873c50505f510192915050565b5f808888036152be57508390508161533c565b5f805f806152ce8c8b8f8d6140da565b915091505f806152e08a8a8d8c6140da565b915091506152f084848484613f8f565b8096508197505050505050505f8061530a8b8b8f8d6140da565b915091505f8061531c86868686613514565b915091505f8061532e84848f8e613175565b909a50985050505050505050505b97509795505050505050565b5f805f837ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0361538057508391505f90506001614308565b7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc84121561540e577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb08412156153df57505f9150508215156001614308565b5f846004015f03600a0a90505f8187816153fb576153fb6158c1565b0594505080840286141592509050614308565b5f841261542357505f91508190506001614308565b50505060048101600a0a82025f6001614308565b5f80806064615449600a612328615a41565b615456600a612328615a41565b615461906002615a54565b61546c90600161595b565b615476919061595b565b615480919061595b565b90506154c4565b5f8052600280600a8504028301601e833c5f80516107d0840193505f80526001600a8606600a6064880402018501601f853c5f5101949350505050565b6154cf858288615487565b92508315614fa6576154e5600186018288615487565b915050935093915050565b6142b1615ca7565b5f60208284031215615508575f80fd5b81357fffffffff000000000000000000000000000000000000000000000000000000008116811461087f575f80fd5b5f81518084528060208401602086015e5f6020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b602081525f61087f6020830184615537565b5f602082840312156155a5575f80fd5b813567ffffffffffffffff8111156155bb575f80fd5b820160e0818503121561087f575f80fd5b5f815180845260208085019450602084015f5b838110156155fb578151875295820195908201906001016155df565b509495945050505050565b604081525f61561860408301856155cc565b8281036020848101919091528451808352858201928201905f5b8181101561564e57845183529383019391830191600101615632565b5090979650505050505050565b73ffffffffffffffffffffffffffffffffffffffff8116811461567c575f80fd5b50565b5f6020828403121561568f575f80fd5b813561087f8161565b565b5f8083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18436030181126156cd575f80fd5b83018035915067ffffffffffffffff8211156156e7575f80fd5b6020019150600581901b3603821315612f73575f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715615772576157726156fe565b604052919050565b5f67ffffffffffffffff821115615793576157936156fe565b5060051b60200190565b5f6157af6157aa8461577a565b61572b565b83815260208082019190600586811b8601368111156157cc575f80fd5b865b8181101561585357803567ffffffffffffffff8111156157ec575f80fd5b880136601f8201126157fc575f80fd5b803561580a6157aa8261577a565b81815290851b82018601908681019036831115615825575f80fd5b928701925b828410156158435783358252928701929087019061582a565b89525050509483019483016157ce565b5092979650505050505050565b5f8083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112615893575f80fd5b83018035915067ffffffffffffffff8211156158ad575f80fd5b602001915036819003821315612f73575f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f826158fc576158fc6158c1565b500690565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b8082018082111561017f5761017f61592e565b828152604060208201525f61598660408301846155cc565b949350505050565b5f602080838503121561599f575f80fd5b825167ffffffffffffffff8111156159b5575f80fd5b8301601f810185136159c5575f80fd5b80516159d36157aa8261577a565b81815260059190911b820183019083810190878311156159f1575f80fd5b928401925b82841015612fe1578351825292840192908401906159f6565b5f60208284031215615a1f575f80fd5b5051919050565b5f60208284031215615a36575f80fd5b815161087f8161565b565b5f82615a4f57615a4f6158c1565b500490565b808202811582820484141761017f5761017f61592e565b600181815b80851115615ac457817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115615aaa57615aaa61592e565b80851615615ab757918102915b93841c9390800290615a70565b509250929050565b5f82615ada5750600161017f565b81615ae657505f61017f565b8160018114615afc5760028114615b0657615b22565b600191505061017f565b60ff841115615b1757615b1761592e565b50506001821b61017f565b5060208310610133831016604e8410600b8410161715615b45575081810a61017f565b615b4f8383615a6b565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115615b8157615b8161592e565b029392505050565b5f61087f8383615acc565b8181038181111561017f5761017f61592e565b5f60208284031215615bb7575f80fd5b815160ff8116811461087f575f80fd5b8082018281125f831280158216821582161715615be657615be661592e565b505092915050565b5f7f8000000000000000000000000000000000000000000000000000000000000000820361496d5761496d61592e565b8181035f831280158383131683831282161715615c3d57615c3d61592e565b5092915050565b8082025f82127f800000000000000000000000000000000000000000000000000000000000000084141615615c7b57615c7b61592e565b818105831482151761017f5761017f61592e565b828152604060208201525f6159866040830184615537565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52605160045260245ffdfe098509d40a160bd70c570c690c810cc30d180d2a0d3c0d4e0df30e300ffc1166125113f31542161216d6182513f3191319421942197119a01a281a3c1b291b8d1ba51c201c381c501c891cb31ccb1ce31cf01deb1e0d1e1a1ed21f211f641f881f951fa2203b208420912110215f21ae21fb224a2299235123a023cc23ee24a624e7250e255b25a825f72644269126de27cf098509d40a160bd70c570c690c810cc30d180d2a0d3c0d4e0df30e300ffc1166125113f31542161216d6182513f3191319421942197119a01a281a3c1b291b8d1ba51c201c381c501c891cb31ccb1ce31cf01deb1e0d1e1a1ed21f211f641f881f951fa2203b208420912110215f21ae21fb224a2299235123a023cc23ee24a624e7250e255b25a825f72644269126de27cf" }, "deployedBytecode": { - "object": "0x608060405234801561000f575f80fd5b506004361061003f575f3560e01c806301ffc9a714610043578063514b5d4f1461006b578063d04dfe2314610080575b5f80fd5b6100566100513660046154a0565b6100a1565b60405190151581526020015b60405180910390f35b610073610185565b604051610062919061552b565b61009361008e36600461553d565b610194565b6040516100629291906155ae565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082167fd04dfe2300000000000000000000000000000000000000000000000000000000148061013357507fffffffff0000000000000000000000000000000000000000000000000000000082167f514b5d4f00000000000000000000000000000000000000000000000000000000145b8061017f57507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b92915050565b606061018f610390565b905090565b6060805f61021b84830135602086018035906101b09088615627565b6101bd6080890189615642565b6101c691615745565b6101ce61063c565b6101db60408b018b615808565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525092979695949392505061065c9050565b9050600261022c60c0860186615642565b610237929150615896565b156102895761024960c0850185615642565b6040517f01c71f3d000000000000000000000000000000000000000000000000000000008152610280925060040190815260200190565b60405180910390fd5b5f5b61029860c0860186615642565b905081101561031b576060820151610304906102b760c0880188615642565b848181106102c7576102c76158a9565b90506020020135878060c001906102de9190615642565b6102e9866001615903565b8181106102f8576102f86158a9565b905060200201356107a7565b6060830152610314600282615903565b905061028b565b5061038661032c60a0860186615642565b808060200260200160405190810160405280939291908181526020018383602002808284375f92019190915250859392507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff91505061087d565b9250925050915091565b6040805161092081018252604880825261097c60208301526109cb92820192909252610a0d606082810191909152610bce6080830152610c4e60a0830152610c6060c0830152610c7860e0830152610cba610100830152610d0f610120830152610d21610140830152610d33610160830152610d45610180830152610dea6101a0830152610e276101c0830152610ff36101e083015261115d6102008301526112486102208301526113ea61024083018190526115396102608401526116096102808401526116cd6102a084015261181c6102c08401526102e083015261190a6103008301526119396103208301819052610340830152611968610360830152611997610380830152611a1f6103a0830152611a336103c0830152611b206103e0830152611b84610400830152611b9c610420830152611c17610440830152611c2f610460830152611c47610480830152611c806104a0830152611caa6104c0830152611cc26104e0830152611cda610500830152611ce7610520830152611de2610540830152611e04610560830152611e11610580830152611ec96105a0830152611f186105c0830152611f5b6105e0830152611f7f610600830152611f8c610620830152611f9961064083015261203261066083015261207b6106808301526120886106a08301526121076106c08301526121566106e08301526121a56107008301526121f26107208301526122416107408301526122906107608301526123486107808301526123746107a08301526123966107c083015261244e6107e083015261248f6108008301526124b661082083015261250361084083015261255061086083015261259f6108808301526125ec6108a08301526126396108c08301526126866108e08301526127776109008301529190819080610633816127a9565b94505050505090565b60606040518060c0016040528060908152602001615c7d60909139905090565b6106bd60405180610120016040528060608152602001606081526020015f81526020015f81526020015f81526020015f73ffffffffffffffffffffffffffffffffffffffff1681526020016060815260200160608152602001606081525090565b602087810180516040600191820184028b018181015182515f91821a808252948501870281019093526041808301968381019593600285020190910191908401905b8381101561073d57875160f01c83015160408051600192831a80825283016020908102909101918290529084526002909901989290920191016106ff565b505050506040518061012001604052808281526020018481526020018b81526020015f81526020018a81526020018973ffffffffffffffffffffffffffffffffffffffff168152602001888152602001838152602001878152509450505050509695505050505050565b5f82815260208120600f900660100284811c61ffff1690815b82156107da57825186146107da57604083015192506107c0565b821580156108285760405193506060840160405286845285602085015281604085015260028860f01c0161ffff60f01b1989168160f01b1798505061ffff831b19881684841b17975061082f565b8560208501525b50505061ffff811115610871576040517fcadaf56d00000000000000000000000000000000000000000000000000000000815260048101829052602401610280565b849150505b9392505050565b6060805f806108948760e00151886040015161282d565b915091505f80885f01518960400151815181106108b3576108b36158a9565b60200260200101519150819050838851146109075787516040517fd628439f000000000000000000000000000000000000000000000000000000008152610280918691600401918252602082015260400190565b87511561092c575f60208951028203915060208901905061092a81838b51612850565b505b61093c898a60400151838561285c565b90505f83881061094c578361094e565b875b90506060602083039050818152806109698c60600151612aed565b975097505050505050505b935093915050565b604083015183516020600192830181029091015161ffff8516909201029003517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0909101908152809392505050565b60208084015161ffff841660010190910201517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0909101908152809392505050565b602083015180515f9161ffff851691600f601087901c811692601488901c9091169185919085908110610a4257610a426158a9565b602002602001015190505f80610a5b839060a082901c90565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08a0180518882526040517f58c07152000000000000000000000000000000000000000000000000000000008152939550919350915f9073ffffffffffffffffffffffffffffffffffffffff8616906358c0715290610ae09087908790600401615916565b5f60405180830381865afa158015610afa573d5f803e3d5ffd5b505050506040513d5f823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201604052610b3f9190810190615936565b905080518714610b885780516040517fc3385cb0000000000000000000000000000000000000000000000000000000008152610280918991600401918252602082015260400190565b818352602088028b019a50602081016020880281015b80821015610bbb5760208d039c5081518d52602082019150610b9e565b509a9d9c50505050505050505050505050565b60c083015180515f9160ff85811692600887901c90911691849184908110610bf857610bf86158a9565b60200260200101518281518110610c1157610c116158a9565b60209081029190910101517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0909501948552509295945050505050565b60208101805182511681529392505050565b80515f90610c6d81612d60565b835250909392505050565b80516001600884901c60ff9081169190911b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0193161c919091168152919050565b805160209091018051600160ff600886901c81169190911b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01941684811b199091169390921690911b919091178152919050565b60208101805182511781529392505050565b805161ffff83161b8152809392505050565b805161ffff83161c8152809392505050565b8251600161ffff841690810160209081028301515f93600f601088901c811693601489901c90911692908190850288015b80891015610d935760208203915088518252602089019850610d76565b5060408a01805190879052610daa8b82848661285c565b60408c0182905260208602998a9003999092508201895b81841015610dd9578351815260209384019301610dc1565b50989b9a5050505050505050505050565b60109190911c600f166020028082207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09190920101908152919050565b805160208201516040909201805190925f929173ffffffffffffffffffffffffffffffffffffffff83168314610e8c576040517f0255ddd800000000000000000000000000000000000000000000000000000000815260048101849052602401610280565b8173ffffffffffffffffffffffffffffffffffffffff168214610ede576040517f0255ddd800000000000000000000000000000000000000000000000000000000815260048101839052602401610280565b8073ffffffffffffffffffffffffffffffffffffffff168114610f30576040517f0255ddd800000000000000000000000000000000000000000000000000000000815260048101829052602401610280565b6040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff838116600483015282811660248301525f919085169063dd62ed3e90604401602060405180830381865afa158015610fa5573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610fc991906159b7565b90505f610fd585612e38565b90505f610fe28383612ee1565b508852509598975050505050505050565b80516020909101805190915f9173ffffffffffffffffffffffffffffffffffffffff82168214611052576040517f0255ddd800000000000000000000000000000000000000000000000000000000815260048101839052602401610280565b8073ffffffffffffffffffffffffffffffffffffffff1681146110a4576040517f0255ddd800000000000000000000000000000000000000000000000000000000815260048101829052602401610280565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff82811660048301525f91908416906370a0823190602401602060405180830381865afa158015611111573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061113591906159b7565b90505f61114184612e38565b90505f61114e8383612f22565b87525094979650505050505050565b80515f9073ffffffffffffffffffffffffffffffffffffffff811681146111b3576040517f0255ddd800000000000000000000000000000000000000000000000000000000815260048101829052602401610280565b5f8173ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156111fd573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061122191906159b7565b90505f61122d83612e38565b90505f61123a8383612f22565b865250939695505050505050565b805160208201516040909201805190925f929173ffffffffffffffffffffffffffffffffffffffff831683146112ad576040517f0255ddd800000000000000000000000000000000000000000000000000000000815260048101849052602401610280565b8173ffffffffffffffffffffffffffffffffffffffff1682146112ff576040517f0255ddd800000000000000000000000000000000000000000000000000000000815260048101839052602401610280565b8073ffffffffffffffffffffffffffffffffffffffff168114611351576040517f0255ddd800000000000000000000000000000000000000000000000000000000815260048101829052602401610280565b6040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff838116600483015282811660248301525f919085169063dd62ed3e90604401602060405180830381865afa1580156113c6573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061123a91906159b7565b80516020909101805190915f9173ffffffffffffffffffffffffffffffffffffffff82168214611449576040517f0255ddd800000000000000000000000000000000000000000000000000000000815260048101839052602401610280565b8073ffffffffffffffffffffffffffffffffffffffff16811461149b576040517f0255ddd800000000000000000000000000000000000000000000000000000000815260048101829052602401610280565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff82811660048301525f91908416906370a0823190602401602060405180830381865afa158015611508573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061152c91906159b7565b8552509295945050505050565b80515f9073ffffffffffffffffffffffffffffffffffffffff8116811461158f576040517f0255ddd800000000000000000000000000000000000000000000000000000000815260048101829052602401610280565b5f8173ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156115d9573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115fd91906159b7565b84525091949350505050565b80515f9073ffffffffffffffffffffffffffffffffffffffff8116811461165f576040517f0255ddd800000000000000000000000000000000000000000000000000000000815260048101829052602401610280565b5f8173ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156116a9573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115fd91906159ce565b80516020909101805190915f9173ffffffffffffffffffffffffffffffffffffffff8216821461172c576040517f0255ddd800000000000000000000000000000000000000000000000000000000815260048101839052602401610280565b8073ffffffffffffffffffffffffffffffffffffffff16811461177e576040517f0255ddd800000000000000000000000000000000000000000000000000000000815260048101829052602401610280565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff82811660048301525f91908416906370a0823190602401602060405180830381865afa1580156117eb573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061180f91906159b7565b90505f61123a825f612f22565b80516020909101805190915f9173ffffffffffffffffffffffffffffffffffffffff8216821461187b576040517f0255ddd800000000000000000000000000000000000000000000000000000000815260048101839052602401610280565b6040517f6352211e000000000000000000000000000000000000000000000000000000008152600481018290525f9073ffffffffffffffffffffffffffffffffffffffff841690636352211e90602401602060405180830381865afa1580156118e6573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061152c91906159ce565b437fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09190910190815292915050565b427fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09190910190815292915050565b467fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09190910190815292915050565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe06020600f601085901c1602828101918201925f928391905b80821015611a1357815192507bffffffffffffffffffffffffffffffffffffffffffffffffffffffff831615611a0857828652611a13565b8160200191506119d0565b50939695505050505050565b805160209091018051909114815292915050565b5f805f80805f80600f8960101c169350600284069250879150602083850302820190506020831502810397508215611a6a57805194505b5f5b81831015611ab55750815195507bffffffffffffffffffffffffffffffffffffffffffffffffffffffff86161580611aaa5760208301518952611ab5565b826040019250611a6c565b8015611b1157604080518082019091525f6020820152600887901c601f88168083019190915281525b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610280919061552b565b50969998505050505050505050565b805160208201516040909201915f91907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8216611b7a57604080518082019091525f6020820152600882901c601f8316808301919091528152611ade565b5091949350505050565b80516020909101805190915f918261152c8383612f46565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe06020600f601085901c1602828101918201925f928391905b80821015611a1357815192507bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8316611c0c575f8652611a13565b816020019150611bd5565b80516020909101805190915f918261152c8383612f94565b80516020909101805190915f918261152c8383612fe3565b805160407bffffffffffffffffffffffffffffffffffffffffffffffffffffffff90911615156020028203810151910190815292915050565b80515f90817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8216156115fd565b80516020909101805190915f918261152c8383613033565b80516020909101805190915f918261152c8383613082565b80515f90610c6d816130d2565b805160208201516040909201915f91907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff808316601b90810b9160e085811d9291851690910b9084901d611d398484848461311d565b9094509250600f60108a901c1660025b81811015611d9f5789516020909a019996507bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8716601b0b935060e087901d9250611d928686868661311d565b9096509450600101611d49565b5050611dab8484613253565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe098909801978852509598975050505050505050565b80516020909101805190915f916115fd6002611dfe8484613359565b906133bb565b80515f90610c6d81613400565b805160208201516040909201915f91907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff808316601b90810b9160e085811d9291851690910b9084901d611e63848484846134bc565b9094509250600f60108a901c1660025b81811015611d9f5789516020909a019996507bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8716601b0b935060e087901d9250611ebc868686866134bc565b9096509450600101611e73565b7fffffffbe19cfc6ef4f44cf88f14500d013df534fcaad48fca1d5ca47bea26fcc7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09190910190815292915050565b80515f90610c6d7fffffffbe19cfc6ef4f44cf88f14500d013df534fcaad48fca1d5ca47bea26fcc8273c51a14251b0dcf0ae24a96b7153991378938f5f5613ad7565b80515f90610c6d60028273c51a14251b0dcf0ae24a96b7153991378938f5f5613ad7565b80515f90610c6d81613d31565b80515f90610c6d81613dd7565b80516020909101805190915f9182611fb18382613033565b90505f611fbe8382613033565b90505f61201c7fffffffff0000000000000000000000000000000000000000000000000000000573c51a14251b0dcf0ae24a96b7153991378938f5f5612015612006886130d2565b61200f8a6130d2565b90613e22565b9190613ad7565b90508115158315151461123a5761114e81613e67565b80515f906120498161204381613400565b90613e99565b90507bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8116612072575060015b82525092915050565b80515f90610c6d81613ede565b805160208201516040909201915f91906120a28282613f10565b9150600f601086901c1660025b818110156120d557855160209096019592506120cb8484613f10565b93506001016120af565b5050507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0929092019182525092915050565b7f80000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09190910190815292915050565b7f7fffffff7fffffffffffffffffffffffffffffffffffffffffffffffffffffff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09190910190815292915050565b805160208201516040909201915f91906121bf8282613f2c565b9150600f601086901c1660025b818110156120d557855160209096019592506121e88484613f2c565b93506001016121cc565b7f7fffffff800000000000000000000000000000000000000000000000000000007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09190910190815292915050565b7f80000000000000000000000000000000000000000000000000000000000000017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09190910190815292915050565b805160208201516040909201915f91907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff808316601b90810b9160e085811d9291851690910b9084901d6122e284848484613f37565b9094509250600f60108a901c1660025b81811015611d9f5789516020909a019996507bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8716601b0b935060e087901d925061233b86868686613f37565b90965094506001016122f2565b80516020909101805190915f916115fd828273c51a14251b0dcf0ae24a96b7153991378938f5f5613ad7565b80515f90610c6d8173c51a14251b0dcf0ae24a96b7153991378938f5f5614056565b805160208201516040909201915f91907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff808316601b90810b9160e085811d9291851690910b9084901d6123e884848484614082565b9094509250600f60108a901c1660025b81811015611d9f5789516020909a019996507bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8716601b0b935060e087901d925061244186868686614082565b90965094506001016123f8565b805160208201516040909201805190925f929161152c6124888273c51a14251b0dcf0ae24a96b7153991378938f5f5612015866001613359565b8490613e22565b805160208201516040909201805190925f929161152c6124af8383613e22565b8490613359565b805160208201516040909201915f91906124d08183615903565b9150600f601086901c1660025b818110156120d557855160209096019592506124f98385615903565b93506001016124dd565b805160208201516040909201915f919061251d81836159e9565b9150600f601086901c1660025b818110156120d5578551602090960195925061254683856159e9565b935060010161252a565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09190910190815292915050565b805160208201516040909201915f91906125b981836159fc565b9150600f601086901c1660025b818110156120d557855160209096019592506125e283856159fc565b93506001016125c6565b805160208201516040909201915f91906126068183615b31565b9150600f601086901c1660025b818110156120d5578551602090960195925061262f8385615b31565b9350600101612613565b805160208201516040909201915f91906126538183615b3c565b9150600f601086901c1660025b818110156120d5578551602090960195925061267c8385615b3c565b9350600101612660565b805160608401515f91908290819061269e90846140ac565b91509150815f036127685760a087015160808801516040517f295f36d70000000000000000000000000000000000000000000000000000000081526004810191909152602481018590525f9173ffffffffffffffffffffffffffffffffffffffff169063295f36d790604401602060405180830381865afa158015612725573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061274991906159b7565b606089015190915061275c9085836107a7565b6060890152855261276c565b8085525b509295945050505050565b8051602082015160608501516040909301925f9291906127989083836107a7565b606087015250829150509392505050565b60605f825160020267ffffffffffffffff8111156127c9576127c96156a6565b6040519080825280601f01601f1916602001820160405280156127f3576020820181803683370190505b50905061ffff80196020850160208651028101600285015b81831015611a135780518351861690851617815260209092019160020161280b565b5f805f61283a85856140f3565b51600281901a9660039190911a95509350505050565b6020810283835e505050565b5f80856040015190505f805f805f60028b61010001515161287d91906159e9565b60e08c01516101008d0151602080830151600261ffff9b909b168b8102850160219081015160f01c5f93841a9d909d029095019b909b019384015160258086019b50600791831a91821691829003600402909501909401985092965001935090915061549890805b86881015612a675787519050600284825f1a060285015160f01c925062ffffff8160e01c16915061291b8e838e8663ffffffff16565b9b506002848260041a060285015160f01c925062ffffff8160c01c1691506129488e838e8663ffffffff16565b9b506002848260081a060285015160f01c925062ffffff8160a01c1691506129758e838e8663ffffffff16565b9b5060028482600c1a060285015160f01c925062ffffff8160801c1691506129a28e838e8663ffffffff16565b9b506002848260101a060285015160f01c925062ffffff8160601c1691506129cf8e838e8663ffffffff16565b9b506002848260141a060285015160f01c925062ffffff8160401c1691506129fc8e838e8663ffffffff16565b9b506002848260181a060285015160f01c925062ffffff8160201c169150612a298e838e8663ffffffff16565b9b5060028482601c1a060285015160f01c925062ffffff81169150612a538e838e8663ffffffff16565b9b50612a60602089615903565b97506128e5565b612a72601c89615b3c565b9750612a7f8660046159fc565b612a899089615903565b96505b86881015612acf5750508551601c81901a83900660020284015160f01c915062ffffff811690612abb8e838e86565b9b50612ac8600489615903565b9750612a8c565b612adb8d8a8e8e614122565b50999c9b505050505050505050505050565b6040805160f083901c602081810283010190925290815261ffff63ffffffff67ffffffffffffffff6fffffffffffffffffffffffffffffffff612b59565b5f5b8215612b5357825182526020830151602083015260408301519250604082019150612b2d565b50919050565b602085018660101b60901c8015612c49578060401c8015612bc7578060201c8015612b8b57612b888185612b2b565b93505b508086168015612bc5578060101c8015612bac57612ba98186612b2b565b94505b508088168015612bc357612bc08186612b2b565b94505b505b505b508084168015612c47578060201c8015612c0b578060101c8015612bf257612bef8186612b2b565b94505b508088168015612c0957612c068186612b2b565b94505b505b508086168015612c45578060101c8015612c2c57612c298186612b2b565b94505b508088168015612c4357612c408186612b2b565b94505b505b505b505b508682168015612d55578060401c8015612cd3578060201c8015612c97578060101c8015612c7e57612c7b8186612b2b565b94505b508088168015612c9557612c928186612b2b565b94505b505b508086168015612cd1578060101c8015612cb857612cb58186612b2b565b94505b508088168015612ccf57612ccc8186612b2b565b94505b505b505b508084168015612d53578060201c8015612d17578060101c8015612cfe57612cfb8186612b2b565b94505b508088168015612d1557612d128186612b2b565b94505b505b508086168015612d51578060101c8015612d3857612d358186612b2b565b94505b508088168015612d4f57612d4c8186612b2b565b94505b505b505b505b505050505050919050565b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203612d915750610100919050565b507f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f7f5555555555555555555555555555555555555555555555555555555555555555600183901c16909103600281901c7f3333333333333333333333333333333333333333333333333333333333333333908116911601600481901c01167f01010101010101010101010101010101010101010101010101010101010101010260f81c90565b5f612e416141b5565b6040517ff5c36eaf00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8316600482015273200e12d10bb0c5e4a17e7018f0f1161919bb93899063f5c36eaf90602401602060405180830381865afa158015612ebd573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061017f9190615b4f565b5f805f805f612ef0878761425b565b9250925092505f80612f028585613253565b9150915081838015612f115750815b9650965050505050505b9250929050565b5f805f612f2f85856142b7565b91509150612f3d8282614319565b95945050505050565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838116601b90810b9160e086811d9291861690910b9085901d612f8984848484614373565b979650505050505050565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838116601b90810b9160e086811d9291861690910b9085901d612fd78484848461438a565b12979650505050505050565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838116601b90810b9160e086811d9291861690910b9085901d6130268484848461438a565b1315979650505050505050565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838116601b90810b9160e086811d9291861690910b9085901d6130768484848461438a565b13979650505050505050565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838116601b90810b9160e086811d9291861690910b9085901d6130c58484848461438a565b1215979650505050505050565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8216601b0b60e083901d828212156131125761310c828261445e565b90925090505b5f612f3d8383614501565b5f808515841517801561314957865f0361313d578484925092505061324a565b8686925092505061324a565b613153878761455f565b9097509550613162858561455f565b909550935085841315613176579395929492935b838603604c81111561318f57878793509350505061324a565b80600a0a86816131a1576131a1615869565b0595505086850180881860ff90811c151589881890911c1516801561323c57877f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03613223576040517fd556b111000000000000000000000000000000000000000000000000000000008152600481018a905260248101899052604401610280565b600a968790059690980586019760019790970196613240565b8198505b5050868692509250505b94509492505050565b5f601b83900b83148383826132b7577d90e40fbeea1d3a4abc8955e946fe31cdcf66f634e100000000000000000086051561329757620186a0860595506005850194505b8586601b0b146132b257600a86059550846001019450613297565b6132cd565b855f036132cd57505f925060019150612f1b9050565b848560030b14613329575f8512156132ed57505f9250829150612f1b9050565b6040517fd556b1110000000000000000000000000000000000000000000000000000000081526004810183905260248101829052604401610280565b50507bffffffffffffffffffffffffffffffffffffffffffffffffffffffff841660e084901b1791509250929050565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838116601b90810b9160e086811d9291861690910b9085901d848061339e8686868661311d565b915091505f6133ad8383614501565b9a9950505050505050505050565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838116601b90810b9160e086811d9291861690910b9085901d848061339e868686866134bc565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8216601b0b60e083901d82811261343757509192915050565b5f8061344384846145b5565b91509150805f03613458575093949350505050565b5f8113156134b1576134ac82847f161bcca7119915b50764b4abe86529797775a5f17195100000000000000000007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb461311d565b935091505b5f612f898385614501565b5f80835f03613501576040517f7a97930f0000000000000000000000000000000000000000000000000000000081526004810187905260248101869052604401610280565b855f0361351257505f90508061324a565b5f805f806135208a8a61461d565b919b5099509150613531888861461d565b919950975090505f6135428b6148be565b90505f61354e8a6148be565b90507f161bcca7119915b50764b4abe86529797775a5f1719510000000000000000000604c8183101561396b5784156135ac57507f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee80000000000000000009050604b61392a565b6f4b3b4ca85a86c47a098a2240000000008310156136d857678ac7230489e8000083101561363c576402540be40083101561360a57620186a08310156135fa5750620186a0905060056138b3565b506402540be4009050600a6138b3565b655af3107a40008310156136295750655af3107a40009050600e6138b3565b50678ac7230489e80000905060136138b3565b6b204fce5e3e2502611000000083101561368e5769152d02c7e14af6800000831015613677575069152d02c7e14af6800000905060176138b3565b506b204fce5e3e250261100000009050601c6138b3565b6d314dc6448d9338c15b0a000000008310156136bd57506d314dc6448d9338c15b0a00000000905060216138b3565b506f4b3b4ca85a86c47a098a224000000000905060266138b3565b780197d4df19d605767337e9f14d3eec8920e4000000000000008310156137d05773af298d050e4395d69670b12b7f4100000000000083101561376b577172cb5bd86321e38cb6ce6682e8000000000083101561374c57507172cb5bd86321e38cb6ce6682e800000000009050602b6138b3565b5073af298d050e4395d69670b12b7f41000000000000905060306138b3565b76010b46c6cdd6e3e0828f4db456ff0c8ea00000000000008310156137ac575076010b46c6cdd6e3e0828f4db456ff0c8ea0000000000000905060356138b3565b50780197d4df19d605767337e9f14d3eec8920e4000000000000009050603a6138b3565b7c03b58e88c75313ec9d329eaaa18fb92f75215b17100000000000000000831015613866577a026e4d30eccc3215dd8f3157d27e23acbdcfe6800000000000000083101561383e57507a026e4d30eccc3215dd8f3157d27e23acbdcfe680000000000000009050603f6138b3565b507c03b58e88c75313ec9d329eaaa18fb92f75215b17100000000000000000905060446138b3565b7e05a8e89d75252446eb5d5d5b1cc5edf20a1a059e10ca0000000000000000008310156138b357507e05a8e89d75252446eb5d5d5b1cc5edf20a1a059e10ca000000000000000000905060495b8183116138e757600a820491507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff016138b3565b815f0361392a576040517f05e51ecb000000000000000000000000000000000000000000000000000000008152600481018d9052602481018c9052604401610280565b8561396b576040517f05e51ecb000000000000000000000000000000000000000000000000000000008152600481018f9052602481018e9052604401610280565b807f8000000000000000000000000000000000000000000000000000000000000000018d1261399e57808d039c50613a11565b7f80000000000000000000000000000000000000000000000000000000000000009c90038c015f811315613a1157807f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038b136139fe57998a0199613a11565b5f8099509950505050505050505061324a565b5f808e128015613a2057505f8c135b15613a5d577f80000000000000000000000000000000000000000000000000000000000000008e01808d13613a55575f613a59565b808d035b9150505b8b818f01039750613a7a8f8e613a7488878961491f565b8b614a04565b90995097505f811315613ac457604c811315613aa4575f809a509a5050505050505050505061324a565b80600a0a8981613ab657613ab6615869565b059850885f03613ac4575f97505b5096985094965061324a95505050505050565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff848116601b0b9060e086901d908516613b145750600191506108769050565b5f8213613bad57815f03613b7157613b2c855f613033565b15613b66576040517f8be8297200000000000000000000000000000000000000000000000000000000815260048101869052602401610280565b505f91506108769050565b6040517fcceba0f10000000000000000000000000000000000000000000000000000000081526004810183905260248101829052604401610280565b613bb8856001612f46565b8015613bc95750613bc9865f612f94565b15613bd8578592505050610876565b613be2855f613033565b15613c0b57613c02613bf387613ede565b613bfc87613e67565b86613ad7565b92505050610876565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8516601b0b60e086901d5f80613c3e84846145b5565b915091505f613c4e83855f614b0b565b905060015f8080613c858f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8116601b0b9160e09190911d90565b915091505b60018510613ccc5784600116600103613caf57613ca984848484613f37565b90945092505b600185901c9450613cc282828484613f37565b9092509050613c8a565b5f80613cd98f8e8e614c22565b91509150613ce982828a8d613f37565b9092509050613cf98f8383614f57565b9092509050613d0a82828888613f37565b90925090505f613d1a8383614501565b9e5050505050505050505050505050509392505050565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8216601b0b60e083901d828112613d6857509192915050565b5f80613d7484846145b5565b915091505f84128015613d8657508015155b156134b1576134ac82847f161bcca7119915b50764b4abe86529797775a5f17195100000000000000000007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb4614082565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8216601b0b60e083901d82613e0a83836145b5565b9150505f613e188284614501565b9695505050505050565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838116601b90810b9160e086811d9291861690910b9085901d848061339e86868686613f37565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8216601b0b60e083901d61310c828261445e565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838116601b90810b9160e086811d9291861690910b9085901d848061339e86868686614082565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8216601b0b60e083901d61310c82826150c8565b5f613f1b8383612f94565b613f255781610876565b5090919050565b5f613f1b8383613033565b5f8085158415178015613f4f575f92505f915061404c565b613f598487615b6f565b91505f613f65886148be565b90505f613f71876148be565b90505f613f7e8383615121565b5090505f6f0785ee10d5da46d900f436a000000000821115613fb3576f0785ee10d5da46d900f436a000000000820491506025015b670de0b6b3a7640000821115613fd457670de0b6b3a7640000820491506012015b633b9aca00821115613fed57633b9aca00820491506009015b61271082111561400257612710820491506004015b811561401657600a82049150600101614002565b6140208187615b6f565b95506140428b8a61403c878761403787600a615b31565b61491f565b89614a04565b9097509550505050505b5094509492505050565b5f610876837fffffffff0000000000000000000000000000000000000000000000000000000584613ad7565b5f8061408e848461445e565b909450925061409f8686868661311d565b9150915094509492505050565b5f80825f526010600f60205f20060261ffff85821c165b80156140ea57805185036140e15760019350602081015192506140ea565b604001516140c3565b50509250929050565b5f806140fe8461515c565b60020260010190505f6141118585615176565b949091019093016020019392505050565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08201805163ffff0000601087901b1661ffff86161782527f312f5ae588c6ff62cd3f006af06cd48c98d7321649db7d8b2c396a81a204655591905f808686036004017ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8801865afa5090525050505050565b73200e12d10bb0c5e4a17e7018f0f1161919bb93893b158061420c575073200e12d10bb0c5e4a17e7018f0f1161919bb93893f7f1de7d717526cba131d684e312dedbf0852adef9cced9e36798ae4937f7145d4114155b15614259576040517f73e6d7b300000000000000000000000000000000000000000000000000000000815273200e12d10bb0c5e4a17e7018f0f1161919bb93896004820152602401610280565b565b5f808060ff841681037f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8611156142a657600a860460018201600a88065f14935093509350506142b0565b8593509150600190505b9250925092565b5f805f805f6142c6878761425b565b9250925092508061430d576040517fc47179660000000000000000000000000000000000000000000000000000000081526004810184905260248101839052604401610280565b50909590945092505050565b5f805f6143268585613253565b915091508061436b576040517f22c9f7bb0000000000000000000000000000000000000000000000000000000081526004810186905260248101859052604401610280565b509392505050565b5f6143808585858561438a565b1495945050505050565b5f80851584151781871282861218178584141780156143af578685925092505061324a565b505f858413156143c3575092949193919260015b8386035f8112604c82131780156143f65782156143e8575f899450945050505061324a565b885f9450945050505061324a565b600a82900a8981028a82828161440e5761440e615869565b051461443a57841561442a575f8b96509650505050505061324a565b8a5f96509650505050505061324a565b841561444f57889650945061324a9350505050565b955087945061324a9350505050565b5f807f800000000000000000000000000000000000000000000000000000000000000084036144f7577f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83036144ea576040517fd556b1110000000000000000000000000000000000000000000000000000000081526004810185905260248101849052604401610280565b600a840593508260010192505b50505f9190910391565b5f805f61450e8585613253565b915091508015801561451e575081155b1561436b576040517f8eba4d070000000000000000000000000000000000000000000000000000000081526004810186905260248101859052604401610280565b5f805f805f61456e878761461d565b9250925092508061430d576040517f05e51ecb0000000000000000000000000000000000000000000000000000000081526004810188905260248101879052604401610280565b5f805f83126145c857508290505f612f1b565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb48312156145fa57505f905082612f1b565b5f839003600a0a80858161461057614610615869565b0794859003959350505050565b5f805f845f0361463557505f915081905060016142b0565b7f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee800000000000000000085055f03614849576f4b3b4ca85a86c47a098a224000000000850515801561469e57507f80000000000000000000000000000000000000000000000000000000000000268412155b156146bf576f4b3b4ca85a86c47a098a224000000000850294506026840393505b7728c87cb5c89a2571ebfdcb54864ada834a00000000000000850515801561470757507f80000000000000000000000000000000000000000000000000000000000000138412155b1561472057678ac7230489e80000850294506013840393505b7b097edd871cfda3a5697758bf0e3cbb5ac5741c640000000000000000850515801561476c57507f800000000000000000000000000000000000000000000000000000000000000a8412155b15614782576402540be40085029450600a840393505b7e3899162693736ac531a5a58f1fbb4b746504382ca7e400000000000000000085051580156147d157507f80000000000000000000000000000000000000000000000000000000000000028412155b156147e757606485029450600284039350614782565b7f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee8000000000000000000850515801561483757507f80000000000000000000000000000000000000000000000000000000000000018412155b1561484957600a850294506001840393505b600a8086029081058614801561487f57507f80000000000000000000000000000000000000000000000000000000000000018512155b1561488e578095506001850394505b50939492935050507f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee80000000000000000008305151590565b5f8082121561491b577f8000000000000000000000000000000000000000000000000000000000000000820361491557507f8000000000000000000000000000000000000000000000000000000000000000919050565b505f0390565b5090565b5f805f61492c8686615121565b91509150815f036149505783818161494657614946615869565b0492505050610876565b83821061499a576040517f6c59da12000000000000000000000000000000000000000000000000000000008152600481018790526024810186905260448101859052606401610280565b5f84868809600186198101871696879004966002600389028118808a02820302808a02820302808a02820302808a02820302808a02820302808a02909103025f82900382900490920185841190960395909502919093039390930492909217029150509392505050565b5f805f8587181215614ace577f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff841115614abb57614a637f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6001615903565b8403614a9357507f800000000000000000000000000000000000000000000000000000000000000090508161324a565b614a9e600a856159e9565b614aa790615b96565b614ab2846001615b6f565b9150915061324a565b614ac484615b96565b839150915061324a565b7f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff841115614b0157614aa7600a856159e9565b508290508161324a565b5f818303614b1a575082610876565b82821315614b5d57828203604c811380614b3457505f8113155b15614b42575f915050610876565b80600a0a8581614b5457614b54615869565b05915050610876565b818303604c811380614b6f57505f8113155b15614bb7576040517f1d5d6d10000000000000000000000000000000000000000000000000000000008152600481018690526024810185905260448101849052606401610280565b600a81900a85810286828281614bcf57614bcf615869565b0514614c18576040517f1d5d6d10000000000000000000000000000000000000000000000000000000008152600481018890526024810187905260448101869052606401610280565b9250610876915050565b5f808383614c30828261455f565b90965094505f8613614cb157855f03614c75576040517f561fc7b500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517f5d3fd4db0000000000000000000000000000000000000000000000000000000081526004810183905260248101829052604401610280565b5050837f161bcca7119915b50764b4abe86529797775a5f171951000000000000000000003614cef57614ce583604c615b6f565b5f91509150610974565b7f161bcca7119915b50764b4abe86529797775a5f171951000000000000000000084121580614d3e577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb5614d60565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb45b5f0b8412614f1b575f805f805f85614d7957604b614d7c565b604c5b614d86908a615b6f565b90505f8087614db3577d90e40fbeea1d3a4abc8955e946fe31cdcf66f634e1000000000000000000614dd4565b7e05a8e89d75252446eb5d5d5b1cc5edf20a1a059e10ca0000000000000000005b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff169050808c81614e0657614e06615869565b05818102955090850193507ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc18019050614e3f8c826151cc565b7d90e40fbeea1d3a4abc8955e946fe31cdcf66f634e10000000000000000000295508594508a8414614ecb576123278114614ea657614e818c826001016151cc565b7d90e40fbeea1d3a4abc8955e946fe31cdcf66f634e100000000000000000002614ec8565b7f161bcca7119915b50764b4abe86529797775a5f17195100000000000000000005b94505b50614efb838b848c89897fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb4615253565b909a509850614f0c8a8a835f61311d565b97509750505050505050610974565b614f2585856150c8565b9095509350614f35868686614c22565b9095509350614f44858561445e565b9250925050610974565b50935093915050565b5f805f841215614f9357614f6b848461445e565b9094509250614f7b858585614f57565b9094509250614f8a84846150c8565b91509150610974565b5f80614f9f86866145b5565b9092509050845f8080614fb285856152f0565b9194509250905061270d612710614fca600182615bc6565b8514614fe157614fdb8d86866153df565b90925090505b831561506c575f614ff3866001615b6f565b90505b80848583028161500857615008615869565b051461501f57600a84059350600a88059750614ff6565b61506061502c8588615bec565b896150378785615bec565b8f87877ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc615253565b909d509b506150939050565b819b507ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc9a505b5050505050866150a484835f614b0b565b6150af886001615b6f565b6150b99190615b6f565b94509450505050935093915050565b5f806151167f161bcca7119915b50764b4abe86529797775a5f17195100000000000000000007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb486866134bc565b915091509250929050565b5f807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83850993909202808410938190039390930393915050565b5f81515f0361516c57505f919050565b50602001515f1a90565b5f6151808361515c565b82106151bc5781836040517ffcfaeff1000000000000000000000000000000000000000000000000000000008152600401610280929190615c37565b50600202016003015161ffff1690565b5f806151db600a6123286159e9565b6151e69060026159fc565b6151f1906001615903565b90505f615201600a6123286159e9565b90506002600a8504026001015f8052600281601e883c505f51617fff8116935061800081161561523057918101915b505f80526001600a8506600a6064870402018301601f873c50505f510192915050565b5f808888036152665750839050816152e4565b5f805f806152768c8b8f8d614082565b915091505f806152888a8a8d8c614082565b9150915061529884848484613f37565b8096508197505050505050505f806152b28b8b8f8d614082565b915091505f806152c4868686866134bc565b915091505f806152d684848f8e61311d565b909a50985050505050505050505b97509795505050505050565b5f805f837ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0361532857508391505f905060016142b0565b7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8412156153b6577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb084121561538757505f91505082151560016142b0565b5f846004015f03600a0a90505f8187816153a3576153a3615869565b05945050808402861415925090506142b0565b5f84126153cb57505f915081905060016142b0565b50505060048101600a0a82025f60016142b0565b5f808060646153f1600a6123286159e9565b6153fe600a6123286159e9565b6154099060026159fc565b615414906001615903565b61541e9190615903565b6154289190615903565b905061546c565b5f8052600280600a8504028301601e833c5f80516107d0840193505f80526001600a8606600a6064880402018501601f853c5f5101949350505050565b61547785828861542f565b92508315614f4e5761548d60018601828861542f565b915050935093915050565b614259615c4f565b5f602082840312156154b0575f80fd5b81357fffffffff0000000000000000000000000000000000000000000000000000000081168114610876575f80fd5b5f81518084528060208401602086015e5f6020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b602081525f61087660208301846154df565b5f6020828403121561554d575f80fd5b813567ffffffffffffffff811115615563575f80fd5b820160e08185031215610876575f80fd5b5f815180845260208085019450602084015f5b838110156155a357815187529582019590820190600101615587565b509495945050505050565b604081525f6155c06040830185615574565b8281036020848101919091528451808352858201928201905f5b818110156155f6578451835293830193918301916001016155da565b5090979650505050505050565b73ffffffffffffffffffffffffffffffffffffffff81168114615624575f80fd5b50565b5f60208284031215615637575f80fd5b813561087681615603565b5f8083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112615675575f80fd5b83018035915067ffffffffffffffff82111561568f575f80fd5b6020019150600581901b3603821315612f1b575f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff8111828210171561571a5761571a6156a6565b604052919050565b5f67ffffffffffffffff82111561573b5761573b6156a6565b5060051b60200190565b5f61575761575284615722565b6156d3565b83815260208082019190600586811b860136811115615774575f80fd5b865b818110156157fb57803567ffffffffffffffff811115615794575f80fd5b880136601f8201126157a4575f80fd5b80356157b261575282615722565b81815290851b820186019086810190368311156157cd575f80fd5b928701925b828410156157eb578335825292870192908701906157d2565b8952505050948301948301615776565b5092979650505050505050565b5f8083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261583b575f80fd5b83018035915067ffffffffffffffff821115615855575f80fd5b602001915036819003821315612f1b575f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f826158a4576158a4615869565b500690565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b8082018082111561017f5761017f6158d6565b828152604060208201525f61592e6040830184615574565b949350505050565b5f6020808385031215615947575f80fd5b825167ffffffffffffffff81111561595d575f80fd5b8301601f8101851361596d575f80fd5b805161597b61575282615722565b81815260059190911b82018301908381019087831115615999575f80fd5b928401925b82841015612f895783518252928401929084019061599e565b5f602082840312156159c7575f80fd5b5051919050565b5f602082840312156159de575f80fd5b815161087681615603565b5f826159f7576159f7615869565b500490565b808202811582820484141761017f5761017f6158d6565b600181815b80851115615a6c57817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115615a5257615a526158d6565b80851615615a5f57918102915b93841c9390800290615a18565b509250929050565b5f82615a825750600161017f565b81615a8e57505f61017f565b8160018114615aa45760028114615aae57615aca565b600191505061017f565b60ff841115615abf57615abf6158d6565b50506001821b61017f565b5060208310610133831016604e8410600b8410161715615aed575081810a61017f565b615af78383615a13565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115615b2957615b296158d6565b029392505050565b5f6108768383615a74565b8181038181111561017f5761017f6158d6565b5f60208284031215615b5f575f80fd5b815160ff81168114610876575f80fd5b8082018281125f831280158216821582161715615b8e57615b8e6158d6565b505092915050565b5f7f80000000000000000000000000000000000000000000000000000000000000008203614915576149156158d6565b8181035f831280158383131683831282161715615be557615be56158d6565b5092915050565b8082025f82127f800000000000000000000000000000000000000000000000000000000000000084141615615c2357615c236158d6565b818105831482151761017f5761017f6158d6565b828152604060208201525f61592e60408301846154df565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52605160045260245ffdfe097c09cb0a0d0bce0c4e0c600c780cba0d0f0d210d330d450dea0e270ff3115d124813ea1539160916cd181c13ea190a19391939196819971a1f1a331b201b841b9c1c171c2f1c471c801caa1cc21cda1ce71de21e041e111ec91f181f5b1f7f1f8c1f992032207b20882107215621a521f222412290234823742396244e248f24b625032550259f25ec263926862777" + "object": "0x608060405234801561000f575f80fd5b506004361061003f575f3560e01c806301ffc9a714610043578063514b5d4f1461006b578063d04dfe2314610080575b5f80fd5b6100566100513660046154f8565b6100a1565b60405190151581526020015b60405180910390f35b610073610185565b6040516100629190615583565b61009361008e366004615595565b610194565b604051610062929190615606565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082167fd04dfe2300000000000000000000000000000000000000000000000000000000148061013357507fffffffff0000000000000000000000000000000000000000000000000000000082167f514b5d4f00000000000000000000000000000000000000000000000000000000145b8061017f57507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b92915050565b606061018f610390565b905090565b6060805f61021b84830135602086018035906101b0908861567f565b6101bd608089018961569a565b6101c69161579d565b6101ce610645565b6101db60408b018b615860565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152509297969594939250506106659050565b9050600261022c60c086018661569a565b6102379291506158ee565b156102895761024960c085018561569a565b6040517f01c71f3d000000000000000000000000000000000000000000000000000000008152610280925060040190815260200190565b60405180910390fd5b5f5b61029860c086018661569a565b905081101561031b576060820151610304906102b760c088018861569a565b848181106102c7576102c7615901565b90506020020135878060c001906102de919061569a565b6102e986600161595b565b8181106102f8576102f8615901565b905060200201356107b0565b606083015261031460028261595b565b905061028b565b5061038661032c60a086018661569a565b808060200260200160405190810160405280939291908181526020018383602002808284375f92019190915250859392507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff915050610886565b9250925050915091565b6040805161094081018252604980825261098560208301526109d492820192909252610a16606082810191909152610bd76080830152610c5760a0830152610c6960c0830152610c8160e0830152610cc3610100830152610d18610120830152610d2a610140830152610d3c610160830152610d4e610180830152610df36101a0830152610e306101c0830152610ffc6101e08301526111666102008301526112516102208301526113f361024083018190526115426102608401526116126102808401526116d66102a08401526118256102c08401526102e083015261191361030083015261194261032083018190526103408301526119716103608301526119a0610380830152611a286103a0830152611a3c6103c0830152611b296103e0830152611b8d610400830152611ba5610420830152611c20610440830152611c38610460830152611c50610480830152611c896104a0830152611cb36104c0830152611ccb6104e0830152611ce3610500830152611cf0610520830152611deb610540830152611e0d610560830152611e1a610580830152611ed26105a0830152611f216105c0830152611f646105e0830152611f88610600830152611f95610620830152611fa261064083015261203b6106608301526120846106808301526120916106a08301526121106106c083015261215f6106e08301526121ae6107008301526121fb61072083015261224a6107408301526122996107608301526123516107808301526123a06107a08301526123cc6107c08301526123ee6107e08301526124a66108008301526124e761082083015261250e61084083015261255b6108608301526125a86108808301526125f76108a08301526126446108c08301526126916108e08301526126de6109008301526127cf610920830152919081908061063c81612801565b94505050505090565b60606040518060c0016040528060928152602001615cd560929139905090565b6106c660405180610120016040528060608152602001606081526020015f81526020015f81526020015f81526020015f73ffffffffffffffffffffffffffffffffffffffff1681526020016060815260200160608152602001606081525090565b602087810180516040600191820184028b018181015182515f91821a808252948501870281019093526041808301968381019593600285020190910191908401905b8381101561074657875160f01c83015160408051600192831a8082528301602090810290910191829052908452600290990198929092019101610708565b505050506040518061012001604052808281526020018481526020018b81526020015f81526020018a81526020018973ffffffffffffffffffffffffffffffffffffffff168152602001888152602001838152602001878152509450505050509695505050505050565b5f82815260208120600f900660100284811c61ffff1690815b82156107e357825186146107e357604083015192506107c9565b821580156108315760405193506060840160405286845285602085015281604085015260028860f01c0161ffff60f01b1989168160f01b1798505061ffff831b19881684841b179750610838565b8560208501525b50505061ffff81111561087a576040517fcadaf56d00000000000000000000000000000000000000000000000000000000815260048101829052602401610280565b849150505b9392505050565b6060805f8061089d8760e001518860400151612885565b915091505f80885f01518960400151815181106108bc576108bc615901565b60200260200101519150819050838851146109105787516040517fd628439f000000000000000000000000000000000000000000000000000000008152610280918691600401918252602082015260400190565b875115610935575f60208951028203915060208901905061093381838b516128a8565b505b610945898a6040015183856128b4565b90505f8388106109555783610957565b875b90506060602083039050818152806109728c60600151612b45565b975097505050505050505b935093915050565b604083015183516020600192830181029091015161ffff8516909201029003517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0909101908152809392505050565b60208084015161ffff841660010190910201517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0909101908152809392505050565b602083015180515f9161ffff851691600f601087901c811692601488901c9091169185919085908110610a4b57610a4b615901565b602002602001015190505f80610a64839060a082901c90565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08a0180518882526040517f58c07152000000000000000000000000000000000000000000000000000000008152939550919350915f9073ffffffffffffffffffffffffffffffffffffffff8616906358c0715290610ae9908790879060040161596e565b5f60405180830381865afa158015610b03573d5f803e3d5ffd5b505050506040513d5f823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201604052610b48919081019061598e565b905080518714610b915780516040517fc3385cb0000000000000000000000000000000000000000000000000000000008152610280918991600401918252602082015260400190565b818352602088028b019a50602081016020880281015b80821015610bc45760208d039c5081518d52602082019150610ba7565b509a9d9c50505050505050505050505050565b60c083015180515f9160ff85811692600887901c90911691849184908110610c0157610c01615901565b60200260200101518281518110610c1a57610c1a615901565b60209081029190910101517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0909501948552509295945050505050565b60208101805182511681529392505050565b80515f90610c7681612db8565b835250909392505050565b80516001600884901c60ff9081169190911b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0193161c919091168152919050565b805160209091018051600160ff600886901c81169190911b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01941684811b199091169390921690911b919091178152919050565b60208101805182511781529392505050565b805161ffff83161b8152809392505050565b805161ffff83161c8152809392505050565b8251600161ffff841690810160209081028301515f93600f601088901c811693601489901c90911692908190850288015b80891015610d9c5760208203915088518252602089019850610d7f565b5060408a01805190879052610db38b8284866128b4565b60408c0182905260208602998a9003999092508201895b81841015610de2578351815260209384019301610dca565b50989b9a5050505050505050505050565b60109190911c600f166020028082207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09190920101908152919050565b805160208201516040909201805190925f929173ffffffffffffffffffffffffffffffffffffffff83168314610e95576040517f0255ddd800000000000000000000000000000000000000000000000000000000815260048101849052602401610280565b8173ffffffffffffffffffffffffffffffffffffffff168214610ee7576040517f0255ddd800000000000000000000000000000000000000000000000000000000815260048101839052602401610280565b8073ffffffffffffffffffffffffffffffffffffffff168114610f39576040517f0255ddd800000000000000000000000000000000000000000000000000000000815260048101829052602401610280565b6040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff838116600483015282811660248301525f919085169063dd62ed3e90604401602060405180830381865afa158015610fae573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610fd29190615a0f565b90505f610fde85612e90565b90505f610feb8383612f39565b508852509598975050505050505050565b80516020909101805190915f9173ffffffffffffffffffffffffffffffffffffffff8216821461105b576040517f0255ddd800000000000000000000000000000000000000000000000000000000815260048101839052602401610280565b8073ffffffffffffffffffffffffffffffffffffffff1681146110ad576040517f0255ddd800000000000000000000000000000000000000000000000000000000815260048101829052602401610280565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff82811660048301525f91908416906370a0823190602401602060405180830381865afa15801561111a573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061113e9190615a0f565b90505f61114a84612e90565b90505f6111578383612f7a565b87525094979650505050505050565b80515f9073ffffffffffffffffffffffffffffffffffffffff811681146111bc576040517f0255ddd800000000000000000000000000000000000000000000000000000000815260048101829052602401610280565b5f8173ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611206573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061122a9190615a0f565b90505f61123683612e90565b90505f6112438383612f7a565b865250939695505050505050565b805160208201516040909201805190925f929173ffffffffffffffffffffffffffffffffffffffff831683146112b6576040517f0255ddd800000000000000000000000000000000000000000000000000000000815260048101849052602401610280565b8173ffffffffffffffffffffffffffffffffffffffff168214611308576040517f0255ddd800000000000000000000000000000000000000000000000000000000815260048101839052602401610280565b8073ffffffffffffffffffffffffffffffffffffffff16811461135a576040517f0255ddd800000000000000000000000000000000000000000000000000000000815260048101829052602401610280565b6040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff838116600483015282811660248301525f919085169063dd62ed3e90604401602060405180830381865afa1580156113cf573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906112439190615a0f565b80516020909101805190915f9173ffffffffffffffffffffffffffffffffffffffff82168214611452576040517f0255ddd800000000000000000000000000000000000000000000000000000000815260048101839052602401610280565b8073ffffffffffffffffffffffffffffffffffffffff1681146114a4576040517f0255ddd800000000000000000000000000000000000000000000000000000000815260048101829052602401610280565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff82811660048301525f91908416906370a0823190602401602060405180830381865afa158015611511573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115359190615a0f565b8552509295945050505050565b80515f9073ffffffffffffffffffffffffffffffffffffffff81168114611598576040517f0255ddd800000000000000000000000000000000000000000000000000000000815260048101829052602401610280565b5f8173ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156115e2573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906116069190615a0f565b84525091949350505050565b80515f9073ffffffffffffffffffffffffffffffffffffffff81168114611668576040517f0255ddd800000000000000000000000000000000000000000000000000000000815260048101829052602401610280565b5f8173ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156116b2573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906116069190615a26565b80516020909101805190915f9173ffffffffffffffffffffffffffffffffffffffff82168214611735576040517f0255ddd800000000000000000000000000000000000000000000000000000000815260048101839052602401610280565b8073ffffffffffffffffffffffffffffffffffffffff168114611787576040517f0255ddd800000000000000000000000000000000000000000000000000000000815260048101829052602401610280565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff82811660048301525f91908416906370a0823190602401602060405180830381865afa1580156117f4573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906118189190615a0f565b90505f611243825f612f7a565b80516020909101805190915f9173ffffffffffffffffffffffffffffffffffffffff82168214611884576040517f0255ddd800000000000000000000000000000000000000000000000000000000815260048101839052602401610280565b6040517f6352211e000000000000000000000000000000000000000000000000000000008152600481018290525f9073ffffffffffffffffffffffffffffffffffffffff841690636352211e90602401602060405180830381865afa1580156118ef573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115359190615a26565b437fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09190910190815292915050565b427fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09190910190815292915050565b467fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09190910190815292915050565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe06020600f601085901c1602828101918201925f928391905b80821015611a1c57815192507bffffffffffffffffffffffffffffffffffffffffffffffffffffffff831615611a1157828652611a1c565b8160200191506119d9565b50939695505050505050565b805160209091018051909114815292915050565b5f805f80805f80600f8960101c169350600284069250879150602083850302820190506020831502810397508215611a7357805194505b5f5b81831015611abe5750815195507bffffffffffffffffffffffffffffffffffffffffffffffffffffffff86161580611ab35760208301518952611abe565b826040019250611a75565b8015611b1a57604080518082019091525f6020820152600887901c601f88168083019190915281525b6040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102809190615583565b50969998505050505050505050565b805160208201516040909201915f91907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8216611b8357604080518082019091525f6020820152600882901c601f8316808301919091528152611ae7565b5091949350505050565b80516020909101805190915f91826115358383612f9e565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe06020600f601085901c1602828101918201925f928391905b80821015611a1c57815192507bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8316611c15575f8652611a1c565b816020019150611bde565b80516020909101805190915f91826115358383612fec565b80516020909101805190915f9182611535838361303b565b805160407bffffffffffffffffffffffffffffffffffffffffffffffffffffffff90911615156020028203810151910190815292915050565b80515f90817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff821615611606565b80516020909101805190915f9182611535838361308b565b80516020909101805190915f918261153583836130da565b80515f90610c768161312a565b805160208201516040909201915f91907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff808316601b90810b9160e085811d9291851690910b9084901d611d4284848484613175565b9094509250600f60108a901c1660025b81811015611da85789516020909a019996507bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8716601b0b935060e087901d9250611d9b86868686613175565b9096509450600101611d52565b5050611db484846132ab565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe098909801978852509598975050505050505050565b80516020909101805190915f916116066002611e0784846133b1565b90613413565b80515f90610c7681613458565b805160208201516040909201915f91907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff808316601b90810b9160e085811d9291851690910b9084901d611e6c84848484613514565b9094509250600f60108a901c1660025b81811015611da85789516020909a019996507bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8716601b0b935060e087901d9250611ec586868686613514565b9096509450600101611e7c565b7fffffffbe19cfc6ef4f44cf88f14500d013df534fcaad48fca1d5ca47bea26fcc7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09190910190815292915050565b80515f90610c767fffffffbe19cfc6ef4f44cf88f14500d013df534fcaad48fca1d5ca47bea26fcc8273c51a14251b0dcf0ae24a96b7153991378938f5f5613b2f565b80515f90610c7660028273c51a14251b0dcf0ae24a96b7153991378938f5f5613b2f565b80515f90610c7681613d89565b80515f90610c7681613e2f565b80516020909101805190915f9182611fba838261308b565b90505f611fc7838261308b565b90505f6120257fffffffff0000000000000000000000000000000000000000000000000000000573c51a14251b0dcf0ae24a96b7153991378938f5f561201e61200f8861312a565b6120188a61312a565b90613e7a565b9190613b2f565b9050811515831515146112435761115781613ebf565b80515f906120528161204c81613458565b90613ef1565b90507bffffffffffffffffffffffffffffffffffffffffffffffffffffffff811661207b575060015b82525092915050565b80515f90610c7681613f36565b805160208201516040909201915f91906120ab8282613f68565b9150600f601086901c1660025b818110156120de57855160209096019592506120d48484613f68565b93506001016120b8565b5050507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0929092019182525092915050565b7f80000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09190910190815292915050565b7f7fffffff7fffffffffffffffffffffffffffffffffffffffffffffffffffffff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09190910190815292915050565b805160208201516040909201915f91906121c88282613f84565b9150600f601086901c1660025b818110156120de57855160209096019592506121f18484613f84565b93506001016121d5565b7f7fffffff800000000000000000000000000000000000000000000000000000007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09190910190815292915050565b7f80000000000000000000000000000000000000000000000000000000000000017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09190910190815292915050565b805160208201516040909201915f91907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff808316601b90810b9160e085811d9291851690910b9084901d6122eb84848484613f8f565b9094509250600f60108a901c1660025b81811015611da85789516020909a019996507bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8716601b0b935060e087901d925061234486868686613f8f565b90965094506001016122fb565b7fffffffbe1dd4c9e873614f593bba9c6007d9a7ac8d03a4b6c700a65cb537a1b47fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09190910190815292915050565b80516020909101805190915f91611606828273c51a14251b0dcf0ae24a96b7153991378938f5f5613b2f565b80515f90610c768173c51a14251b0dcf0ae24a96b7153991378938f5f56140ae565b805160208201516040909201915f91907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff808316601b90810b9160e085811d9291851690910b9084901d612440848484846140da565b9094509250600f60108a901c1660025b81811015611da85789516020909a019996507bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8716601b0b935060e087901d9250612499868686866140da565b9096509450600101612450565b805160208201516040909201805190925f92916115356124e08273c51a14251b0dcf0ae24a96b7153991378938f5f561201e8660016133b1565b8490613e7a565b805160208201516040909201805190925f92916115356125078383613e7a565b84906133b1565b805160208201516040909201915f9190612528818361595b565b9150600f601086901c1660025b818110156120de5785516020909601959250612551838561595b565b9350600101612535565b805160208201516040909201915f91906125758183615a41565b9150600f601086901c1660025b818110156120de578551602090960195925061259e8385615a41565b9350600101612582565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09190910190815292915050565b805160208201516040909201915f91906126118183615a54565b9150600f601086901c1660025b818110156120de578551602090960195925061263a8385615a54565b935060010161261e565b805160208201516040909201915f919061265e8183615b89565b9150600f601086901c1660025b818110156120de57855160209096019592506126878385615b89565b935060010161266b565b805160208201516040909201915f91906126ab8183615b94565b9150600f601086901c1660025b818110156120de57855160209096019592506126d48385615b94565b93506001016126b8565b805160608401515f9190829081906126f69084614104565b91509150815f036127c05760a087015160808801516040517f295f36d70000000000000000000000000000000000000000000000000000000081526004810191909152602481018590525f9173ffffffffffffffffffffffffffffffffffffffff169063295f36d790604401602060405180830381865afa15801561277d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906127a19190615a0f565b60608901519091506127b49085836107b0565b606089015285526127c4565b8085525b509295945050505050565b8051602082015160608501516040909301925f9291906127f09083836107b0565b606087015250829150509392505050565b60605f825160020267ffffffffffffffff811115612821576128216156fe565b6040519080825280601f01601f19166020018201604052801561284b576020820181803683370190505b50905061ffff80196020850160208651028101600285015b81831015611a1c57805183518616908516178152602090920191600201612863565b5f805f612892858561414b565b51600281901a9660039190911a95509350505050565b6020810283835e505050565b5f80856040015190505f805f805f60028b6101000151516128d59190615a41565b60e08c01516101008d0151602080830151600261ffff9b909b168b8102850160219081015160f01c5f93841a9d909d029095019b909b019384015160258086019b50600791831a9182169182900360040290950190940198509296500193509091506154f090805b86881015612abf5787519050600284825f1a060285015160f01c925062ffffff8160e01c1691506129738e838e8663ffffffff16565b9b506002848260041a060285015160f01c925062ffffff8160c01c1691506129a08e838e8663ffffffff16565b9b506002848260081a060285015160f01c925062ffffff8160a01c1691506129cd8e838e8663ffffffff16565b9b5060028482600c1a060285015160f01c925062ffffff8160801c1691506129fa8e838e8663ffffffff16565b9b506002848260101a060285015160f01c925062ffffff8160601c169150612a278e838e8663ffffffff16565b9b506002848260141a060285015160f01c925062ffffff8160401c169150612a548e838e8663ffffffff16565b9b506002848260181a060285015160f01c925062ffffff8160201c169150612a818e838e8663ffffffff16565b9b5060028482601c1a060285015160f01c925062ffffff81169150612aab8e838e8663ffffffff16565b9b50612ab860208961595b565b975061293d565b612aca601c89615b94565b9750612ad7866004615a54565b612ae1908961595b565b96505b86881015612b275750508551601c81901a83900660020284015160f01c915062ffffff811690612b138e838e86565b9b50612b2060048961595b565b9750612ae4565b612b338d8a8e8e61417a565b50999c9b505050505050505050505050565b6040805160f083901c602081810283010190925290815261ffff63ffffffff67ffffffffffffffff6fffffffffffffffffffffffffffffffff612bb1565b5f5b8215612bab57825182526020830151602083015260408301519250604082019150612b85565b50919050565b602085018660101b60901c8015612ca1578060401c8015612c1f578060201c8015612be357612be08185612b83565b93505b508086168015612c1d578060101c8015612c0457612c018186612b83565b94505b508088168015612c1b57612c188186612b83565b94505b505b505b508084168015612c9f578060201c8015612c63578060101c8015612c4a57612c478186612b83565b94505b508088168015612c6157612c5e8186612b83565b94505b505b508086168015612c9d578060101c8015612c8457612c818186612b83565b94505b508088168015612c9b57612c988186612b83565b94505b505b505b505b508682168015612dad578060401c8015612d2b578060201c8015612cef578060101c8015612cd657612cd38186612b83565b94505b508088168015612ced57612cea8186612b83565b94505b505b508086168015612d29578060101c8015612d1057612d0d8186612b83565b94505b508088168015612d2757612d248186612b83565b94505b505b505b508084168015612dab578060201c8015612d6f578060101c8015612d5657612d538186612b83565b94505b508088168015612d6d57612d6a8186612b83565b94505b505b508086168015612da9578060101c8015612d9057612d8d8186612b83565b94505b508088168015612da757612da48186612b83565b94505b505b505b505b505050505050919050565b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203612de95750610100919050565b507f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f7f5555555555555555555555555555555555555555555555555555555555555555600183901c16909103600281901c7f3333333333333333333333333333333333333333333333333333333333333333908116911601600481901c01167f01010101010101010101010101010101010101010101010101010101010101010260f81c90565b5f612e9961420d565b6040517ff5c36eaf00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8316600482015273200e12d10bb0c5e4a17e7018f0f1161919bb93899063f5c36eaf90602401602060405180830381865afa158015612f15573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061017f9190615ba7565b5f805f805f612f4887876142b3565b9250925092505f80612f5a85856132ab565b9150915081838015612f695750815b9650965050505050505b9250929050565b5f805f612f87858561430f565b91509150612f958282614371565b95945050505050565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838116601b90810b9160e086811d9291861690910b9085901d612fe1848484846143cb565b979650505050505050565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838116601b90810b9160e086811d9291861690910b9085901d61302f848484846143e2565b12979650505050505050565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838116601b90810b9160e086811d9291861690910b9085901d61307e848484846143e2565b1315979650505050505050565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838116601b90810b9160e086811d9291861690910b9085901d6130ce848484846143e2565b13979650505050505050565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838116601b90810b9160e086811d9291861690910b9085901d61311d848484846143e2565b1215979650505050505050565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8216601b0b60e083901d8282121561316a5761316482826144b6565b90925090505b5f612f958383614559565b5f80851584151780156131a157865f0361319557848492509250506132a2565b868692509250506132a2565b6131ab87876145b7565b90975095506131ba85856145b7565b9095509350858413156131ce579395929492935b838603604c8111156131e75787879350935050506132a2565b80600a0a86816131f9576131f96158c1565b0595505086850180881860ff90811c151589881890911c1516801561329457877f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0361327b576040517fd556b111000000000000000000000000000000000000000000000000000000008152600481018a905260248101899052604401610280565b600a968790059690980586019760019790970196613298565b8198505b5050868692509250505b94509492505050565b5f601b83900b831483838261330f577d90e40fbeea1d3a4abc8955e946fe31cdcf66f634e10000000000000000008605156132ef57620186a0860595506005850194505b8586601b0b1461330a57600a860595508460010194506132ef565b613325565b855f0361332557505f925060019150612f739050565b848560030b14613381575f85121561334557505f9250829150612f739050565b6040517fd556b1110000000000000000000000000000000000000000000000000000000081526004810183905260248101829052604401610280565b50507bffffffffffffffffffffffffffffffffffffffffffffffffffffffff841660e084901b1791509250929050565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838116601b90810b9160e086811d9291861690910b9085901d84806133f686868686613175565b915091505f6134058383614559565b9a9950505050505050505050565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838116601b90810b9160e086811d9291861690910b9085901d84806133f686868686613514565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8216601b0b60e083901d82811261348f57509192915050565b5f8061349b848461460d565b91509150805f036134b0575093949350505050565b5f8113156135095761350482847f161bcca7119915b50764b4abe86529797775a5f17195100000000000000000007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb4613175565b935091505b5f612fe18385614559565b5f80835f03613559576040517f7a97930f0000000000000000000000000000000000000000000000000000000081526004810187905260248101869052604401610280565b855f0361356a57505f9050806132a2565b5f805f806135788a8a614675565b919b50995091506135898888614675565b919950975090505f61359a8b614916565b90505f6135a68a614916565b90507f161bcca7119915b50764b4abe86529797775a5f1719510000000000000000000604c818310156139c357841561360457507f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee80000000000000000009050604b613982565b6f4b3b4ca85a86c47a098a22400000000083101561373057678ac7230489e80000831015613694576402540be40083101561366257620186a08310156136525750620186a09050600561390b565b506402540be4009050600a61390b565b655af3107a40008310156136815750655af3107a40009050600e61390b565b50678ac7230489e800009050601361390b565b6b204fce5e3e250261100000008310156136e65769152d02c7e14af68000008310156136cf575069152d02c7e14af68000009050601761390b565b506b204fce5e3e250261100000009050601c61390b565b6d314dc6448d9338c15b0a0000000083101561371557506d314dc6448d9338c15b0a000000009050602161390b565b506f4b3b4ca85a86c47a098a2240000000009050602661390b565b780197d4df19d605767337e9f14d3eec8920e4000000000000008310156138285773af298d050e4395d69670b12b7f410000000000008310156137c3577172cb5bd86321e38cb6ce6682e800000000008310156137a457507172cb5bd86321e38cb6ce6682e800000000009050602b61390b565b5073af298d050e4395d69670b12b7f410000000000009050603061390b565b76010b46c6cdd6e3e0828f4db456ff0c8ea0000000000000831015613804575076010b46c6cdd6e3e0828f4db456ff0c8ea00000000000009050603561390b565b50780197d4df19d605767337e9f14d3eec8920e4000000000000009050603a61390b565b7c03b58e88c75313ec9d329eaaa18fb92f75215b171000000000000000008310156138be577a026e4d30eccc3215dd8f3157d27e23acbdcfe6800000000000000083101561389657507a026e4d30eccc3215dd8f3157d27e23acbdcfe680000000000000009050603f61390b565b507c03b58e88c75313ec9d329eaaa18fb92f75215b171000000000000000009050604461390b565b7e05a8e89d75252446eb5d5d5b1cc5edf20a1a059e10ca00000000000000000083101561390b57507e05a8e89d75252446eb5d5d5b1cc5edf20a1a059e10ca000000000000000000905060495b81831161393f57600a820491507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0161390b565b815f03613982576040517f05e51ecb000000000000000000000000000000000000000000000000000000008152600481018d9052602481018c9052604401610280565b856139c3576040517f05e51ecb000000000000000000000000000000000000000000000000000000008152600481018f9052602481018e9052604401610280565b807f8000000000000000000000000000000000000000000000000000000000000000018d126139f657808d039c50613a69565b7f80000000000000000000000000000000000000000000000000000000000000009c90038c015f811315613a6957807f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038b13613a5657998a0199613a69565b5f809950995050505050505050506132a2565b5f808e128015613a7857505f8c135b15613ab5577f80000000000000000000000000000000000000000000000000000000000000008e01808d13613aad575f613ab1565b808d035b9150505b8b818f01039750613ad28f8e613acc888789614977565b8b614a5c565b90995097505f811315613b1c57604c811315613afc575f809a509a505050505050505050506132a2565b80600a0a8981613b0e57613b0e6158c1565b059850885f03613b1c575f97505b509698509496506132a295505050505050565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff848116601b0b9060e086901d908516613b6c57506001915061087f9050565b5f8213613c0557815f03613bc957613b84855f61308b565b15613bbe576040517f8be8297200000000000000000000000000000000000000000000000000000000815260048101869052602401610280565b505f915061087f9050565b6040517fcceba0f10000000000000000000000000000000000000000000000000000000081526004810183905260248101829052604401610280565b613c10856001612f9e565b8015613c215750613c21865f612fec565b15613c3057859250505061087f565b613c3a855f61308b565b15613c6357613c5a613c4b87613f36565b613c5487613ebf565b86613b2f565b9250505061087f565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8516601b0b60e086901d5f80613c96848461460d565b915091505f613ca683855f614b63565b905060015f8080613cdd8f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8116601b0b9160e09190911d90565b915091505b60018510613d245784600116600103613d0757613d0184848484613f8f565b90945092505b600185901c9450613d1a82828484613f8f565b9092509050613ce2565b5f80613d318f8e8e614c7a565b91509150613d4182828a8d613f8f565b9092509050613d518f8383614faf565b9092509050613d6282828888613f8f565b90925090505f613d728383614559565b9e5050505050505050505050505050509392505050565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8216601b0b60e083901d828112613dc057509192915050565b5f80613dcc848461460d565b915091505f84128015613dde57508015155b156135095761350482847f161bcca7119915b50764b4abe86529797775a5f17195100000000000000000007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb46140da565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8216601b0b60e083901d82613e62838361460d565b9150505f613e708284614559565b9695505050505050565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838116601b90810b9160e086811d9291861690910b9085901d84806133f686868686613f8f565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8216601b0b60e083901d61316482826144b6565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838116601b90810b9160e086811d9291861690910b9085901d84806133f6868686866140da565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8216601b0b60e083901d6131648282615120565b5f613f738383612fec565b613f7d578161087f565b5090919050565b5f613f73838361308b565b5f8085158415178015613fa7575f92505f91506140a4565b613fb18487615bc7565b91505f613fbd88614916565b90505f613fc987614916565b90505f613fd68383615179565b5090505f6f0785ee10d5da46d900f436a00000000082111561400b576f0785ee10d5da46d900f436a000000000820491506025015b670de0b6b3a764000082111561402c57670de0b6b3a7640000820491506012015b633b9aca0082111561404557633b9aca00820491506009015b61271082111561405a57612710820491506004015b811561406e57600a8204915060010161405a565b6140788187615bc7565b955061409a8b8a614094878761408f87600a615b89565b614977565b89614a5c565b9097509550505050505b5094509492505050565b5f61087f837fffffffff0000000000000000000000000000000000000000000000000000000584613b2f565b5f806140e684846144b6565b90945092506140f786868686613175565b9150915094509492505050565b5f80825f526010600f60205f20060261ffff85821c165b80156141425780518503614139576001935060208101519250614142565b6040015161411b565b50509250929050565b5f80614156846151b4565b60020260010190505f61416985856151ce565b949091019093016020019392505050565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08201805163ffff0000601087901b1661ffff86161782527f312f5ae588c6ff62cd3f006af06cd48c98d7321649db7d8b2c396a81a204655591905f808686036004017ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8801865afa5090525050505050565b73200e12d10bb0c5e4a17e7018f0f1161919bb93893b1580614264575073200e12d10bb0c5e4a17e7018f0f1161919bb93893f7f1de7d717526cba131d684e312dedbf0852adef9cced9e36798ae4937f7145d4114155b156142b1576040517f73e6d7b300000000000000000000000000000000000000000000000000000000815273200e12d10bb0c5e4a17e7018f0f1161919bb93896004820152602401610280565b565b5f808060ff841681037f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8611156142fe57600a860460018201600a88065f1493509350935050614308565b8593509150600190505b9250925092565b5f805f805f61431e87876142b3565b92509250925080614365576040517fc47179660000000000000000000000000000000000000000000000000000000081526004810184905260248101839052604401610280565b50909590945092505050565b5f805f61437e85856132ab565b91509150806143c3576040517f22c9f7bb0000000000000000000000000000000000000000000000000000000081526004810186905260248101859052604401610280565b509392505050565b5f6143d8858585856143e2565b1495945050505050565b5f808515841517818712828612181785841417801561440757868592509250506132a2565b505f8584131561441b575092949193919260015b8386035f8112604c821317801561444e578215614440575f89945094505050506132a2565b885f945094505050506132a2565b600a82900a8981028a828281614466576144666158c1565b0514614492578415614482575f8b9650965050505050506132a2565b8a5f9650965050505050506132a2565b84156144a75788965094506132a29350505050565b95508794506132a29350505050565b5f807f8000000000000000000000000000000000000000000000000000000000000000840361454f577f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8303614542576040517fd556b1110000000000000000000000000000000000000000000000000000000081526004810185905260248101849052604401610280565b600a840593508260010192505b50505f9190910391565b5f805f61456685856132ab565b9150915080158015614576575081155b156143c3576040517f8eba4d070000000000000000000000000000000000000000000000000000000081526004810186905260248101859052604401610280565b5f805f805f6145c68787614675565b92509250925080614365576040517f05e51ecb0000000000000000000000000000000000000000000000000000000081526004810188905260248101879052604401610280565b5f805f831261462057508290505f612f73565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb483121561465257505f905082612f73565b5f839003600a0a808581614668576146686158c1565b0794859003959350505050565b5f805f845f0361468d57505f91508190506001614308565b7f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee800000000000000000085055f036148a1576f4b3b4ca85a86c47a098a22400000000085051580156146f657507f80000000000000000000000000000000000000000000000000000000000000268412155b15614717576f4b3b4ca85a86c47a098a224000000000850294506026840393505b7728c87cb5c89a2571ebfdcb54864ada834a00000000000000850515801561475f57507f80000000000000000000000000000000000000000000000000000000000000138412155b1561477857678ac7230489e80000850294506013840393505b7b097edd871cfda3a5697758bf0e3cbb5ac5741c64000000000000000085051580156147c457507f800000000000000000000000000000000000000000000000000000000000000a8412155b156147da576402540be40085029450600a840393505b7e3899162693736ac531a5a58f1fbb4b746504382ca7e4000000000000000000850515801561482957507f80000000000000000000000000000000000000000000000000000000000000028412155b1561483f576064850294506002840393506147da565b7f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee8000000000000000000850515801561488f57507f80000000000000000000000000000000000000000000000000000000000000018412155b156148a157600a850294506001840393505b600a808602908105861480156148d757507f80000000000000000000000000000000000000000000000000000000000000018512155b156148e6578095506001850394505b50939492935050507f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee80000000000000000008305151590565b5f80821215614973577f8000000000000000000000000000000000000000000000000000000000000000820361496d57507f8000000000000000000000000000000000000000000000000000000000000000919050565b505f0390565b5090565b5f805f6149848686615179565b91509150815f036149a85783818161499e5761499e6158c1565b049250505061087f565b8382106149f2576040517f6c59da12000000000000000000000000000000000000000000000000000000008152600481018790526024810186905260448101859052606401610280565b5f84868809600186198101871696879004966002600389028118808a02820302808a02820302808a02820302808a02820302808a02820302808a02909103025f82900382900490920185841190960395909502919093039390930492909217029150509392505050565b5f805f8587181215614b26577f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff841115614b1357614abb7f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600161595b565b8403614aeb57507f80000000000000000000000000000000000000000000000000000000000000009050816132a2565b614af6600a85615a41565b614aff90615bee565b614b0a846001615bc7565b915091506132a2565b614b1c84615bee565b83915091506132a2565b7f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff841115614b5957614aff600a85615a41565b50829050816132a2565b5f818303614b7257508261087f565b82821315614bb557828203604c811380614b8c57505f8113155b15614b9a575f91505061087f565b80600a0a8581614bac57614bac6158c1565b0591505061087f565b818303604c811380614bc757505f8113155b15614c0f576040517f1d5d6d10000000000000000000000000000000000000000000000000000000008152600481018690526024810185905260448101849052606401610280565b600a81900a85810286828281614c2757614c276158c1565b0514614c70576040517f1d5d6d10000000000000000000000000000000000000000000000000000000008152600481018890526024810187905260448101869052606401610280565b925061087f915050565b5f808383614c8882826145b7565b90965094505f8613614d0957855f03614ccd576040517f561fc7b500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517f5d3fd4db0000000000000000000000000000000000000000000000000000000081526004810183905260248101829052604401610280565b5050837f161bcca7119915b50764b4abe86529797775a5f171951000000000000000000003614d4757614d3d83604c615bc7565b5f9150915061097d565b7f161bcca7119915b50764b4abe86529797775a5f171951000000000000000000084121580614d96577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb5614db8565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb45b5f0b8412614f73575f805f805f85614dd157604b614dd4565b604c5b614dde908a615bc7565b90505f8087614e0b577d90e40fbeea1d3a4abc8955e946fe31cdcf66f634e1000000000000000000614e2c565b7e05a8e89d75252446eb5d5d5b1cc5edf20a1a059e10ca0000000000000000005b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff169050808c81614e5e57614e5e6158c1565b05818102955090850193507ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc18019050614e978c82615224565b7d90e40fbeea1d3a4abc8955e946fe31cdcf66f634e10000000000000000000295508594508a8414614f23576123278114614efe57614ed98c82600101615224565b7d90e40fbeea1d3a4abc8955e946fe31cdcf66f634e100000000000000000002614f20565b7f161bcca7119915b50764b4abe86529797775a5f17195100000000000000000005b94505b50614f53838b848c89897fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb46152ab565b909a509850614f648a8a835f613175565b9750975050505050505061097d565b614f7d8585615120565b9095509350614f8d868686614c7a565b9095509350614f9c85856144b6565b925092505061097d565b50935093915050565b5f805f841215614feb57614fc384846144b6565b9094509250614fd3858585614faf565b9094509250614fe28484615120565b9150915061097d565b5f80614ff7868661460d565b9092509050845f808061500a8585615348565b9194509250905061270d612710615022600182615c1e565b8514615039576150338d8686615437565b90925090505b83156150c4575f61504b866001615bc7565b90505b808485830281615060576150606158c1565b051461507757600a84059350600a8805975061504e565b6150b86150848588615c44565b8961508f8785615c44565b8f87877ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc6152ab565b909d509b506150eb9050565b819b507ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc9a505b5050505050866150fc84835f614b63565b615107886001615bc7565b6151119190615bc7565b94509450505050935093915050565b5f8061516e7f161bcca7119915b50764b4abe86529797775a5f17195100000000000000000007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb48686613514565b915091509250929050565b5f807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83850993909202808410938190039390930393915050565b5f81515f036151c457505f919050565b50602001515f1a90565b5f6151d8836151b4565b82106152145781836040517ffcfaeff1000000000000000000000000000000000000000000000000000000008152600401610280929190615c8f565b50600202016003015161ffff1690565b5f80615233600a612328615a41565b61523e906002615a54565b61524990600161595b565b90505f615259600a612328615a41565b90506002600a8504026001015f8052600281601e883c505f51617fff8116935061800081161561528857918101915b505f80526001600a8506600a6064870402018301601f873c50505f510192915050565b5f808888036152be57508390508161533c565b5f805f806152ce8c8b8f8d6140da565b915091505f806152e08a8a8d8c6140da565b915091506152f084848484613f8f565b8096508197505050505050505f8061530a8b8b8f8d6140da565b915091505f8061531c86868686613514565b915091505f8061532e84848f8e613175565b909a50985050505050505050505b97509795505050505050565b5f805f837ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0361538057508391505f90506001614308565b7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc84121561540e577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb08412156153df57505f9150508215156001614308565b5f846004015f03600a0a90505f8187816153fb576153fb6158c1565b0594505080840286141592509050614308565b5f841261542357505f91508190506001614308565b50505060048101600a0a82025f6001614308565b5f80806064615449600a612328615a41565b615456600a612328615a41565b615461906002615a54565b61546c90600161595b565b615476919061595b565b615480919061595b565b90506154c4565b5f8052600280600a8504028301601e833c5f80516107d0840193505f80526001600a8606600a6064880402018501601f853c5f5101949350505050565b6154cf858288615487565b92508315614fa6576154e5600186018288615487565b915050935093915050565b6142b1615ca7565b5f60208284031215615508575f80fd5b81357fffffffff000000000000000000000000000000000000000000000000000000008116811461087f575f80fd5b5f81518084528060208401602086015e5f6020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b602081525f61087f6020830184615537565b5f602082840312156155a5575f80fd5b813567ffffffffffffffff8111156155bb575f80fd5b820160e0818503121561087f575f80fd5b5f815180845260208085019450602084015f5b838110156155fb578151875295820195908201906001016155df565b509495945050505050565b604081525f61561860408301856155cc565b8281036020848101919091528451808352858201928201905f5b8181101561564e57845183529383019391830191600101615632565b5090979650505050505050565b73ffffffffffffffffffffffffffffffffffffffff8116811461567c575f80fd5b50565b5f6020828403121561568f575f80fd5b813561087f8161565b565b5f8083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18436030181126156cd575f80fd5b83018035915067ffffffffffffffff8211156156e7575f80fd5b6020019150600581901b3603821315612f73575f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715615772576157726156fe565b604052919050565b5f67ffffffffffffffff821115615793576157936156fe565b5060051b60200190565b5f6157af6157aa8461577a565b61572b565b83815260208082019190600586811b8601368111156157cc575f80fd5b865b8181101561585357803567ffffffffffffffff8111156157ec575f80fd5b880136601f8201126157fc575f80fd5b803561580a6157aa8261577a565b81815290851b82018601908681019036831115615825575f80fd5b928701925b828410156158435783358252928701929087019061582a565b89525050509483019483016157ce565b5092979650505050505050565b5f8083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112615893575f80fd5b83018035915067ffffffffffffffff8211156158ad575f80fd5b602001915036819003821315612f73575f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f826158fc576158fc6158c1565b500690565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b8082018082111561017f5761017f61592e565b828152604060208201525f61598660408301846155cc565b949350505050565b5f602080838503121561599f575f80fd5b825167ffffffffffffffff8111156159b5575f80fd5b8301601f810185136159c5575f80fd5b80516159d36157aa8261577a565b81815260059190911b820183019083810190878311156159f1575f80fd5b928401925b82841015612fe1578351825292840192908401906159f6565b5f60208284031215615a1f575f80fd5b5051919050565b5f60208284031215615a36575f80fd5b815161087f8161565b565b5f82615a4f57615a4f6158c1565b500490565b808202811582820484141761017f5761017f61592e565b600181815b80851115615ac457817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115615aaa57615aaa61592e565b80851615615ab757918102915b93841c9390800290615a70565b509250929050565b5f82615ada5750600161017f565b81615ae657505f61017f565b8160018114615afc5760028114615b0657615b22565b600191505061017f565b60ff841115615b1757615b1761592e565b50506001821b61017f565b5060208310610133831016604e8410600b8410161715615b45575081810a61017f565b615b4f8383615a6b565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115615b8157615b8161592e565b029392505050565b5f61087f8383615acc565b8181038181111561017f5761017f61592e565b5f60208284031215615bb7575f80fd5b815160ff8116811461087f575f80fd5b8082018281125f831280158216821582161715615be657615be661592e565b505092915050565b5f7f8000000000000000000000000000000000000000000000000000000000000000820361496d5761496d61592e565b8181035f831280158383131683831282161715615c3d57615c3d61592e565b5092915050565b8082025f82127f800000000000000000000000000000000000000000000000000000000000000084141615615c7b57615c7b61592e565b818105831482151761017f5761017f61592e565b828152604060208201525f6159866040830184615537565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52605160045260245ffdfe098509d40a160bd70c570c690c810cc30d180d2a0d3c0d4e0df30e300ffc1166125113f31542161216d6182513f3191319421942197119a01a281a3c1b291b8d1ba51c201c381c501c891cb31ccb1ce31cf01deb1e0d1e1a1ed21f211f641f881f951fa2203b208420912110215f21ae21fb224a2299235123a023cc23ee24a624e7250e255b25a825f72644269126de27cf" } } diff --git a/crates/test_fixtures/abi/RainlangParser.json b/crates/test_fixtures/abi/RainlangParser.json index 164cea372..1fcfcd171 100644 --- a/crates/test_fixtures/abi/RainlangParser.json +++ b/crates/test_fixtures/abi/RainlangParser.json @@ -663,9 +663,9 @@ } ], "bytecode": { - "object": "0x6080604052348015600e575f80fd5b5061549d8061001c5f395ff3fe608060405234801561000f575f80fd5b5060043610610064575f3560e01c80637764fd9c1161004d5780637764fd9c146100b0578063ccf44775146100d1578063d6d8c9a8146100e6575f80fd5b806301ffc9a7146100685780635514ca2014610090575b5f80fd5b61007b610076366004614d0e565b6100ee565b60405190151581526020015b60405180910390f35b6100a361009e366004614e0e565b610186565b6040516100879190614e88565b6100c36100be366004614e0e565b61023e565b604051610087929190614f39565b6100d961025e565b6040516100879190614f8e565b6100d961026d565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082167f1a2c8edd00000000000000000000000000000000000000000000000000000000148061018057507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b92915050565b6040805160208101909152606081525f6101e3836101a2610277565b6101aa61029a565b60408051808201909152600881527f1c991fe52025208200000000000000000000000000000000000000000000000060208201526102ba565b90505f6020840190505f6101fa8580510160200190565b90506102078383836104ac565b915061021483838361050e565b9150604051806020016040528061022a856106db565b90529350505050610239610739565b919050565b606080610255610250846101a2610277565b61077e565b91509150915091565b60606102686108fb565b905090565b6060610268610948565b6060604051806101a0016040528061016381526020016152aa6101639139905090565b60606040518060c001604052806090815260200161540d60909139905090565b6103476040518061026001604052805f81526020015f81526020015f81526020015f81526020015f81526020015f81526020015f80191681526020015f81526020015f81526020015f81526020015f81526020015f81526020015f80191681526020016060815260200160608152602001606081526020015f815260200160608152602001606081525090565b5f6040518061026001604052805f81526020015f81526020015f81526020015f81526020015f81526020015f81526020015f801b81526020015f8152602001600481526020015f81526020015f81526020015f81526020015f801b8152602001848152602001858152602001600467ffffffffffffffff8111156103cd576103cd614d4d565b6040519080825280602002602001820160405280156103f6578160200160208202803683370190505b5081525f602080830182905260408084018b905260609384018a90528051601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016828152808301825283517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00001681178452855290840182905283018190529082018190526080820181905260a082018190526101208201819052610140820181905261020082015290505b95945050505050565b5f5b8183101561050457825160015f9190911a1b6401000026008116156104df576104d8858585610c09565b93506104fe565b658000000000008116156104f8576104d8858585610c4d565b50610504565b506104ae565b50815b9392505050565b815160408051808201909152601081527f7573696e672d776f7264732d66726f6d0000000000000000000000000000000060208201525f919061055090614fa0565b7fffffffffffffffffffffffffffffffff000000000000000000000000000000008216146105815783915050610507565b5060108301925081831061061a5761022084015183037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0017f53c102422473590ce12511beab7637e1c33b596a7d58a80ea98463ad78950000175b6040517fe3e4992d00000000000000000000000000000000000000000000000000000000815260040161061191815260200190565b60405180910390fd5b825160015f91821a1b90640100002600821690036106835761022085015184037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0017f53c102422473590ce12511beab7637e1c33b596a7d58a80ea98463ad78950000176105dc565b836001019350505b818310156105045761069e8484846104ac565b925081831015610504575f806106b5868686610e7b565b9096509092509050816106c9575050610504565b6106d486868361102d565b505061068b565b60c08101516040516060919073ffffffffffffffffffffffffffffffffffffffff602082015f5b841561072357848316825260a09490941c5193602090910190600101610702565b8352604052610731826110ec565b509392505050565b60405162010000811061077b576040517f766c065f00000000000000000000000000000000000000000000000000000000815260048101829052602401610611565b50565b6060805f8361022001515111156108d0575f61079f84610220015160200190565b90505f6107b485610220015180510160200190565b90506107c18583836104ac565b91506107ce85838361050e565b91505b80821015610805576107e48583836104ac565b91506107f185838361113a565b91506107fe85838361153d565b91506107d1565b80821461083e576040517f7d565df600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610100850151600816156108cd5761022085015182037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0017f53c102422473590ce12511beab7637e1c33b596a7d58a80ea98463ad78950000176040517ff06f54cf00000000000000000000000000000000000000000000000000000000815260040161061191815260200190565b50505b5f806108e56108de86611afc565b8690611c31565b915091506108f1610739565b9094909350915050565b6040805160a0810182526004808252611c996020830152611fe592820192909252612025606082810191909152612082608083015291908190805b61093f8161226b565b94505050505090565b6060614d045f604890508091505f6040518061092001604052808467ffffffffffffffff1667ffffffffffffffff1681526020016122fb81526020016122fb81526020016122fb81526020016123c781526020016124db81526020016124db81526020016123c781526020016123c781526020016124db81526020016122fb81526020016122fb81526020016122fb81526020016124db81526020016124db81526020016124db81526020016124db81526020016124db81526020016124db81526020016124db81526020016124db81526020016124db81526020016124db81526020016124db81526020016124db81526020016124db81526020016124db81526020016124db81526020016124db81526020016124db81526020016124db81526020016124db81526020016124db81526020016124db81526020016124db81526020016124db81526020016124db81526020016124db81526020016124db81526020016124db81526020016124db81526020016124db81526020016124db81526020016124db81526020016124db81526020016124db81526020016124db81526020016124db81526020016124db81526020016124db81526020016124db81526020016124db81526020016124db81526020016124db81526020016124db81526020016124db81526020016124db81526020016124db81526020016124db81526020016124db81526020016124db81526020016124db81526020016124db81526020016124db81526020016124db81526020016124db81526020016124db81526020016124db81526020016124db81526020016124db81526020016124db81526020016124db81526020016124db8152509050606081905060488151146109365780516040517fc8b56901000000000000000000000000000000000000000000000000000000008152600481019190915260248101849052604401610611565b610100830180517ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1690525f610c45838364010000260061251d565b949350505050565b6101008301805160011790525f60048301821015610ce75761022084015183037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0017f53c102422473590ce12511beab7637e1c33b596a7d58a80ea98463ad78950000175b6040517f25a7646800000000000000000000000000000000000000000000000000000000815260040161061191815260200190565b825160f01c612f2a8114610d765761022085015184037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0017f53c102422473590ce12511beab7637e1c33b596a7d58a80ea98463ad78950000176040517f3e47169c00000000000000000000000000000000000000000000000000000000815260040161061191815260200190565b6003840193505f5b83851015610e1b5784515f1a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd18101610e0f577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff86015160f01c7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd5d18101610e0d57505050600193840193610e1b565b505b85600101955050610d7e565b80610e715761022086015185037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0017f53c102422473590ce12511beab7637e1c33b596a7d58a80ea98463ad7895000017610cb2565b5092949350505050565b81515f90819081908190600181831a1b6703ff200000000000811615610fa25786610ea7896001615012565b1015610f9957600182811a1b7ffffffffffffffffffffffffffffffffffeffffffffffffffffff00000000000082821701610ee4575f9350610f93565b7ffffffffffffffffffffffffffffffffffffffffffeffffffffff00000000000082821701610f8e576102208a015189037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0017f53c102422473590ce12511beab7637e1c33b596a7d58a80ea98463ad78950000176040517f75c28ff900000000000000000000000000000000000000000000000000000000815260040161061191815260200190565b600193505b50610fe7565b60019250610fe7565b640400000000811615610fb85760029250610fe7565b6b080000000000000000000000811615610fd55760039250610fe7565b505f9450869350849250611024915050565b505f905061101588888861100d83876101a09190910151600291820201015161ffff1690565b63ffffffff16565b90975060019550879450925050505b93509350939050565b73ffffffffffffffffffffffffffffffffffffffff8111156110ca5761022083015182037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0017f53c102422473590ce12511beab7637e1c33b596a7d58a80ea98463ad78950000176040517f9d7e517e00000000000000000000000000000000000000000000000000000000815260040161061191815260200190565b60c09092018051604080516020810190915290815260a01b9290921790915250565b60208101602082510282015b808210156111355781518151835281526020909101907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0016110f8565b505050565b5f5b818310156105045782515f90600190821a1b6f07fffffe8000000000000000000000008116156113b757610100860151600116156111f65761022086015185037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0017f53c102422473590ce12511beab7637e1c33b596a7d58a80ea98463ad78950000175b6040517f5520a51700000000000000000000000000000000000000000000000000000000815260040161061191815260200190565b6f07fffffe0000000000000000000000008116156112c95761122985856f07fffffe0000000003ff200000000000612546565b90955091505f6112398784612615565b50905080156112c35761022087015186037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0017f53c102422473590ce12511beab7637e1c33b596a7d58a80ea98463ad78950000176040517f53e6feba00000000000000000000000000000000000000000000000000000000815260040161061191815260200190565b506112ea565b6112e760018601856f07fffffe0000000003ff20000000000061251d565b94505b856040015160ff1660ff148061130757508560a0015160ff1660ff145b1561138d5761022086015185037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0017f53c102422473590ce12511beab7637e1c33b596a7d58a80ea98463ad78950000176040517f3820634100000000000000000000000000000000000000000000000000000000815260040161061191815260200190565b604086018051600190810190915260a0870180519091019052610100860180516009179052611536565b640100002600811615611409576113d7600186018564010000260061251d565b610100870180517ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1690529450611536565b670400000000000000811615611455575050610100840180516008177ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe16905260019290920191610504565b658000000000008116156114e55761022086015185037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0017f53c102422473590ce12511beab7637e1c33b596a7d58a80ea98463ad78950000175b6040517fedad0c5800000000000000000000000000000000000000000000000000000000815260040161061191815260200190565b61022086015185037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0017f53c102422473590ce12511beab7637e1c33b596a7d58a80ea98463ad78950000176111c1565b505061113c565b5f5b818310156105045782515f90600190821a1b6f07fffffe00000000000000000000000081161561175d57610100860151600116156115f95761022086015185037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0017f53c102422473590ce12511beab7637e1c33b596a7d58a80ea98463ad78950000175b6040517f4e803df600000000000000000000000000000000000000000000000000000000815260040161061191815260200190565b8461161581866f07fffffe0000000003ff200000000000612546565b80945081975050505f8061162e89610240015186612690565b91509150811561166f57611643898989612764565b97505f6116508a836129ef565b905061165d8a8383612a15565b50610100890180516002179052611749565b6116798986612bfa565b9092509050811561169d5761168f895f83612a15565b61169889612c74565b611749565b5f6060848a03600581016116b28d8d8d612764565b9b508c6101e0015151602002602001810190505f60059050604051935060208201840160405282818501528184528394506116fa8860056116f38760200190565b0185612cda565b5050506101e08b015180516001019061172d906117278361171e8680510160200190565b90602002900390565b83612ce3565b5061173a8b60ff84612a15565b50506101008901805160021790525b505050610100860180516001179052611af5565b6101008601516002161561187f576501000000000081165f036117fb5761022086015185037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0017f53c102422473590ce12511beab7637e1c33b596a7d58a80ea98463ad78950000176040517f23b5c6ea00000000000000000000000000000000000000000000000000000000815260040161061191815260200190565b606086810180515f1a6003019190829053603b821115611847576040517f6232f2d900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050610100860180517ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc169052600190940193611af5565b6502000000000081161561195b576060868101515f90811a91908290036119215761022088015187037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0017f53c102422473590ce12511beab7637e1c33b596a7d58a80ea98463ad78950000176040517f7f9db54200000000000000000000000000000000000000000000000000000000815260040161061191815260200190565b808801600383039250828153826004820101515f1a8360028301015160f01c600101535061194e88612c74565b5050600190940193611af5565b6401000026008116156119ad5761197b600186018564010000260061251d565b610100870180517ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1690529450611af5565b6b0800000003ff2004000000008116156119e8576119cc868686612cef565b94506119d786612c74565b610100860180516001179052611af5565b65100000000000811615611a0d57611a008686612e19565b5050600190920191610504565b670800000000000000811615611a4557611a278686612e19565b611a3086613271565b50506004610100850152600190920191610504565b65800000000000811615611aa45761022086015185037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0017f53c102422473590ce12511beab7637e1c33b596a7d58a80ea98463ad78950000176114b0565b61022086015185037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0017f53c102422473590ce12511beab7637e1c33b596a7d58a80ea98463ad78950000176115c4565b505061153f565b60e08101518151516060919060f082901c9060208114611b48576040517f858f2dcf00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604051935060208401601083045f8183535060016008850483018101928391015f80805b88811015611ba55789811c61ffff81165163ffff0000601092831b16811760e01b8786015284019360f08390031b929092179101611b6c565b50825117909152878203017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08181018952908801601f01166040525f5b82811015611c25576002810288016003015161ffff90811683018051602060f082901c019260e09190911c1690611c1a838284612cda565b505050600101611be2565b50505050505050919050565b6060805f611c3e8461359f565b90505f5b81811015611c81575f611c5586836135b9565b60040190505f611c6587846135e8565b60040282019050611c778883836135ff565b5050600101611c42565b5083611c8c866138bf565b92509250505b9250929050565b5f80808080611ca9888888613934565b985090925090508181036040811115611d3d5761022089015183037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0017f53c102422473590ce12511beab7637e1c33b596a7d58a80ea98463ad78950000176040517fff2f594900000000000000000000000000000000000000000000000000000000815260040161061191815260200190565b805f03611dc55761022089015183037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0017f53c102422473590ce12511beab7637e1c33b596a7d58a80ea98463ad78950000176040517fc75cd50900000000000000000000000000000000000000000000000000000000815260040161061191815260200190565b60028106600103611e515761022089015183037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0017f53c102422473590ce12511beab7637e1c33b596a7d58a80ea98463ad78950000176040517fd76d9b5700000000000000000000000000000000000000000000000000000000815260040161061191815260200190565b6001820397505f5b838910611fd45788515f90811a906001821b906703ff000000000000821615611ea557507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd08201611f9e565b6c7e000000000000000000000000821615611ee357507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa98201611f9e565b687e0000000000000000821615611f1d57507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc98201611f9e565b6102208d01518c037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0017f53c102422473590ce12511beab7637e1c33b596a7d58a80ea98463ad78950000176040517f69f1e3e600000000000000000000000000000000000000000000000000000000815260040161061191815260200190565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff909b019a831b96909617955050600401611e59565b50509350909150505b935093915050565b5f805f805f80611ff58888613984565b9296509094509250905061200a898486613e23565b826120158383613ea7565b9550955050505050935093915050565b5f808080612034878787613ef9565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08301805184840382529199509294509092505f91612072816140b3565b9190529698969750505050505050565b6001909101905f80836120a681856fffffffffdffffffffffffffeffffd9ff61251d565b9450848181036121315761022087015186037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0017f53c102422473590ce12511beab7637e1c33b596a7d58a80ea98463ad78950000176040517ff73a1aa800000000000000000000000000000000000000000000000000000000815260040161061191815260200190565b61213c878787610c09565b95508561215a81876fffffffffdfffffffffffffffffffffff61251d565b9650868681106121e65761022089015188037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0017f53c102422473590ce12511beab7637e1c33b596a7d58a80ea98463ad78950000175b6040517fc4b1913500000000000000000000000000000000000000000000000000000000815260040161061191815260200190565b875160015f91821a1b906b20000000000000000000000082169003612256576102208a015189037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0017f53c102422473590ce12511beab7637e1c33b596a7d58a80ea98463ad78950000176121b1565b50600190970196876120158a868686866140df565b60605f825160020267ffffffffffffffff81111561228b5761228b614d4d565b6040519080825280601f01601f1916602001820160405280156122b5576020820181803683370190505b50905061ffff80196020850160208651028101600285015b818310156122ef578051835186169085161781526020909201916002016122cd565b50939695505050505050565b5f8151600103612386575060208101517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8116601b0b60e082901d5f61233e8383836142a3565b905061ffff81111561237c576040517f7938075c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b9250610239915050565b81515f0361239557505f919050565b6040517f1ac6690800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f815160020361249f57602082015160408301517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8216601b0b60e083901d5f61240e8383836142a3565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8516601b0b935060e085901d925090505f6124478484836142a3565b905060ff821180612458575060ff81115b1561248f576040517f7938075c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60081b1794506102399350505050565b600282511015612395576040517ff16066b000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f81515f14612516576040517f9f16b02000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505f919050565b5f5b5f82600186515f1a1b1611838510161561253e5760018401935061251f565b509192915050565b5f80806001818787036020811161255d5780612560565b60205b915050875192505b8519600184841a1b1615818310161561258657600182019150612568565b9681019660208290036008810293841c90931b9261260857604080516020810185905201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152908290527fe47fe8b700000000000000000000000000000000000000000000000000000000825261061191600401614f8e565b5095969095509350505050565b5f806126218484612bfa565b909250905081611c925750610120830180515f93845260209384902060408051928352948201855293909401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000909316601084901b62ff00001617909317909252909160ff90911660010190565b600182810180515f928392600560ff93909316602102870192830192909101835b818310156127555760018301516021909301805190935f90819060ff1681806126da838e6142ff565b915091508186165f036126fc575f809b509b5050505050505050505050611c92565b5f8761270c60018503891661432a565b016004028b015195505062ffffff90811693508416830391506127409050575060019750601c1a9550611c92945050505050565b6127498361432a565b840193505050506126b1565b505f9788975095505050505050565b81516101e08401515f80825291600190831a1b907ffffffffffffffffffffffffffffffffffffffffffffffffff0000000000000008201610e71576127a885615052565b610100870180517ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe169052805190955060015f91821a1b9250805b8587101561298d57865160015f9190911a1b93506401000026008416156128165761280f888888610c09565b96506127e3565b67400000000000000084161561283a5761282f87615052565b96506001905061298d565b6001886101000151165f0361290b57600482036128d25761022088015187037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0017f53c102422473590ce12511beab7637e1c33b596a7d58a80ea98463ad78950000176040517f8c9fdbb300000000000000000000000000000000000000000000000000000000815260040161061191815260200190565b5f6128de898989614402565b60208581028701018190526101008b0180516001179052909850905061290383615052565b9250506127e3565b61022088015187037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0017f53c102422473590ce12511beab7637e1c33b596a7d58a80ea98463ad78950000175b6040517f722cd24a00000000000000000000000000000000000000000000000000000000815260040161061191815260200190565b806129e35761022088015187037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0017f53c102422473590ce12511beab7637e1c33b596a7d58a80ea98463ad7895000017612958565b50905250919392505050565b6101c08201516002828102820101516101e08401515f9261ffff90921691906104a39083565b612a1e8361442a565b610100830180517ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb1660081790526020808401515f90811a8501602101805190911a60ff811492919060018101825350508115612aa7576040517f8092d1ea00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050825180516060808601515f90811a87016061018051939461ffff8616949093921a60ff81149291600886048503601c0191600181018253505f60038201537fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe30180517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00001690911790528115612b6a576040517f3abd0c5e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050602090920183821b176018820185901b178083529160e0829003612bf25760408051601083901b6020908117601f9092017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016918252810190915281517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000168117825286525b505050505050565b6101208201516101408301515f8381526020808220919384939290911c91600160ff84161b80821615612c5f5761ffff83165b8015612c5d578360201c8503612c50576001965061ffff8460101c169550612c5d565b51925061ffff8316612c2d565b505b17610140909601959095525090939092509050565b6060818101515f90811a919082900361113557602083810180515f1a600101919082815350603e8210612cd3576040517fe826b5f600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050505050565b8083835e505050565b6020810283835e505050565b5f8080612cfd868686610e7b565b9096509250905080612d8b5761022086015185037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0017f53c102422473590ce12511beab7637e1c33b596a7d58a80ea98463ad78950000175b6040517fb0e4e5b300000000000000000000000000000000000000000000000000000000815260040161061191815260200190565b5f80612d96846144b6565b6101808901511615612dd75761016088015160101c5b8015801590612db9575082155b15612dd557602081015190519085149250600190910190612dac565b505b61016088015161ffff16612dfd600184612df15782612df5565b8383035b8b9190612a15565b5081612e0d57612e0d88856144cd565b50949695505050505050565b6060828101515f1a908115612ea95761022084015183037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0017f53c102422473590ce12511beab7637e1c33b596a7d58a80ea98463ad78950000176040517f6fb11cdc00000000000000000000000000000000000000000000000000000000815260040161061191815260200190565b5050612eb48261442a565b61010082018051600416600890811790915260a0830151602084015160ff8083169360f89290921c9290911c1681035f819003612fde576004856101000151165f03612f7b5761022085015184037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0017f53c102422473590ce12511beab7637e1c33b596a7d58a80ea98463ad78950000176040517fab1d3ea700000000000000000000000000000000000000000000000000000000815260040161061191815260200190565b90820190603e8210612fb9576040517fe826b5f600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60f882901b6020860152610200850151612fd3908461451f565b6102008601526130f9565b60018111156130f957808310156130705761022085015184037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0017f53c102422473590ce12511beab7637e1c33b596a7d58a80ea98463ad78950000176040517f78ef278200000000000000000000000000000000000000000000000000000000815260040161061191815260200190565b808311156130f95761022085015184037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0017f53c102422473590ce12511beab7637e1c33b596a7d58a80ea98463ad78950000176040517f43168e6800000000000000000000000000000000000000000000000000000000815260040161061191815260200190565b8082036001016020601083028101905b8181101561325d5760a08801516020848a0181015191831c61ffff16915f1a9060015b82811161324b5760208406601c0361314557925160f01c925b83516102008d015160019190911a9061315e90826145a3565b6102008e01525f82851480156131745750896001145b61317f576001613181565b8b5b6102008f015190915061319490826145e9565b6102008f0152600f8111806131a95750600f82115b1561322f576102208e01518d037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0017f53c102422473590ce12511beab7637e1c33b596a7d58a80ea98463ad78950000176040517f7ea1869f00000000000000000000000000000000000000000000000000000000815260040161061191815260200190565b818160041b17600187015350506004939093019260010161312c565b50506001909401935050601001613109565b5050505060081b60a0909301929092525050565b60e081015160208083015160f083811c925f9290921a60010191908390036132c5576040517fa806284100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610200850151855180515f928392909160219060101c61ffff165b80156132f757805190925060101c61ffff166132e0565b506040518a82018051919650601c8401939160049160248901915f90811a805b8d8310156133dc5760048202860195506004878a03045b8082111561334c57965161ffff16601c81019950969003600761332e565b506004810298899003805186529894909401938103865b60078211156133a8575160101c61ffff1680518652601c909501947ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff990910190613363565b81156133c3575160101c61ffff168051865260048202909501945b50505060019182018051909291909101905f1a80613317565b50505082895250600488810180517fffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9290940491909101601881901b8817939093179052601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660405260ff1094505083156134a8576040517fe972437e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6134b56001808a1b615089565b891685891b60f06134c78b6010615012565b901b171760e08b01526101008a0180517ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7169052604080516020601f9091017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01681815280820183525f80517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00001682178152908d52908c01819052908b0181905260608b0181905260808b0181905260a08b018190526101208b018190526101408b018190526102008b015250505050505050505050565b5f81515f036135af57505f919050565b50602001515f1a90565b5f806135c48461359f565b60020260010190505f6135d7858561465c565b949091019093016020019392505050565b5f806135f484846135b9565b515f1a949350505050565b808210156111355781517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0160f882901c016138395760c08401515b80156138375760a081901c5161016086015161ffff60e085901c1660208101805160089390931b62ffff0016600187901a1760e81b7cffffffffffffffffffffffffffffffffffffffffffffffffffffffffff909316929092179091526040517f570c7a630000000000000000000000000000000000000000000000000000000081529192915f908190819073ffffffffffffffffffffffffffffffffffffffff86169063570c7a63906136f2908790600401614f8e565b5f60405180830381865afa15801561370c573d5f803e3d5ffd5b505050506040513d5f823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682016040526137519190810190615128565b925092509250821561382d57815160041461379a57816040517fbe2d187d0000000000000000000000000000000000000000000000000000000081526004016106119190614f8e565b60208201517fffffffff00000000000000000000000000000000000000000000000000000000167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff88161789525f5b81518110156138225761381a828281518110613803576138036151d5565b60200260200101518c6144cd90919063ffffffff16565b6001016137e5565b505050505050613837565b505050505061363a565b505b5081517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0160f882901c016138b357606061ffff8260e01c1690505f6003820152600581019050806040517faedfba2f0000000000000000000000000000000000000000000000000000000081526004016106119190614f8e565b506004820191506135ff565b6101608101516040805161ffff8316808252602080820283019081019093529092909160109190911c90835b8082111561392b5760208301518252915161ffff16917fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0909101906138eb565b50505050919050565b5f808080613943866002615012565b9050806c7e0000007e03ff0000000000005b86821081600184515f1a1b161515161561397457600182019150613955565b5090979096508695509350505050565b5f82818061399983866520000000000061251d565b925085831415836139b381886703ff00000000000061251d565b94508085036139ed57507f34bd20690000000000000000000000000000000000000000000000000000000094505f9250829150613e1a9050565b5f806139f98a886146b2565b90925090507fffffffff00000000000000000000000000000000000000000000000000000000821615613a37575095505f9350839250613e1a915050565b86519095506540000000000060015f9290921a9190911b161515888710169150508015613cc657506001909301925f84613a7a81896703ff00000000000061251d565b9550808603613ab557507f7bfa48af0000000000000000000000000000000000000000000000000000000095505f9350839250613e1a915050565b855b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81018051908a1160015f9290921a9190911b660100000000000016151516600103613b24577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01613ab7565b818114613b7b575f80613b3784846146b2565b90925090507fffffffff00000000000000000000000000000000000000000000000000000000821615613b77575097505f9550859450613e1a9350505050565b9350505b5f831215613bb657507f7bfa48af0000000000000000000000000000000000000000000000000000000096505f9450849350613e1a92505050565b8315613bc257825f0392505b80820394505f851315613c0257507f013b2aaa0000000000000000000000000000000000000000000000000000000096505f9450849350613e1a92505050565b855f03613c1157829550613cc3565b5f8590036043811115613c5257507f32b8b8be0000000000000000000000000000000000000000000000000000000097505f9550859450613e1a9350505050565b600a0a8681025f88838381613c6957613c69615025565b0514159050601b82900b8214158180613c7f5750805b15613cbb57507f32b8b8be000000000000000000000000000000000000000000000000000000009a505f9850889750613e1a9650505050505050565b505084019650505b50505b84516c2000000020000000000000000060015f9290921a9190911b161515878610168015613e0b5760019095019485613d06818a6520000000000061251d565b965086613d1c818b6703ff00000000000061251d565b9750808803613d5957507f013b2aaa0000000000000000000000000000000000000000000000000000000097505f9550859450613e1a9350505050565b505f80613d66838a6146b2565b90925090507fffffffff00000000000000000000000000000000000000000000000000000000821615613da6575097505f9550859450613e1a9350505050565b9250508482015f83138015613dba57508581125b80613dce57505f83128015613dce57508581135b15613e0757507fd556b1110000000000000000000000000000000000000000000000000000000097505f9550859450613e1a9350505050565b9450505b845f03613e16575f93505b5050505b92959194509250565b7fffffffff00000000000000000000000000000000000000000000000000000000811615611135576102208301515f9083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0017f53c102422473590ce12511beab7637e1c33b596a7d58a80ea98463ad78950000179050815f528060045260245ffd5b5f805f613eb485856147dc565b9150915080610731576040517f22c9f7bb0000000000000000000000000000000000000000000000000000000081526004810186905260248101859052604401610611565b5f80806001850181806f7ffffffffffffffffffffffb0000000081807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8b8b0301602080821015613f475750805b875193505b84600185851a1b1615158184101615613f6a57600183019250613f4c565b505080602003613ff5576102208c01518b037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0017f53c102422473590ce12511beab7637e1c33b596a7d58a80ea98463ad78950000176040517f30515bda00000000000000000000000000000000000000000000000000000000815260040161061191815260200190565b85810180519095505f1a6001811b6404000000001615806140155750858b145b1561409b576102208d015186037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0017f53c102422473590ce12511beab7637e1c33b596a7d58a80ea98463ad78950000176040517f04022fbf00000000000000000000000000000000000000000000000000000000815260040161061191815260200190565b50949b939a505060018a019850919650505050505050565b5f80601f90505f60e09050818451168082175f528060208601600183016020035e50505f519392505050565b5f60608186860361ffff811115614125576040517fb6da789c00000000000000000000000000000000000000000000000000000000815260048101829052602401610611565b604080516041888803848101838101929092017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169093526002828101859052018152935060228401925061417b898484612cda565b6141888783850183612cda565b50505060c08701515b80156142525760a081901c516040517fc6c0cbb60000000000000000000000000000000000000000000000000000000081529091905f90819073ffffffffffffffffffffffffffffffffffffffff84169063c6c0cbb6906141f6908890600401614f8e565b6040805180830381865afa158015614210573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906142349190615202565b91509150811561424a5794506104a39350505050565b505050614191565b61022088015187037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0017f53c102422473590ce12511beab7637e1c33b596a7d58a80ea98463ad7895000017612d56565b5f805f6142b18686866148e2565b91509150806142f6576040517f05e476780000000000000000000000000000000000000000000000000000000081526004810187905260248101869052604401610611565b50949350505050565b5f80825f528360205360215f2090506001815f1a1b915062ffffff8116611c92575060019250929050565b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361435b5750610100919050565b507f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f7f5555555555555555555555555555555555555555555555555555555555555555600183901c16909103600281901c7f3333333333333333333333333333333333333333333333333333333333333333908116911601600481901c01167f01010101010101010101010101010101010101010101010101010101010101010260f81c90565b5f805f805f614412888888610e7b565b9250925092508215614252579093509150611fdd9050565b8051602080830180515f90811a8086016021015160a0939190831a61447c5785518488018051600861ffff909316929092046020038801601e83901a840360010160100290811b909217905260f01092505b50508015612cd3576040517f5b1a42d600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f6144c36101008361522c565b6001901b92915050565b6101608201805160408051808201909152601091821c808252602082018590528351600161ffff909116019282901b9290921790925261450c836144b6565b6101809094018051909417909352505050565b5f61452a83836145e9565b925060ff600884901c8116830190811115614571576040517fe826b5f600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff841660089190911b17905092915050565b5f60ff8316828110156145e2576040517f23b49a2a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050900390565b5f60ff808416830190600885901c811690601086901c90831115614639576040517fe826b5f600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b808311156146445750815b601081901b600883901b841717935050505092915050565b5f6146668361359f565b82106146a25781836040517ffcfaeff1000000000000000000000000000000000000000000000000000000008152600401610611929190615264565b50600202016003015161ffff1690565b81515f90819065200000000000600191831a9190911b161515838510168085019082806146df8488614ae9565b90925090507fffffffff0000000000000000000000000000000000000000000000000000000082161561471a575093505f9250611c92915050565b825f0361477d577f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811161474e575f614770565b7f0fdc2635000000000000000000000000000000000000000000000000000000005b95509350611c9292505050565b7f800000000000000000000000000000000000000000000000000000000000000081116147aa575f6147cc565b7f0fdc2635000000000000000000000000000000000000000000000000000000005b95505f0393505050509250929050565b5f601b83900b8314838382614840577d90e40fbeea1d3a4abc8955e946fe31cdcf66f634e100000000000000000086051561482057620186a0860595506005850194505b8586601b0b1461483b57600a86059550846001019450614820565b614856565b855f0361485657505f925060019150611c929050565b848560030b146148b2575f85121561487657505f9250829150611c929050565b6040517fd556b1110000000000000000000000000000000000000000000000000000000081526004810183905260248101829052604401610611565b50507bffffffffffffffffffffffffffffffffffffffffffffffffffffffff841660e084901b1791509250929050565b5f805f851215614928576040517f4a7d166b0000000000000000000000000000000000000000000000000000000081526004810186905260248101859052604401610611565b845f0361493a57505f90506001611fdd565b8460ff8416850185811215614985576040517fd556b1110000000000000000000000000000000000000000000000000000000081526004810188905260248101879052604401610611565b5f805f8312156149ef577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb38312156149c6575f809550955050505050611fdd565b825f03600a0a91508184816149dd576149dd615025565b0495505084029091149150611fdd9050565b5f831315614ad957604d831315614a45576040517fc849483b000000000000000000000000000000000000000000000000000000008152600481018a90526024810189905260ff88166044820152606401610611565b82600a0a9150817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81614a7a57614a7a615025565b04841115614ac7576040517fc849483b000000000000000000000000000000000000000000000000000000008152600481018a90526024810189905260ff88166044820152606401610611565b5091909102925060019150611fdd9050565b8360019550955050505050611fdd565b5f80828410614b1c57507f34bd20690000000000000000000000000000000000000000000000000000000090505f611c92565b835f03614b55576040517fda6966d400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60305f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8501815b878210158015614b8d5750604d83105b15614bd057815160018401937fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90930192600a0a5f9190911a8590030201614b7d565b878210614cf65781515f1a8490036001811115614c1857507f0fdc26350000000000000000000000000000000000000000000000000000000095505f9450611c929350505050565b600a84900a8102828101831115614c5b57507f0fdc26350000000000000000000000000000000000000000000000000000000096505f9550611c92945050505050565b9190910190507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff909101905b878210614cf65781515f1a60308114614ccb57507f0fdc26350000000000000000000000000000000000000000000000000000000095505f9450611c929350505050565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90910190614c87565b5f9890975095505050505050565b614d0c61527c565b565b5f60208284031215614d1e575f80fd5b81357fffffffff0000000000000000000000000000000000000000000000000000000081168114610507575f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715614dc157614dc1614d4d565b604052919050565b5f67ffffffffffffffff821115614de257614de2614d4d565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b5f60208284031215614e1e575f80fd5b813567ffffffffffffffff811115614e34575f80fd5b8201601f81018413614e44575f80fd5b8035614e57614e5282614dc9565b614d7a565b818152856020838501011115614e6b575f80fd5b816020840160208301375f91810160200191909152949350505050565b602080825282518282018290528051604084018190525f9291820190839060608601905b80831015614ee257835173ffffffffffffffffffffffffffffffffffffffff168252928401926001929092019190840190614eac565b509695505050505050565b5f81518084528060208401602086015e5f6020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b604081525f614f4b6040830185614eed565b8281036020848101919091528451808352858201928201905f5b81811015614f8157845183529383019391830191600101614f65565b5090979650505050505050565b602081525f6105076020830184614eed565b80516020808301519190811015614fdf577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8160200360031b1b821691505b50919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b8082018082111561018057610180614fe5565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361508257615082614fe5565b5060010190565b8181038181111561018057610180614fe5565b80518015158114610239575f80fd5b5f82601f8301126150ba575f80fd5b8151602067ffffffffffffffff8211156150d6576150d6614d4d565b8160051b6150e5828201614d7a565b92835284810182019282810190878511156150fe575f80fd5b83870192505b8483101561511d57825182529183019190830190615104565b979650505050505050565b5f805f6060848603121561513a575f80fd5b6151438461509c565b9250602084015167ffffffffffffffff8082111561515f575f80fd5b818601915086601f830112615172575f80fd5b8151615180614e5282614dc9565b818152886020838601011115615194575f80fd5b8160208501602083015e5f60208383010152809550505060408601519150808211156151be575f80fd5b506151cb868287016150ab565b9150509250925092565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f8060408385031215615213575f80fd5b61521c8361509c565b9150602083015190509250929050565b5f8261525f577f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b500690565b828152604060208201525f610c456040830184614eed565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52605160045260245ffdfe0288400100420b0280046b0641220186adb8a044003012020f2a880521281ac8811a000000000000000000080000000000100000000000000002000000000000000000290ea98a3a10f9c53927bda61c6395ad0e9fb4a8075dbeaf2d313e9e09b06d681dfe49062ce21ac13e83a6cc2ad2d2123422c3e0052f369e1f27267220a0a68d2f357696465d217b131120880f24f4a8242f1af53f41f7290afa3e8638acf3d13397e9fd00443a453b406bb547b9059d25a3cd1e11d0c3260b15eb4d16fc94274427bc412baf2cc2321b8f630dca9efe403ce35f1400684845c291e3425d68b13d5f9a151eb98c15239cd9c10c1f698235c8d3843c08d579273459d41a2c9ff617a5b2cd15c0031810f621af127ba34c26bb6c4137b2ad3d1b73563d0210215f36aa563921098e690457fb180376e752066a470128f11de101fcc60522de7ddd183d3d6d4196c37031cba2872e7b3af5304eee7219a8093543082b5f0801f5a522fb22fb22fb23c724db24db23c723c724db22fb22fb22fb24db24db24db24db24db24db24db24db24db24db24db24db24db24db24db24db24db24db24db24db24db24db24db24db24db24db24db24db24db24db24db24db24db24db24db24db24db24db24db24db24db24db24db24db24db24db24db24db24db24db24db24db24db24db24db24db24db24db24db24db" + "object": "0x6080604052348015600e575f80fd5b506154ab8061001c5f395ff3fe608060405234801561000f575f80fd5b5060043610610064575f3560e01c80637764fd9c1161004d5780637764fd9c146100b0578063ccf44775146100d1578063d6d8c9a8146100e6575f80fd5b806301ffc9a7146100685780635514ca2014610090575b5f80fd5b61007b610076366004614d16565b6100ee565b60405190151581526020015b60405180910390f35b6100a361009e366004614e16565b610186565b6040516100879190614e90565b6100c36100be366004614e16565b61023e565b604051610087929190614f41565b6100d961025e565b6040516100879190614f96565b6100d961026d565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082167f1a2c8edd00000000000000000000000000000000000000000000000000000000148061018057507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b92915050565b6040805160208101909152606081525f6101e3836101a2610277565b6101aa61029a565b60408051808201909152600881527f1ca11fed202d208a00000000000000000000000000000000000000000000000060208201526102ba565b90505f6020840190505f6101fa8580510160200190565b90506102078383836104ac565b915061021483838361050e565b9150604051806020016040528061022a856106db565b90529350505050610239610739565b919050565b606080610255610250846101a2610277565b61077e565b91509150915091565b60606102686108fb565b905090565b6060610268610948565b6060604051806101a0016040528061016781526020016152b26101679139905090565b60606040518060c001604052806092815260200161541960929139905090565b6103476040518061026001604052805f81526020015f81526020015f81526020015f81526020015f81526020015f81526020015f80191681526020015f81526020015f81526020015f81526020015f81526020015f81526020015f80191681526020016060815260200160608152602001606081526020015f815260200160608152602001606081525090565b5f6040518061026001604052805f81526020015f81526020015f81526020015f81526020015f81526020015f81526020015f801b81526020015f8152602001600481526020015f81526020015f81526020015f81526020015f801b8152602001848152602001858152602001600467ffffffffffffffff8111156103cd576103cd614d55565b6040519080825280602002602001820160405280156103f6578160200160208202803683370190505b5081525f602080830182905260408084018b905260609384018a90528051601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016828152808301825283517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00001681178452855290840182905283018190529082018190526080820181905260a082018190526101208201819052610140820181905261020082015290505b95945050505050565b5f5b8183101561050457825160015f9190911a1b6401000026008116156104df576104d8858585610c11565b93506104fe565b658000000000008116156104f8576104d8858585610c55565b50610504565b506104ae565b50815b9392505050565b815160408051808201909152601081527f7573696e672d776f7264732d66726f6d0000000000000000000000000000000060208201525f919061055090614fa8565b7fffffffffffffffffffffffffffffffff000000000000000000000000000000008216146105815783915050610507565b5060108301925081831061061a5761022084015183037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0017f53c102422473590ce12511beab7637e1c33b596a7d58a80ea98463ad78950000175b6040517fe3e4992d00000000000000000000000000000000000000000000000000000000815260040161061191815260200190565b60405180910390fd5b825160015f91821a1b90640100002600821690036106835761022085015184037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0017f53c102422473590ce12511beab7637e1c33b596a7d58a80ea98463ad78950000176105dc565b836001019350505b818310156105045761069e8484846104ac565b925081831015610504575f806106b5868686610e83565b9096509092509050816106c9575050610504565b6106d4868683611035565b505061068b565b60c08101516040516060919073ffffffffffffffffffffffffffffffffffffffff602082015f5b841561072357848316825260a09490941c5193602090910190600101610702565b8352604052610731826110f4565b509392505050565b60405162010000811061077b576040517f766c065f00000000000000000000000000000000000000000000000000000000815260048101829052602401610611565b50565b6060805f8361022001515111156108d0575f61079f84610220015160200190565b90505f6107b485610220015180510160200190565b90506107c18583836104ac565b91506107ce85838361050e565b91505b80821015610805576107e48583836104ac565b91506107f1858383611142565b91506107fe858383611545565b91506107d1565b80821461083e576040517f7d565df600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610100850151600816156108cd5761022085015182037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0017f53c102422473590ce12511beab7637e1c33b596a7d58a80ea98463ad78950000176040517ff06f54cf00000000000000000000000000000000000000000000000000000000815260040161061191815260200190565b50505b5f806108e56108de86611b04565b8690611c39565b915091506108f1610739565b9094909350915050565b6040805160a0810182526004808252611ca16020830152611fed9282019290925261202d60608281019190915261208a608083015291908190805b61093f81612273565b94505050505090565b6060614d0c5f604990508091505f6040518061094001604052808467ffffffffffffffff1667ffffffffffffffff1681526020016123038152602001612303815260200161230381526020016123cf81526020016124e381526020016124e381526020016123cf81526020016123cf81526020016124e381526020016123038152602001612303815260200161230381526020016124e381526020016124e381526020016124e381526020016124e381526020016124e381526020016124e381526020016124e381526020016124e381526020016124e381526020016124e381526020016124e381526020016124e381526020016124e381526020016124e381526020016124e381526020016124e381526020016124e381526020016124e381526020016124e381526020016124e381526020016124e381526020016124e381526020016124e381526020016124e381526020016124e381526020016124e381526020016124e381526020016124e381526020016124e381526020016124e381526020016124e381526020016124e381526020016124e381526020016124e381526020016124e381526020016124e381526020016124e381526020016124e381526020016124e381526020016124e381526020016124e381526020016124e381526020016124e381526020016124e381526020016124e381526020016124e381526020016124e381526020016124e381526020016124e381526020016124e381526020016124e381526020016124e381526020016124e381526020016124e381526020016124e381526020016124e381526020016124e381526020016124e381526020016124e381526020016124e381526020016124e38152509050606081905060498151146109365780516040517fc8b56901000000000000000000000000000000000000000000000000000000008152600481019190915260248101849052604401610611565b610100830180517ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1690525f610c4d8383640100002600612525565b949350505050565b6101008301805160011790525f60048301821015610cef5761022084015183037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0017f53c102422473590ce12511beab7637e1c33b596a7d58a80ea98463ad78950000175b6040517f25a7646800000000000000000000000000000000000000000000000000000000815260040161061191815260200190565b825160f01c612f2a8114610d7e5761022085015184037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0017f53c102422473590ce12511beab7637e1c33b596a7d58a80ea98463ad78950000176040517f3e47169c00000000000000000000000000000000000000000000000000000000815260040161061191815260200190565b6003840193505f5b83851015610e235784515f1a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd18101610e17577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff86015160f01c7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd5d18101610e1557505050600193840193610e23565b505b85600101955050610d86565b80610e795761022086015185037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0017f53c102422473590ce12511beab7637e1c33b596a7d58a80ea98463ad7895000017610cba565b5092949350505050565b81515f90819081908190600181831a1b6703ff200000000000811615610faa5786610eaf89600161501a565b1015610fa157600182811a1b7ffffffffffffffffffffffffffffffffffeffffffffffffffffff00000000000082821701610eec575f9350610f9b565b7ffffffffffffffffffffffffffffffffffffffffffeffffffffff00000000000082821701610f96576102208a015189037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0017f53c102422473590ce12511beab7637e1c33b596a7d58a80ea98463ad78950000176040517f75c28ff900000000000000000000000000000000000000000000000000000000815260040161061191815260200190565b600193505b50610fef565b60019250610fef565b640400000000811615610fc05760029250610fef565b6b080000000000000000000000811615610fdd5760039250610fef565b505f945086935084925061102c915050565b505f905061101d88888861101583876101a09190910151600291820201015161ffff1690565b63ffffffff16565b90975060019550879450925050505b93509350939050565b73ffffffffffffffffffffffffffffffffffffffff8111156110d25761022083015182037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0017f53c102422473590ce12511beab7637e1c33b596a7d58a80ea98463ad78950000176040517f9d7e517e00000000000000000000000000000000000000000000000000000000815260040161061191815260200190565b60c09092018051604080516020810190915290815260a01b9290921790915250565b60208101602082510282015b8082101561113d5781518151835281526020909101907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001611100565b505050565b5f5b818310156105045782515f90600190821a1b6f07fffffe8000000000000000000000008116156113bf57610100860151600116156111fe5761022086015185037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0017f53c102422473590ce12511beab7637e1c33b596a7d58a80ea98463ad78950000175b6040517f5520a51700000000000000000000000000000000000000000000000000000000815260040161061191815260200190565b6f07fffffe0000000000000000000000008116156112d15761123185856f07fffffe0000000003ff20000000000061254e565b90955091505f611241878461261d565b50905080156112cb5761022087015186037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0017f53c102422473590ce12511beab7637e1c33b596a7d58a80ea98463ad78950000176040517f53e6feba00000000000000000000000000000000000000000000000000000000815260040161061191815260200190565b506112f2565b6112ef60018601856f07fffffe0000000003ff200000000000612525565b94505b856040015160ff1660ff148061130f57508560a0015160ff1660ff145b156113955761022086015185037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0017f53c102422473590ce12511beab7637e1c33b596a7d58a80ea98463ad78950000176040517f3820634100000000000000000000000000000000000000000000000000000000815260040161061191815260200190565b604086018051600190810190915260a087018051909101905261010086018051600917905261153e565b640100002600811615611411576113df6001860185640100002600612525565b610100870180517ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe169052945061153e565b67040000000000000081161561145d575050610100840180516008177ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe16905260019290920191610504565b658000000000008116156114ed5761022086015185037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0017f53c102422473590ce12511beab7637e1c33b596a7d58a80ea98463ad78950000175b6040517fedad0c5800000000000000000000000000000000000000000000000000000000815260040161061191815260200190565b61022086015185037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0017f53c102422473590ce12511beab7637e1c33b596a7d58a80ea98463ad78950000176111c9565b5050611144565b5f5b818310156105045782515f90600190821a1b6f07fffffe00000000000000000000000081161561176557610100860151600116156116015761022086015185037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0017f53c102422473590ce12511beab7637e1c33b596a7d58a80ea98463ad78950000175b6040517f4e803df600000000000000000000000000000000000000000000000000000000815260040161061191815260200190565b8461161d81866f07fffffe0000000003ff20000000000061254e565b80945081975050505f8061163689610240015186612698565b9150915081156116775761164b89898961276c565b97505f6116588a836129f7565b90506116658a8383612a1d565b50610100890180516002179052611751565b6116818986612c02565b909250905081156116a557611697895f83612a1d565b6116a089612c7c565b611751565b5f6060848a03600581016116ba8d8d8d61276c565b9b508c6101e0015151602002602001810190505f60059050604051935060208201840160405282818501528184528394506117028860056116fb8760200190565b0185612ce2565b5050506101e08b01518051600101906117359061172f836117268680510160200190565b90602002900390565b83612ceb565b506117428b60ff84612a1d565b50506101008901805160021790525b505050610100860180516001179052611afd565b61010086015160021615611887576501000000000081165f036118035761022086015185037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0017f53c102422473590ce12511beab7637e1c33b596a7d58a80ea98463ad78950000176040517f23b5c6ea00000000000000000000000000000000000000000000000000000000815260040161061191815260200190565b606086810180515f1a6003019190829053603b82111561184f576040517f6232f2d900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050610100860180517ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc169052600190940193611afd565b65020000000000811615611963576060868101515f90811a91908290036119295761022088015187037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0017f53c102422473590ce12511beab7637e1c33b596a7d58a80ea98463ad78950000176040517f7f9db54200000000000000000000000000000000000000000000000000000000815260040161061191815260200190565b808801600383039250828153826004820101515f1a8360028301015160f01c600101535061195688612c7c565b5050600190940193611afd565b6401000026008116156119b5576119836001860185640100002600612525565b610100870180517ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1690529450611afd565b6b0800000003ff2004000000008116156119f0576119d4868686612cf7565b94506119df86612c7c565b610100860180516001179052611afd565b65100000000000811615611a1557611a088686612e21565b5050600190920191610504565b670800000000000000811615611a4d57611a2f8686612e21565b611a3886613279565b50506004610100850152600190920191610504565b65800000000000811615611aac5761022086015185037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0017f53c102422473590ce12511beab7637e1c33b596a7d58a80ea98463ad78950000176114b8565b61022086015185037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0017f53c102422473590ce12511beab7637e1c33b596a7d58a80ea98463ad78950000176115cc565b5050611547565b60e08101518151516060919060f082901c9060208114611b50576040517f858f2dcf00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604051935060208401601083045f8183535060016008850483018101928391015f80805b88811015611bad5789811c61ffff81165163ffff0000601092831b16811760e01b8786015284019360f08390031b929092179101611b74565b50825117909152878203017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08181018952908801601f01166040525f5b82811015611c2d576002810288016003015161ffff90811683018051602060f082901c019260e09190911c1690611c22838284612ce2565b505050600101611bea565b50505050505050919050565b6060805f611c46846135a7565b90505f5b81811015611c89575f611c5d86836135c1565b60040190505f611c6d87846135f0565b60040282019050611c7f888383613607565b5050600101611c4a565b5083611c94866138c7565b92509250505b9250929050565b5f80808080611cb188888861393c565b985090925090508181036040811115611d455761022089015183037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0017f53c102422473590ce12511beab7637e1c33b596a7d58a80ea98463ad78950000176040517fff2f594900000000000000000000000000000000000000000000000000000000815260040161061191815260200190565b805f03611dcd5761022089015183037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0017f53c102422473590ce12511beab7637e1c33b596a7d58a80ea98463ad78950000176040517fc75cd50900000000000000000000000000000000000000000000000000000000815260040161061191815260200190565b60028106600103611e595761022089015183037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0017f53c102422473590ce12511beab7637e1c33b596a7d58a80ea98463ad78950000176040517fd76d9b5700000000000000000000000000000000000000000000000000000000815260040161061191815260200190565b6001820397505f5b838910611fdc5788515f90811a906001821b906703ff000000000000821615611ead57507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd08201611fa6565b6c7e000000000000000000000000821615611eeb57507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa98201611fa6565b687e0000000000000000821615611f2557507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc98201611fa6565b6102208d01518c037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0017f53c102422473590ce12511beab7637e1c33b596a7d58a80ea98463ad78950000176040517f69f1e3e600000000000000000000000000000000000000000000000000000000815260040161061191815260200190565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff909b019a831b96909617955050600401611e61565b50509350909150505b935093915050565b5f805f805f80611ffd888861398c565b92965090945092509050612012898486613e2b565b8261201d8383613eaf565b9550955050505050935093915050565b5f80808061203c878787613f01565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08301805184840382529199509294509092505f9161207a816140bb565b9190529698969750505050505050565b6001909101905f80836120ae81856fffffffffdffffffffffffffeffffd9ff612525565b9450848181036121395761022087015186037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0017f53c102422473590ce12511beab7637e1c33b596a7d58a80ea98463ad78950000176040517ff73a1aa800000000000000000000000000000000000000000000000000000000815260040161061191815260200190565b612144878787610c11565b95508561216281876fffffffffdfffffffffffffffffffffff612525565b9650868681106121ee5761022089015188037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0017f53c102422473590ce12511beab7637e1c33b596a7d58a80ea98463ad78950000175b6040517fc4b1913500000000000000000000000000000000000000000000000000000000815260040161061191815260200190565b875160015f91821a1b906b2000000000000000000000008216900361225e576102208a015189037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0017f53c102422473590ce12511beab7637e1c33b596a7d58a80ea98463ad78950000176121b9565b506001909701968761201d8a868686866140e7565b60605f825160020267ffffffffffffffff81111561229357612293614d55565b6040519080825280601f01601f1916602001820160405280156122bd576020820181803683370190505b50905061ffff80196020850160208651028101600285015b818310156122f7578051835186169085161781526020909201916002016122d5565b50939695505050505050565b5f815160010361238e575060208101517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8116601b0b60e082901d5f6123468383836142ab565b905061ffff811115612384576040517f7938075c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b9250610239915050565b81515f0361239d57505f919050565b6040517f1ac6690800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f81516002036124a757602082015160408301517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8216601b0b60e083901d5f6124168383836142ab565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8516601b0b935060e085901d925090505f61244f8484836142ab565b905060ff821180612460575060ff81115b15612497576040517f7938075c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60081b1794506102399350505050565b60028251101561239d576040517ff16066b000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f81515f1461251e576040517f9f16b02000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505f919050565b5f5b5f82600186515f1a1b1611838510161561254657600184019350612527565b509192915050565b5f8080600181878703602081116125655780612568565b60205b915050875192505b8519600184841a1b1615818310161561258e57600182019150612570565b9681019660208290036008810293841c90931b9261261057604080516020810185905201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152908290527fe47fe8b700000000000000000000000000000000000000000000000000000000825261061191600401614f96565b5095969095509350505050565b5f806126298484612c02565b909250905081611c9a5750610120830180515f93845260209384902060408051928352948201855293909401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000909316601084901b62ff00001617909317909252909160ff90911660010190565b600182810180515f928392600560ff93909316602102870192830192909101835b8183101561275d5760018301516021909301805190935f90819060ff1681806126e2838e614307565b915091508186165f03612704575f809b509b5050505050505050505050611c9a565b5f87612714600185038916614332565b016004028b015195505062ffffff90811693508416830391506127489050575060019750601c1a9550611c9a945050505050565b61275183614332565b840193505050506126b9565b505f9788975095505050505050565b81516101e08401515f80825291600190831a1b907ffffffffffffffffffffffffffffffffffffffffffffffffff0000000000000008201610e79576127b08561505a565b610100870180517ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe169052805190955060015f91821a1b9250805b8587101561299557865160015f9190911a1b935064010000260084161561281e57612817888888610c11565b96506127eb565b674000000000000000841615612842576128378761505a565b965060019050612995565b6001886101000151165f0361291357600482036128da5761022088015187037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0017f53c102422473590ce12511beab7637e1c33b596a7d58a80ea98463ad78950000176040517f8c9fdbb300000000000000000000000000000000000000000000000000000000815260040161061191815260200190565b5f6128e689898961440a565b60208581028701018190526101008b0180516001179052909850905061290b8361505a565b9250506127eb565b61022088015187037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0017f53c102422473590ce12511beab7637e1c33b596a7d58a80ea98463ad78950000175b6040517f722cd24a00000000000000000000000000000000000000000000000000000000815260040161061191815260200190565b806129eb5761022088015187037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0017f53c102422473590ce12511beab7637e1c33b596a7d58a80ea98463ad7895000017612960565b50905250919392505050565b6101c08201516002828102820101516101e08401515f9261ffff90921691906104a39083565b612a2683614432565b610100830180517ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb1660081790526020808401515f90811a8501602101805190911a60ff811492919060018101825350508115612aaf576040517f8092d1ea00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050825180516060808601515f90811a87016061018051939461ffff8616949093921a60ff81149291600886048503601c0191600181018253505f60038201537fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe30180517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00001690911790528115612b72576040517f3abd0c5e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050602090920183821b176018820185901b178083529160e0829003612bfa5760408051601083901b6020908117601f9092017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016918252810190915281517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000168117825286525b505050505050565b6101208201516101408301515f8381526020808220919384939290911c91600160ff84161b80821615612c675761ffff83165b8015612c65578360201c8503612c58576001965061ffff8460101c169550612c65565b51925061ffff8316612c35565b505b17610140909601959095525090939092509050565b6060818101515f90811a919082900361113d57602083810180515f1a600101919082815350603e8210612cdb576040517fe826b5f600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050505050565b8083835e505050565b6020810283835e505050565b5f8080612d05868686610e83565b9096509250905080612d935761022086015185037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0017f53c102422473590ce12511beab7637e1c33b596a7d58a80ea98463ad78950000175b6040517fb0e4e5b300000000000000000000000000000000000000000000000000000000815260040161061191815260200190565b5f80612d9e846144be565b6101808901511615612ddf5761016088015160101c5b8015801590612dc1575082155b15612ddd57602081015190519085149250600190910190612db4565b505b61016088015161ffff16612e05600184612df95782612dfd565b8383035b8b9190612a1d565b5081612e1557612e1588856144d5565b50949695505050505050565b6060828101515f1a908115612eb15761022084015183037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0017f53c102422473590ce12511beab7637e1c33b596a7d58a80ea98463ad78950000176040517f6fb11cdc00000000000000000000000000000000000000000000000000000000815260040161061191815260200190565b5050612ebc82614432565b61010082018051600416600890811790915260a0830151602084015160ff8083169360f89290921c9290911c1681035f819003612fe6576004856101000151165f03612f835761022085015184037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0017f53c102422473590ce12511beab7637e1c33b596a7d58a80ea98463ad78950000176040517fab1d3ea700000000000000000000000000000000000000000000000000000000815260040161061191815260200190565b90820190603e8210612fc1576040517fe826b5f600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60f882901b6020860152610200850151612fdb9084614527565b610200860152613101565b600181111561310157808310156130785761022085015184037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0017f53c102422473590ce12511beab7637e1c33b596a7d58a80ea98463ad78950000176040517f78ef278200000000000000000000000000000000000000000000000000000000815260040161061191815260200190565b808311156131015761022085015184037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0017f53c102422473590ce12511beab7637e1c33b596a7d58a80ea98463ad78950000176040517f43168e6800000000000000000000000000000000000000000000000000000000815260040161061191815260200190565b8082036001016020601083028101905b818110156132655760a08801516020848a0181015191831c61ffff16915f1a9060015b8281116132535760208406601c0361314d57925160f01c925b83516102008d015160019190911a9061316690826145ab565b6102008e01525f828514801561317c5750896001145b613187576001613189565b8b5b6102008f015190915061319c90826145f1565b6102008f0152600f8111806131b15750600f82115b15613237576102208e01518d037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0017f53c102422473590ce12511beab7637e1c33b596a7d58a80ea98463ad78950000176040517f7ea1869f00000000000000000000000000000000000000000000000000000000815260040161061191815260200190565b818160041b176001870153505060049390930192600101613134565b50506001909401935050601001613111565b5050505060081b60a0909301929092525050565b60e081015160208083015160f083811c925f9290921a60010191908390036132cd576040517fa806284100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610200850151855180515f928392909160219060101c61ffff165b80156132ff57805190925060101c61ffff166132e8565b506040518a82018051919650601c8401939160049160248901915f90811a805b8d8310156133e45760048202860195506004878a03045b8082111561335457965161ffff16601c810199509690036007613336565b506004810298899003805186529894909401938103865b60078211156133b0575160101c61ffff1680518652601c909501947ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff99091019061336b565b81156133cb575160101c61ffff168051865260048202909501945b50505060019182018051909291909101905f1a8061331f565b50505082895250600488810180517fffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9290940491909101601881901b8817939093179052601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660405260ff1094505083156134b0576040517fe972437e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6134bd6001808a1b615091565b891685891b60f06134cf8b601061501a565b901b171760e08b01526101008a0180517ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7169052604080516020601f9091017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01681815280820183525f80517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00001682178152908d52908c01819052908b0181905260608b0181905260808b0181905260a08b018190526101208b018190526101408b018190526102008b015250505050505050505050565b5f81515f036135b757505f919050565b50602001515f1a90565b5f806135cc846135a7565b60020260010190505f6135df8585614664565b949091019093016020019392505050565b5f806135fc84846135c1565b515f1a949350505050565b8082101561113d5781517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0160f882901c016138415760c08401515b801561383f5760a081901c5161016086015161ffff60e085901c1660208101805160089390931b62ffff0016600187901a1760e81b7cffffffffffffffffffffffffffffffffffffffffffffffffffffffffff909316929092179091526040517f570c7a630000000000000000000000000000000000000000000000000000000081529192915f908190819073ffffffffffffffffffffffffffffffffffffffff86169063570c7a63906136fa908790600401614f96565b5f60405180830381865afa158015613714573d5f803e3d5ffd5b505050506040513d5f823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682016040526137599190810190615130565b92509250925082156138355781516004146137a257816040517fbe2d187d0000000000000000000000000000000000000000000000000000000081526004016106119190614f96565b60208201517fffffffff00000000000000000000000000000000000000000000000000000000167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff88161789525f5b815181101561382a5761382282828151811061380b5761380b6151dd565b60200260200101518c6144d590919063ffffffff16565b6001016137ed565b50505050505061383f565b5050505050613642565b505b5081517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0160f882901c016138bb57606061ffff8260e01c1690505f6003820152600581019050806040517faedfba2f0000000000000000000000000000000000000000000000000000000081526004016106119190614f96565b50600482019150613607565b6101608101516040805161ffff8316808252602080820283019081019093529092909160109190911c90835b808211156139335760208301518252915161ffff16917fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0909101906138f3565b50505050919050565b5f80808061394b86600261501a565b9050806c7e0000007e03ff0000000000005b86821081600184515f1a1b161515161561397c5760018201915061395d565b5090979096508695509350505050565b5f8281806139a1838665200000000000612525565b925085831415836139bb81886703ff000000000000612525565b94508085036139f557507f34bd20690000000000000000000000000000000000000000000000000000000094505f9250829150613e229050565b5f80613a018a886146ba565b90925090507fffffffff00000000000000000000000000000000000000000000000000000000821615613a3f575095505f9350839250613e22915050565b86519095506540000000000060015f9290921a9190911b161515888710169150508015613cce57506001909301925f84613a8281896703ff000000000000612525565b9550808603613abd57507f7bfa48af0000000000000000000000000000000000000000000000000000000095505f9350839250613e22915050565b855b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81018051908a1160015f9290921a9190911b660100000000000016151516600103613b2c577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01613abf565b818114613b83575f80613b3f84846146ba565b90925090507fffffffff00000000000000000000000000000000000000000000000000000000821615613b7f575097505f9550859450613e229350505050565b9350505b5f831215613bbe57507f7bfa48af0000000000000000000000000000000000000000000000000000000096505f9450849350613e2292505050565b8315613bca57825f0392505b80820394505f851315613c0a57507f013b2aaa0000000000000000000000000000000000000000000000000000000096505f9450849350613e2292505050565b855f03613c1957829550613ccb565b5f8590036043811115613c5a57507f32b8b8be0000000000000000000000000000000000000000000000000000000097505f9550859450613e229350505050565b600a0a8681025f88838381613c7157613c7161502d565b0514159050601b82900b8214158180613c875750805b15613cc357507f32b8b8be000000000000000000000000000000000000000000000000000000009a505f9850889750613e229650505050505050565b505084019650505b50505b84516c2000000020000000000000000060015f9290921a9190911b161515878610168015613e135760019095019485613d0e818a65200000000000612525565b965086613d24818b6703ff000000000000612525565b9750808803613d6157507f013b2aaa0000000000000000000000000000000000000000000000000000000097505f9550859450613e229350505050565b505f80613d6e838a6146ba565b90925090507fffffffff00000000000000000000000000000000000000000000000000000000821615613dae575097505f9550859450613e229350505050565b9250508482015f83138015613dc257508581125b80613dd657505f83128015613dd657508581135b15613e0f57507fd556b1110000000000000000000000000000000000000000000000000000000097505f9550859450613e229350505050565b9450505b845f03613e1e575f93505b5050505b92959194509250565b7fffffffff0000000000000000000000000000000000000000000000000000000081161561113d576102208301515f9083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0017f53c102422473590ce12511beab7637e1c33b596a7d58a80ea98463ad78950000179050815f528060045260245ffd5b5f805f613ebc85856147e4565b9150915080610731576040517f22c9f7bb0000000000000000000000000000000000000000000000000000000081526004810186905260248101859052604401610611565b5f80806001850181806f7ffffffffffffffffffffffb0000000081807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8b8b0301602080821015613f4f5750805b875193505b84600185851a1b1615158184101615613f7257600183019250613f54565b505080602003613ffd576102208c01518b037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0017f53c102422473590ce12511beab7637e1c33b596a7d58a80ea98463ad78950000176040517f30515bda00000000000000000000000000000000000000000000000000000000815260040161061191815260200190565b85810180519095505f1a6001811b64040000000016158061401d5750858b145b156140a3576102208d015186037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0017f53c102422473590ce12511beab7637e1c33b596a7d58a80ea98463ad78950000176040517f04022fbf00000000000000000000000000000000000000000000000000000000815260040161061191815260200190565b50949b939a505060018a019850919650505050505050565b5f80601f90505f60e09050818451168082175f528060208601600183016020035e50505f519392505050565b5f60608186860361ffff81111561412d576040517fb6da789c00000000000000000000000000000000000000000000000000000000815260048101829052602401610611565b604080516041888803848101838101929092017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01690935260028281018590520181529350602284019250614183898484612ce2565b6141908783850183612ce2565b50505060c08701515b801561425a5760a081901c516040517fc6c0cbb60000000000000000000000000000000000000000000000000000000081529091905f90819073ffffffffffffffffffffffffffffffffffffffff84169063c6c0cbb6906141fe908890600401614f96565b6040805180830381865afa158015614218573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061423c919061520a565b9150915081156142525794506104a39350505050565b505050614199565b61022088015187037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0017f53c102422473590ce12511beab7637e1c33b596a7d58a80ea98463ad7895000017612d5e565b5f805f6142b98686866148ea565b91509150806142fe576040517f05e476780000000000000000000000000000000000000000000000000000000081526004810187905260248101869052604401610611565b50949350505050565b5f80825f528360205360215f2090506001815f1a1b915062ffffff8116611c9a575060019250929050565b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036143635750610100919050565b507f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f7f5555555555555555555555555555555555555555555555555555555555555555600183901c16909103600281901c7f3333333333333333333333333333333333333333333333333333333333333333908116911601600481901c01167f01010101010101010101010101010101010101010101010101010101010101010260f81c90565b5f805f805f61441a888888610e83565b925092509250821561425a579093509150611fe59050565b8051602080830180515f90811a8086016021015160a0939190831a6144845785518488018051600861ffff909316929092046020038801601e83901a840360010160100290811b909217905260f01092505b50508015612cdb576040517f5b1a42d600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f6144cb61010083615234565b6001901b92915050565b6101608201805160408051808201909152601091821c808252602082018590528351600161ffff909116019282901b92909217909252614514836144be565b6101809094018051909417909352505050565b5f61453283836145f1565b925060ff600884901c8116830190811115614579576040517fe826b5f600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff841660089190911b17905092915050565b5f60ff8316828110156145ea576040517f23b49a2a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050900390565b5f60ff808416830190600885901c811690601086901c90831115614641576040517fe826b5f600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8083111561464c5750815b601081901b600883901b841717935050505092915050565b5f61466e836135a7565b82106146aa5781836040517ffcfaeff100000000000000000000000000000000000000000000000000000000815260040161061192919061526c565b50600202016003015161ffff1690565b81515f90819065200000000000600191831a9190911b161515838510168085019082806146e78488614af1565b90925090507fffffffff00000000000000000000000000000000000000000000000000000000821615614722575093505f9250611c9a915050565b825f03614785577f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8111614756575f614778565b7f0fdc2635000000000000000000000000000000000000000000000000000000005b95509350611c9a92505050565b7f800000000000000000000000000000000000000000000000000000000000000081116147b2575f6147d4565b7f0fdc2635000000000000000000000000000000000000000000000000000000005b95505f0393505050509250929050565b5f601b83900b8314838382614848577d90e40fbeea1d3a4abc8955e946fe31cdcf66f634e100000000000000000086051561482857620186a0860595506005850194505b8586601b0b1461484357600a86059550846001019450614828565b61485e565b855f0361485e57505f925060019150611c9a9050565b848560030b146148ba575f85121561487e57505f9250829150611c9a9050565b6040517fd556b1110000000000000000000000000000000000000000000000000000000081526004810183905260248101829052604401610611565b50507bffffffffffffffffffffffffffffffffffffffffffffffffffffffff841660e084901b1791509250929050565b5f805f851215614930576040517f4a7d166b0000000000000000000000000000000000000000000000000000000081526004810186905260248101859052604401610611565b845f0361494257505f90506001611fe5565b8460ff841685018581121561498d576040517fd556b1110000000000000000000000000000000000000000000000000000000081526004810188905260248101879052604401610611565b5f805f8312156149f7577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb38312156149ce575f809550955050505050611fe5565b825f03600a0a91508184816149e5576149e561502d565b0495505084029091149150611fe59050565b5f831315614ae157604d831315614a4d576040517fc849483b000000000000000000000000000000000000000000000000000000008152600481018a90526024810189905260ff88166044820152606401610611565b82600a0a9150817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81614a8257614a8261502d565b04841115614acf576040517fc849483b000000000000000000000000000000000000000000000000000000008152600481018a90526024810189905260ff88166044820152606401610611565b5091909102925060019150611fe59050565b8360019550955050505050611fe5565b5f80828410614b2457507f34bd20690000000000000000000000000000000000000000000000000000000090505f611c9a565b835f03614b5d576040517fda6966d400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60305f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8501815b878210158015614b955750604d83105b15614bd857815160018401937fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90930192600a0a5f9190911a8590030201614b85565b878210614cfe5781515f1a8490036001811115614c2057507f0fdc26350000000000000000000000000000000000000000000000000000000095505f9450611c9a9350505050565b600a84900a8102828101831115614c6357507f0fdc26350000000000000000000000000000000000000000000000000000000096505f9550611c9a945050505050565b9190910190507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff909101905b878210614cfe5781515f1a60308114614cd357507f0fdc26350000000000000000000000000000000000000000000000000000000095505f9450611c9a9350505050565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90910190614c8f565b5f9890975095505050505050565b614d14615284565b565b5f60208284031215614d26575f80fd5b81357fffffffff0000000000000000000000000000000000000000000000000000000081168114610507575f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715614dc957614dc9614d55565b604052919050565b5f67ffffffffffffffff821115614dea57614dea614d55565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b5f60208284031215614e26575f80fd5b813567ffffffffffffffff811115614e3c575f80fd5b8201601f81018413614e4c575f80fd5b8035614e5f614e5a82614dd1565b614d82565b818152856020838501011115614e73575f80fd5b816020840160208301375f91810160200191909152949350505050565b602080825282518282018290528051604084018190525f9291820190839060608601905b80831015614eea57835173ffffffffffffffffffffffffffffffffffffffff168252928401926001929092019190840190614eb4565b509695505050505050565b5f81518084528060208401602086015e5f6020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b604081525f614f536040830185614ef5565b8281036020848101919091528451808352858201928201905f5b81811015614f8957845183529383019391830191600101614f6d565b5090979650505050505050565b602081525f6105076020830184614ef5565b80516020808301519190811015614fe7577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8160200360031b1b821691505b50919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b8082018082111561018057610180614fed565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361508a5761508a614fed565b5060010190565b8181038181111561018057610180614fed565b80518015158114610239575f80fd5b5f82601f8301126150c2575f80fd5b8151602067ffffffffffffffff8211156150de576150de614d55565b8160051b6150ed828201614d82565b9283528481018201928281019087851115615106575f80fd5b83870192505b848310156151255782518252918301919083019061510c565b979650505050505050565b5f805f60608486031215615142575f80fd5b61514b846150a4565b9250602084015167ffffffffffffffff80821115615167575f80fd5b818601915086601f83011261517a575f80fd5b8151615188614e5a82614dd1565b81815288602083860101111561519c575f80fd5b8160208501602083015e5f60208383010152809550505060408601519150808211156151c6575f80fd5b506151d3868287016150b3565b9150509250925092565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f806040838503121561521b575f80fd5b615224836150a4565b9150602083015190509250929050565b5f82615267577f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b500690565b828152604060208201525f610c4d6040830184614ef5565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52605160045260245ffdfe0288400100420b0280046b0641220186adb8a044003012020f2a881521281ac8811a000000000000000000080000000000100000000000000002000000000000000000290ea98a3a10f9c53927bda61c6395ad0e9fb4a8075dbeaf2d313e9e09b06d681dfe49062ce21ac13f83a6cc2ad2d2123422c3e0052f369e1f27267220a0a68d2f3576963b82189e475d217b131120880f24f4a8242f1af54041f7290afa3e8638acf3d13397e9fd00443a453c406bb548b9059d25a3cd1e11d0c3260b15eb4d16fc94274527bc412baf2cc2321b8f630dca9efe413ce35f1400684846c291e3435d68b13e5f9a151eb98c15239cd9c10c1f698235c8d3843d08d579273459d41a2c9ff617a5b2cd15c0031810f621af127ba34c26bb6c4137b2ad3d1b73563d0210215f36aa563921098e690457fb180376e752066a470128f11de101fcc60522de7ddd183d3d6d4296c37031cba2872e7b3af5304eee7219a8093544082b5f0801f5a523032303230323cf24e324e323cf23cf24e323032303230324e324e324e324e324e324e324e324e324e324e324e324e324e324e324e324e324e324e324e324e324e324e324e324e324e324e324e324e324e324e324e324e324e324e324e324e324e324e324e324e324e324e324e324e324e324e324e324e324e324e324e324e324e324e324e324e324e324e324e324e324e3" }, "deployedBytecode": { - "object": "0x608060405234801561000f575f80fd5b5060043610610064575f3560e01c80637764fd9c1161004d5780637764fd9c146100b0578063ccf44775146100d1578063d6d8c9a8146100e6575f80fd5b806301ffc9a7146100685780635514ca2014610090575b5f80fd5b61007b610076366004614d0e565b6100ee565b60405190151581526020015b60405180910390f35b6100a361009e366004614e0e565b610186565b6040516100879190614e88565b6100c36100be366004614e0e565b61023e565b604051610087929190614f39565b6100d961025e565b6040516100879190614f8e565b6100d961026d565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082167f1a2c8edd00000000000000000000000000000000000000000000000000000000148061018057507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b92915050565b6040805160208101909152606081525f6101e3836101a2610277565b6101aa61029a565b60408051808201909152600881527f1c991fe52025208200000000000000000000000000000000000000000000000060208201526102ba565b90505f6020840190505f6101fa8580510160200190565b90506102078383836104ac565b915061021483838361050e565b9150604051806020016040528061022a856106db565b90529350505050610239610739565b919050565b606080610255610250846101a2610277565b61077e565b91509150915091565b60606102686108fb565b905090565b6060610268610948565b6060604051806101a0016040528061016381526020016152aa6101639139905090565b60606040518060c001604052806090815260200161540d60909139905090565b6103476040518061026001604052805f81526020015f81526020015f81526020015f81526020015f81526020015f81526020015f80191681526020015f81526020015f81526020015f81526020015f81526020015f81526020015f80191681526020016060815260200160608152602001606081526020015f815260200160608152602001606081525090565b5f6040518061026001604052805f81526020015f81526020015f81526020015f81526020015f81526020015f81526020015f801b81526020015f8152602001600481526020015f81526020015f81526020015f81526020015f801b8152602001848152602001858152602001600467ffffffffffffffff8111156103cd576103cd614d4d565b6040519080825280602002602001820160405280156103f6578160200160208202803683370190505b5081525f602080830182905260408084018b905260609384018a90528051601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016828152808301825283517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00001681178452855290840182905283018190529082018190526080820181905260a082018190526101208201819052610140820181905261020082015290505b95945050505050565b5f5b8183101561050457825160015f9190911a1b6401000026008116156104df576104d8858585610c09565b93506104fe565b658000000000008116156104f8576104d8858585610c4d565b50610504565b506104ae565b50815b9392505050565b815160408051808201909152601081527f7573696e672d776f7264732d66726f6d0000000000000000000000000000000060208201525f919061055090614fa0565b7fffffffffffffffffffffffffffffffff000000000000000000000000000000008216146105815783915050610507565b5060108301925081831061061a5761022084015183037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0017f53c102422473590ce12511beab7637e1c33b596a7d58a80ea98463ad78950000175b6040517fe3e4992d00000000000000000000000000000000000000000000000000000000815260040161061191815260200190565b60405180910390fd5b825160015f91821a1b90640100002600821690036106835761022085015184037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0017f53c102422473590ce12511beab7637e1c33b596a7d58a80ea98463ad78950000176105dc565b836001019350505b818310156105045761069e8484846104ac565b925081831015610504575f806106b5868686610e7b565b9096509092509050816106c9575050610504565b6106d486868361102d565b505061068b565b60c08101516040516060919073ffffffffffffffffffffffffffffffffffffffff602082015f5b841561072357848316825260a09490941c5193602090910190600101610702565b8352604052610731826110ec565b509392505050565b60405162010000811061077b576040517f766c065f00000000000000000000000000000000000000000000000000000000815260048101829052602401610611565b50565b6060805f8361022001515111156108d0575f61079f84610220015160200190565b90505f6107b485610220015180510160200190565b90506107c18583836104ac565b91506107ce85838361050e565b91505b80821015610805576107e48583836104ac565b91506107f185838361113a565b91506107fe85838361153d565b91506107d1565b80821461083e576040517f7d565df600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610100850151600816156108cd5761022085015182037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0017f53c102422473590ce12511beab7637e1c33b596a7d58a80ea98463ad78950000176040517ff06f54cf00000000000000000000000000000000000000000000000000000000815260040161061191815260200190565b50505b5f806108e56108de86611afc565b8690611c31565b915091506108f1610739565b9094909350915050565b6040805160a0810182526004808252611c996020830152611fe592820192909252612025606082810191909152612082608083015291908190805b61093f8161226b565b94505050505090565b6060614d045f604890508091505f6040518061092001604052808467ffffffffffffffff1667ffffffffffffffff1681526020016122fb81526020016122fb81526020016122fb81526020016123c781526020016124db81526020016124db81526020016123c781526020016123c781526020016124db81526020016122fb81526020016122fb81526020016122fb81526020016124db81526020016124db81526020016124db81526020016124db81526020016124db81526020016124db81526020016124db81526020016124db81526020016124db81526020016124db81526020016124db81526020016124db81526020016124db81526020016124db81526020016124db81526020016124db81526020016124db81526020016124db81526020016124db81526020016124db81526020016124db81526020016124db81526020016124db81526020016124db81526020016124db81526020016124db81526020016124db81526020016124db81526020016124db81526020016124db81526020016124db81526020016124db81526020016124db81526020016124db81526020016124db81526020016124db81526020016124db81526020016124db81526020016124db81526020016124db81526020016124db81526020016124db81526020016124db81526020016124db81526020016124db81526020016124db81526020016124db81526020016124db81526020016124db81526020016124db81526020016124db81526020016124db81526020016124db81526020016124db81526020016124db81526020016124db81526020016124db81526020016124db81526020016124db81526020016124db8152509050606081905060488151146109365780516040517fc8b56901000000000000000000000000000000000000000000000000000000008152600481019190915260248101849052604401610611565b610100830180517ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1690525f610c45838364010000260061251d565b949350505050565b6101008301805160011790525f60048301821015610ce75761022084015183037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0017f53c102422473590ce12511beab7637e1c33b596a7d58a80ea98463ad78950000175b6040517f25a7646800000000000000000000000000000000000000000000000000000000815260040161061191815260200190565b825160f01c612f2a8114610d765761022085015184037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0017f53c102422473590ce12511beab7637e1c33b596a7d58a80ea98463ad78950000176040517f3e47169c00000000000000000000000000000000000000000000000000000000815260040161061191815260200190565b6003840193505f5b83851015610e1b5784515f1a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd18101610e0f577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff86015160f01c7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd5d18101610e0d57505050600193840193610e1b565b505b85600101955050610d7e565b80610e715761022086015185037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0017f53c102422473590ce12511beab7637e1c33b596a7d58a80ea98463ad7895000017610cb2565b5092949350505050565b81515f90819081908190600181831a1b6703ff200000000000811615610fa25786610ea7896001615012565b1015610f9957600182811a1b7ffffffffffffffffffffffffffffffffffeffffffffffffffffff00000000000082821701610ee4575f9350610f93565b7ffffffffffffffffffffffffffffffffffffffffffeffffffffff00000000000082821701610f8e576102208a015189037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0017f53c102422473590ce12511beab7637e1c33b596a7d58a80ea98463ad78950000176040517f75c28ff900000000000000000000000000000000000000000000000000000000815260040161061191815260200190565b600193505b50610fe7565b60019250610fe7565b640400000000811615610fb85760029250610fe7565b6b080000000000000000000000811615610fd55760039250610fe7565b505f9450869350849250611024915050565b505f905061101588888861100d83876101a09190910151600291820201015161ffff1690565b63ffffffff16565b90975060019550879450925050505b93509350939050565b73ffffffffffffffffffffffffffffffffffffffff8111156110ca5761022083015182037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0017f53c102422473590ce12511beab7637e1c33b596a7d58a80ea98463ad78950000176040517f9d7e517e00000000000000000000000000000000000000000000000000000000815260040161061191815260200190565b60c09092018051604080516020810190915290815260a01b9290921790915250565b60208101602082510282015b808210156111355781518151835281526020909101907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0016110f8565b505050565b5f5b818310156105045782515f90600190821a1b6f07fffffe8000000000000000000000008116156113b757610100860151600116156111f65761022086015185037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0017f53c102422473590ce12511beab7637e1c33b596a7d58a80ea98463ad78950000175b6040517f5520a51700000000000000000000000000000000000000000000000000000000815260040161061191815260200190565b6f07fffffe0000000000000000000000008116156112c95761122985856f07fffffe0000000003ff200000000000612546565b90955091505f6112398784612615565b50905080156112c35761022087015186037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0017f53c102422473590ce12511beab7637e1c33b596a7d58a80ea98463ad78950000176040517f53e6feba00000000000000000000000000000000000000000000000000000000815260040161061191815260200190565b506112ea565b6112e760018601856f07fffffe0000000003ff20000000000061251d565b94505b856040015160ff1660ff148061130757508560a0015160ff1660ff145b1561138d5761022086015185037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0017f53c102422473590ce12511beab7637e1c33b596a7d58a80ea98463ad78950000176040517f3820634100000000000000000000000000000000000000000000000000000000815260040161061191815260200190565b604086018051600190810190915260a0870180519091019052610100860180516009179052611536565b640100002600811615611409576113d7600186018564010000260061251d565b610100870180517ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1690529450611536565b670400000000000000811615611455575050610100840180516008177ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe16905260019290920191610504565b658000000000008116156114e55761022086015185037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0017f53c102422473590ce12511beab7637e1c33b596a7d58a80ea98463ad78950000175b6040517fedad0c5800000000000000000000000000000000000000000000000000000000815260040161061191815260200190565b61022086015185037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0017f53c102422473590ce12511beab7637e1c33b596a7d58a80ea98463ad78950000176111c1565b505061113c565b5f5b818310156105045782515f90600190821a1b6f07fffffe00000000000000000000000081161561175d57610100860151600116156115f95761022086015185037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0017f53c102422473590ce12511beab7637e1c33b596a7d58a80ea98463ad78950000175b6040517f4e803df600000000000000000000000000000000000000000000000000000000815260040161061191815260200190565b8461161581866f07fffffe0000000003ff200000000000612546565b80945081975050505f8061162e89610240015186612690565b91509150811561166f57611643898989612764565b97505f6116508a836129ef565b905061165d8a8383612a15565b50610100890180516002179052611749565b6116798986612bfa565b9092509050811561169d5761168f895f83612a15565b61169889612c74565b611749565b5f6060848a03600581016116b28d8d8d612764565b9b508c6101e0015151602002602001810190505f60059050604051935060208201840160405282818501528184528394506116fa8860056116f38760200190565b0185612cda565b5050506101e08b015180516001019061172d906117278361171e8680510160200190565b90602002900390565b83612ce3565b5061173a8b60ff84612a15565b50506101008901805160021790525b505050610100860180516001179052611af5565b6101008601516002161561187f576501000000000081165f036117fb5761022086015185037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0017f53c102422473590ce12511beab7637e1c33b596a7d58a80ea98463ad78950000176040517f23b5c6ea00000000000000000000000000000000000000000000000000000000815260040161061191815260200190565b606086810180515f1a6003019190829053603b821115611847576040517f6232f2d900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050610100860180517ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc169052600190940193611af5565b6502000000000081161561195b576060868101515f90811a91908290036119215761022088015187037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0017f53c102422473590ce12511beab7637e1c33b596a7d58a80ea98463ad78950000176040517f7f9db54200000000000000000000000000000000000000000000000000000000815260040161061191815260200190565b808801600383039250828153826004820101515f1a8360028301015160f01c600101535061194e88612c74565b5050600190940193611af5565b6401000026008116156119ad5761197b600186018564010000260061251d565b610100870180517ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1690529450611af5565b6b0800000003ff2004000000008116156119e8576119cc868686612cef565b94506119d786612c74565b610100860180516001179052611af5565b65100000000000811615611a0d57611a008686612e19565b5050600190920191610504565b670800000000000000811615611a4557611a278686612e19565b611a3086613271565b50506004610100850152600190920191610504565b65800000000000811615611aa45761022086015185037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0017f53c102422473590ce12511beab7637e1c33b596a7d58a80ea98463ad78950000176114b0565b61022086015185037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0017f53c102422473590ce12511beab7637e1c33b596a7d58a80ea98463ad78950000176115c4565b505061153f565b60e08101518151516060919060f082901c9060208114611b48576040517f858f2dcf00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604051935060208401601083045f8183535060016008850483018101928391015f80805b88811015611ba55789811c61ffff81165163ffff0000601092831b16811760e01b8786015284019360f08390031b929092179101611b6c565b50825117909152878203017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08181018952908801601f01166040525f5b82811015611c25576002810288016003015161ffff90811683018051602060f082901c019260e09190911c1690611c1a838284612cda565b505050600101611be2565b50505050505050919050565b6060805f611c3e8461359f565b90505f5b81811015611c81575f611c5586836135b9565b60040190505f611c6587846135e8565b60040282019050611c778883836135ff565b5050600101611c42565b5083611c8c866138bf565b92509250505b9250929050565b5f80808080611ca9888888613934565b985090925090508181036040811115611d3d5761022089015183037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0017f53c102422473590ce12511beab7637e1c33b596a7d58a80ea98463ad78950000176040517fff2f594900000000000000000000000000000000000000000000000000000000815260040161061191815260200190565b805f03611dc55761022089015183037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0017f53c102422473590ce12511beab7637e1c33b596a7d58a80ea98463ad78950000176040517fc75cd50900000000000000000000000000000000000000000000000000000000815260040161061191815260200190565b60028106600103611e515761022089015183037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0017f53c102422473590ce12511beab7637e1c33b596a7d58a80ea98463ad78950000176040517fd76d9b5700000000000000000000000000000000000000000000000000000000815260040161061191815260200190565b6001820397505f5b838910611fd45788515f90811a906001821b906703ff000000000000821615611ea557507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd08201611f9e565b6c7e000000000000000000000000821615611ee357507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa98201611f9e565b687e0000000000000000821615611f1d57507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc98201611f9e565b6102208d01518c037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0017f53c102422473590ce12511beab7637e1c33b596a7d58a80ea98463ad78950000176040517f69f1e3e600000000000000000000000000000000000000000000000000000000815260040161061191815260200190565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff909b019a831b96909617955050600401611e59565b50509350909150505b935093915050565b5f805f805f80611ff58888613984565b9296509094509250905061200a898486613e23565b826120158383613ea7565b9550955050505050935093915050565b5f808080612034878787613ef9565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08301805184840382529199509294509092505f91612072816140b3565b9190529698969750505050505050565b6001909101905f80836120a681856fffffffffdffffffffffffffeffffd9ff61251d565b9450848181036121315761022087015186037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0017f53c102422473590ce12511beab7637e1c33b596a7d58a80ea98463ad78950000176040517ff73a1aa800000000000000000000000000000000000000000000000000000000815260040161061191815260200190565b61213c878787610c09565b95508561215a81876fffffffffdfffffffffffffffffffffff61251d565b9650868681106121e65761022089015188037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0017f53c102422473590ce12511beab7637e1c33b596a7d58a80ea98463ad78950000175b6040517fc4b1913500000000000000000000000000000000000000000000000000000000815260040161061191815260200190565b875160015f91821a1b906b20000000000000000000000082169003612256576102208a015189037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0017f53c102422473590ce12511beab7637e1c33b596a7d58a80ea98463ad78950000176121b1565b50600190970196876120158a868686866140df565b60605f825160020267ffffffffffffffff81111561228b5761228b614d4d565b6040519080825280601f01601f1916602001820160405280156122b5576020820181803683370190505b50905061ffff80196020850160208651028101600285015b818310156122ef578051835186169085161781526020909201916002016122cd565b50939695505050505050565b5f8151600103612386575060208101517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8116601b0b60e082901d5f61233e8383836142a3565b905061ffff81111561237c576040517f7938075c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b9250610239915050565b81515f0361239557505f919050565b6040517f1ac6690800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f815160020361249f57602082015160408301517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8216601b0b60e083901d5f61240e8383836142a3565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8516601b0b935060e085901d925090505f6124478484836142a3565b905060ff821180612458575060ff81115b1561248f576040517f7938075c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60081b1794506102399350505050565b600282511015612395576040517ff16066b000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f81515f14612516576040517f9f16b02000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505f919050565b5f5b5f82600186515f1a1b1611838510161561253e5760018401935061251f565b509192915050565b5f80806001818787036020811161255d5780612560565b60205b915050875192505b8519600184841a1b1615818310161561258657600182019150612568565b9681019660208290036008810293841c90931b9261260857604080516020810185905201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152908290527fe47fe8b700000000000000000000000000000000000000000000000000000000825261061191600401614f8e565b5095969095509350505050565b5f806126218484612bfa565b909250905081611c925750610120830180515f93845260209384902060408051928352948201855293909401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000909316601084901b62ff00001617909317909252909160ff90911660010190565b600182810180515f928392600560ff93909316602102870192830192909101835b818310156127555760018301516021909301805190935f90819060ff1681806126da838e6142ff565b915091508186165f036126fc575f809b509b5050505050505050505050611c92565b5f8761270c60018503891661432a565b016004028b015195505062ffffff90811693508416830391506127409050575060019750601c1a9550611c92945050505050565b6127498361432a565b840193505050506126b1565b505f9788975095505050505050565b81516101e08401515f80825291600190831a1b907ffffffffffffffffffffffffffffffffffffffffffffffffff0000000000000008201610e71576127a885615052565b610100870180517ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe169052805190955060015f91821a1b9250805b8587101561298d57865160015f9190911a1b93506401000026008416156128165761280f888888610c09565b96506127e3565b67400000000000000084161561283a5761282f87615052565b96506001905061298d565b6001886101000151165f0361290b57600482036128d25761022088015187037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0017f53c102422473590ce12511beab7637e1c33b596a7d58a80ea98463ad78950000176040517f8c9fdbb300000000000000000000000000000000000000000000000000000000815260040161061191815260200190565b5f6128de898989614402565b60208581028701018190526101008b0180516001179052909850905061290383615052565b9250506127e3565b61022088015187037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0017f53c102422473590ce12511beab7637e1c33b596a7d58a80ea98463ad78950000175b6040517f722cd24a00000000000000000000000000000000000000000000000000000000815260040161061191815260200190565b806129e35761022088015187037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0017f53c102422473590ce12511beab7637e1c33b596a7d58a80ea98463ad7895000017612958565b50905250919392505050565b6101c08201516002828102820101516101e08401515f9261ffff90921691906104a39083565b612a1e8361442a565b610100830180517ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb1660081790526020808401515f90811a8501602101805190911a60ff811492919060018101825350508115612aa7576040517f8092d1ea00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050825180516060808601515f90811a87016061018051939461ffff8616949093921a60ff81149291600886048503601c0191600181018253505f60038201537fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe30180517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00001690911790528115612b6a576040517f3abd0c5e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050602090920183821b176018820185901b178083529160e0829003612bf25760408051601083901b6020908117601f9092017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016918252810190915281517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000168117825286525b505050505050565b6101208201516101408301515f8381526020808220919384939290911c91600160ff84161b80821615612c5f5761ffff83165b8015612c5d578360201c8503612c50576001965061ffff8460101c169550612c5d565b51925061ffff8316612c2d565b505b17610140909601959095525090939092509050565b6060818101515f90811a919082900361113557602083810180515f1a600101919082815350603e8210612cd3576040517fe826b5f600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050505050565b8083835e505050565b6020810283835e505050565b5f8080612cfd868686610e7b565b9096509250905080612d8b5761022086015185037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0017f53c102422473590ce12511beab7637e1c33b596a7d58a80ea98463ad78950000175b6040517fb0e4e5b300000000000000000000000000000000000000000000000000000000815260040161061191815260200190565b5f80612d96846144b6565b6101808901511615612dd75761016088015160101c5b8015801590612db9575082155b15612dd557602081015190519085149250600190910190612dac565b505b61016088015161ffff16612dfd600184612df15782612df5565b8383035b8b9190612a15565b5081612e0d57612e0d88856144cd565b50949695505050505050565b6060828101515f1a908115612ea95761022084015183037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0017f53c102422473590ce12511beab7637e1c33b596a7d58a80ea98463ad78950000176040517f6fb11cdc00000000000000000000000000000000000000000000000000000000815260040161061191815260200190565b5050612eb48261442a565b61010082018051600416600890811790915260a0830151602084015160ff8083169360f89290921c9290911c1681035f819003612fde576004856101000151165f03612f7b5761022085015184037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0017f53c102422473590ce12511beab7637e1c33b596a7d58a80ea98463ad78950000176040517fab1d3ea700000000000000000000000000000000000000000000000000000000815260040161061191815260200190565b90820190603e8210612fb9576040517fe826b5f600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60f882901b6020860152610200850151612fd3908461451f565b6102008601526130f9565b60018111156130f957808310156130705761022085015184037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0017f53c102422473590ce12511beab7637e1c33b596a7d58a80ea98463ad78950000176040517f78ef278200000000000000000000000000000000000000000000000000000000815260040161061191815260200190565b808311156130f95761022085015184037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0017f53c102422473590ce12511beab7637e1c33b596a7d58a80ea98463ad78950000176040517f43168e6800000000000000000000000000000000000000000000000000000000815260040161061191815260200190565b8082036001016020601083028101905b8181101561325d5760a08801516020848a0181015191831c61ffff16915f1a9060015b82811161324b5760208406601c0361314557925160f01c925b83516102008d015160019190911a9061315e90826145a3565b6102008e01525f82851480156131745750896001145b61317f576001613181565b8b5b6102008f015190915061319490826145e9565b6102008f0152600f8111806131a95750600f82115b1561322f576102208e01518d037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0017f53c102422473590ce12511beab7637e1c33b596a7d58a80ea98463ad78950000176040517f7ea1869f00000000000000000000000000000000000000000000000000000000815260040161061191815260200190565b818160041b17600187015350506004939093019260010161312c565b50506001909401935050601001613109565b5050505060081b60a0909301929092525050565b60e081015160208083015160f083811c925f9290921a60010191908390036132c5576040517fa806284100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610200850151855180515f928392909160219060101c61ffff165b80156132f757805190925060101c61ffff166132e0565b506040518a82018051919650601c8401939160049160248901915f90811a805b8d8310156133dc5760048202860195506004878a03045b8082111561334c57965161ffff16601c81019950969003600761332e565b506004810298899003805186529894909401938103865b60078211156133a8575160101c61ffff1680518652601c909501947ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff990910190613363565b81156133c3575160101c61ffff168051865260048202909501945b50505060019182018051909291909101905f1a80613317565b50505082895250600488810180517fffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9290940491909101601881901b8817939093179052601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660405260ff1094505083156134a8576040517fe972437e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6134b56001808a1b615089565b891685891b60f06134c78b6010615012565b901b171760e08b01526101008a0180517ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7169052604080516020601f9091017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01681815280820183525f80517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00001682178152908d52908c01819052908b0181905260608b0181905260808b0181905260a08b018190526101208b018190526101408b018190526102008b015250505050505050505050565b5f81515f036135af57505f919050565b50602001515f1a90565b5f806135c48461359f565b60020260010190505f6135d7858561465c565b949091019093016020019392505050565b5f806135f484846135b9565b515f1a949350505050565b808210156111355781517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0160f882901c016138395760c08401515b80156138375760a081901c5161016086015161ffff60e085901c1660208101805160089390931b62ffff0016600187901a1760e81b7cffffffffffffffffffffffffffffffffffffffffffffffffffffffffff909316929092179091526040517f570c7a630000000000000000000000000000000000000000000000000000000081529192915f908190819073ffffffffffffffffffffffffffffffffffffffff86169063570c7a63906136f2908790600401614f8e565b5f60405180830381865afa15801561370c573d5f803e3d5ffd5b505050506040513d5f823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682016040526137519190810190615128565b925092509250821561382d57815160041461379a57816040517fbe2d187d0000000000000000000000000000000000000000000000000000000081526004016106119190614f8e565b60208201517fffffffff00000000000000000000000000000000000000000000000000000000167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff88161789525f5b81518110156138225761381a828281518110613803576138036151d5565b60200260200101518c6144cd90919063ffffffff16565b6001016137e5565b505050505050613837565b505050505061363a565b505b5081517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0160f882901c016138b357606061ffff8260e01c1690505f6003820152600581019050806040517faedfba2f0000000000000000000000000000000000000000000000000000000081526004016106119190614f8e565b506004820191506135ff565b6101608101516040805161ffff8316808252602080820283019081019093529092909160109190911c90835b8082111561392b5760208301518252915161ffff16917fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0909101906138eb565b50505050919050565b5f808080613943866002615012565b9050806c7e0000007e03ff0000000000005b86821081600184515f1a1b161515161561397457600182019150613955565b5090979096508695509350505050565b5f82818061399983866520000000000061251d565b925085831415836139b381886703ff00000000000061251d565b94508085036139ed57507f34bd20690000000000000000000000000000000000000000000000000000000094505f9250829150613e1a9050565b5f806139f98a886146b2565b90925090507fffffffff00000000000000000000000000000000000000000000000000000000821615613a37575095505f9350839250613e1a915050565b86519095506540000000000060015f9290921a9190911b161515888710169150508015613cc657506001909301925f84613a7a81896703ff00000000000061251d565b9550808603613ab557507f7bfa48af0000000000000000000000000000000000000000000000000000000095505f9350839250613e1a915050565b855b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81018051908a1160015f9290921a9190911b660100000000000016151516600103613b24577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01613ab7565b818114613b7b575f80613b3784846146b2565b90925090507fffffffff00000000000000000000000000000000000000000000000000000000821615613b77575097505f9550859450613e1a9350505050565b9350505b5f831215613bb657507f7bfa48af0000000000000000000000000000000000000000000000000000000096505f9450849350613e1a92505050565b8315613bc257825f0392505b80820394505f851315613c0257507f013b2aaa0000000000000000000000000000000000000000000000000000000096505f9450849350613e1a92505050565b855f03613c1157829550613cc3565b5f8590036043811115613c5257507f32b8b8be0000000000000000000000000000000000000000000000000000000097505f9550859450613e1a9350505050565b600a0a8681025f88838381613c6957613c69615025565b0514159050601b82900b8214158180613c7f5750805b15613cbb57507f32b8b8be000000000000000000000000000000000000000000000000000000009a505f9850889750613e1a9650505050505050565b505084019650505b50505b84516c2000000020000000000000000060015f9290921a9190911b161515878610168015613e0b5760019095019485613d06818a6520000000000061251d565b965086613d1c818b6703ff00000000000061251d565b9750808803613d5957507f013b2aaa0000000000000000000000000000000000000000000000000000000097505f9550859450613e1a9350505050565b505f80613d66838a6146b2565b90925090507fffffffff00000000000000000000000000000000000000000000000000000000821615613da6575097505f9550859450613e1a9350505050565b9250508482015f83138015613dba57508581125b80613dce57505f83128015613dce57508581135b15613e0757507fd556b1110000000000000000000000000000000000000000000000000000000097505f9550859450613e1a9350505050565b9450505b845f03613e16575f93505b5050505b92959194509250565b7fffffffff00000000000000000000000000000000000000000000000000000000811615611135576102208301515f9083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0017f53c102422473590ce12511beab7637e1c33b596a7d58a80ea98463ad78950000179050815f528060045260245ffd5b5f805f613eb485856147dc565b9150915080610731576040517f22c9f7bb0000000000000000000000000000000000000000000000000000000081526004810186905260248101859052604401610611565b5f80806001850181806f7ffffffffffffffffffffffb0000000081807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8b8b0301602080821015613f475750805b875193505b84600185851a1b1615158184101615613f6a57600183019250613f4c565b505080602003613ff5576102208c01518b037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0017f53c102422473590ce12511beab7637e1c33b596a7d58a80ea98463ad78950000176040517f30515bda00000000000000000000000000000000000000000000000000000000815260040161061191815260200190565b85810180519095505f1a6001811b6404000000001615806140155750858b145b1561409b576102208d015186037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0017f53c102422473590ce12511beab7637e1c33b596a7d58a80ea98463ad78950000176040517f04022fbf00000000000000000000000000000000000000000000000000000000815260040161061191815260200190565b50949b939a505060018a019850919650505050505050565b5f80601f90505f60e09050818451168082175f528060208601600183016020035e50505f519392505050565b5f60608186860361ffff811115614125576040517fb6da789c00000000000000000000000000000000000000000000000000000000815260048101829052602401610611565b604080516041888803848101838101929092017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169093526002828101859052018152935060228401925061417b898484612cda565b6141888783850183612cda565b50505060c08701515b80156142525760a081901c516040517fc6c0cbb60000000000000000000000000000000000000000000000000000000081529091905f90819073ffffffffffffffffffffffffffffffffffffffff84169063c6c0cbb6906141f6908890600401614f8e565b6040805180830381865afa158015614210573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906142349190615202565b91509150811561424a5794506104a39350505050565b505050614191565b61022088015187037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0017f53c102422473590ce12511beab7637e1c33b596a7d58a80ea98463ad7895000017612d56565b5f805f6142b18686866148e2565b91509150806142f6576040517f05e476780000000000000000000000000000000000000000000000000000000081526004810187905260248101869052604401610611565b50949350505050565b5f80825f528360205360215f2090506001815f1a1b915062ffffff8116611c92575060019250929050565b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361435b5750610100919050565b507f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f7f5555555555555555555555555555555555555555555555555555555555555555600183901c16909103600281901c7f3333333333333333333333333333333333333333333333333333333333333333908116911601600481901c01167f01010101010101010101010101010101010101010101010101010101010101010260f81c90565b5f805f805f614412888888610e7b565b9250925092508215614252579093509150611fdd9050565b8051602080830180515f90811a8086016021015160a0939190831a61447c5785518488018051600861ffff909316929092046020038801601e83901a840360010160100290811b909217905260f01092505b50508015612cd3576040517f5b1a42d600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f6144c36101008361522c565b6001901b92915050565b6101608201805160408051808201909152601091821c808252602082018590528351600161ffff909116019282901b9290921790925261450c836144b6565b6101809094018051909417909352505050565b5f61452a83836145e9565b925060ff600884901c8116830190811115614571576040517fe826b5f600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff841660089190911b17905092915050565b5f60ff8316828110156145e2576040517f23b49a2a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050900390565b5f60ff808416830190600885901c811690601086901c90831115614639576040517fe826b5f600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b808311156146445750815b601081901b600883901b841717935050505092915050565b5f6146668361359f565b82106146a25781836040517ffcfaeff1000000000000000000000000000000000000000000000000000000008152600401610611929190615264565b50600202016003015161ffff1690565b81515f90819065200000000000600191831a9190911b161515838510168085019082806146df8488614ae9565b90925090507fffffffff0000000000000000000000000000000000000000000000000000000082161561471a575093505f9250611c92915050565b825f0361477d577f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811161474e575f614770565b7f0fdc2635000000000000000000000000000000000000000000000000000000005b95509350611c9292505050565b7f800000000000000000000000000000000000000000000000000000000000000081116147aa575f6147cc565b7f0fdc2635000000000000000000000000000000000000000000000000000000005b95505f0393505050509250929050565b5f601b83900b8314838382614840577d90e40fbeea1d3a4abc8955e946fe31cdcf66f634e100000000000000000086051561482057620186a0860595506005850194505b8586601b0b1461483b57600a86059550846001019450614820565b614856565b855f0361485657505f925060019150611c929050565b848560030b146148b2575f85121561487657505f9250829150611c929050565b6040517fd556b1110000000000000000000000000000000000000000000000000000000081526004810183905260248101829052604401610611565b50507bffffffffffffffffffffffffffffffffffffffffffffffffffffffff841660e084901b1791509250929050565b5f805f851215614928576040517f4a7d166b0000000000000000000000000000000000000000000000000000000081526004810186905260248101859052604401610611565b845f0361493a57505f90506001611fdd565b8460ff8416850185811215614985576040517fd556b1110000000000000000000000000000000000000000000000000000000081526004810188905260248101879052604401610611565b5f805f8312156149ef577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb38312156149c6575f809550955050505050611fdd565b825f03600a0a91508184816149dd576149dd615025565b0495505084029091149150611fdd9050565b5f831315614ad957604d831315614a45576040517fc849483b000000000000000000000000000000000000000000000000000000008152600481018a90526024810189905260ff88166044820152606401610611565b82600a0a9150817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81614a7a57614a7a615025565b04841115614ac7576040517fc849483b000000000000000000000000000000000000000000000000000000008152600481018a90526024810189905260ff88166044820152606401610611565b5091909102925060019150611fdd9050565b8360019550955050505050611fdd565b5f80828410614b1c57507f34bd20690000000000000000000000000000000000000000000000000000000090505f611c92565b835f03614b55576040517fda6966d400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60305f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8501815b878210158015614b8d5750604d83105b15614bd057815160018401937fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90930192600a0a5f9190911a8590030201614b7d565b878210614cf65781515f1a8490036001811115614c1857507f0fdc26350000000000000000000000000000000000000000000000000000000095505f9450611c929350505050565b600a84900a8102828101831115614c5b57507f0fdc26350000000000000000000000000000000000000000000000000000000096505f9550611c92945050505050565b9190910190507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff909101905b878210614cf65781515f1a60308114614ccb57507f0fdc26350000000000000000000000000000000000000000000000000000000095505f9450611c929350505050565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90910190614c87565b5f9890975095505050505050565b614d0c61527c565b565b5f60208284031215614d1e575f80fd5b81357fffffffff0000000000000000000000000000000000000000000000000000000081168114610507575f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715614dc157614dc1614d4d565b604052919050565b5f67ffffffffffffffff821115614de257614de2614d4d565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b5f60208284031215614e1e575f80fd5b813567ffffffffffffffff811115614e34575f80fd5b8201601f81018413614e44575f80fd5b8035614e57614e5282614dc9565b614d7a565b818152856020838501011115614e6b575f80fd5b816020840160208301375f91810160200191909152949350505050565b602080825282518282018290528051604084018190525f9291820190839060608601905b80831015614ee257835173ffffffffffffffffffffffffffffffffffffffff168252928401926001929092019190840190614eac565b509695505050505050565b5f81518084528060208401602086015e5f6020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b604081525f614f4b6040830185614eed565b8281036020848101919091528451808352858201928201905f5b81811015614f8157845183529383019391830191600101614f65565b5090979650505050505050565b602081525f6105076020830184614eed565b80516020808301519190811015614fdf577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8160200360031b1b821691505b50919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b8082018082111561018057610180614fe5565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361508257615082614fe5565b5060010190565b8181038181111561018057610180614fe5565b80518015158114610239575f80fd5b5f82601f8301126150ba575f80fd5b8151602067ffffffffffffffff8211156150d6576150d6614d4d565b8160051b6150e5828201614d7a565b92835284810182019282810190878511156150fe575f80fd5b83870192505b8483101561511d57825182529183019190830190615104565b979650505050505050565b5f805f6060848603121561513a575f80fd5b6151438461509c565b9250602084015167ffffffffffffffff8082111561515f575f80fd5b818601915086601f830112615172575f80fd5b8151615180614e5282614dc9565b818152886020838601011115615194575f80fd5b8160208501602083015e5f60208383010152809550505060408601519150808211156151be575f80fd5b506151cb868287016150ab565b9150509250925092565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f8060408385031215615213575f80fd5b61521c8361509c565b9150602083015190509250929050565b5f8261525f577f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b500690565b828152604060208201525f610c456040830184614eed565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52605160045260245ffdfe0288400100420b0280046b0641220186adb8a044003012020f2a880521281ac8811a000000000000000000080000000000100000000000000002000000000000000000290ea98a3a10f9c53927bda61c6395ad0e9fb4a8075dbeaf2d313e9e09b06d681dfe49062ce21ac13e83a6cc2ad2d2123422c3e0052f369e1f27267220a0a68d2f357696465d217b131120880f24f4a8242f1af53f41f7290afa3e8638acf3d13397e9fd00443a453b406bb547b9059d25a3cd1e11d0c3260b15eb4d16fc94274427bc412baf2cc2321b8f630dca9efe403ce35f1400684845c291e3425d68b13d5f9a151eb98c15239cd9c10c1f698235c8d3843c08d579273459d41a2c9ff617a5b2cd15c0031810f621af127ba34c26bb6c4137b2ad3d1b73563d0210215f36aa563921098e690457fb180376e752066a470128f11de101fcc60522de7ddd183d3d6d4196c37031cba2872e7b3af5304eee7219a8093543082b5f0801f5a522fb22fb22fb23c724db24db23c723c724db22fb22fb22fb24db24db24db24db24db24db24db24db24db24db24db24db24db24db24db24db24db24db24db24db24db24db24db24db24db24db24db24db24db24db24db24db24db24db24db24db24db24db24db24db24db24db24db24db24db24db24db24db24db24db24db24db24db24db24db24db24db24db24db24db" + "object": "0x608060405234801561000f575f80fd5b5060043610610064575f3560e01c80637764fd9c1161004d5780637764fd9c146100b0578063ccf44775146100d1578063d6d8c9a8146100e6575f80fd5b806301ffc9a7146100685780635514ca2014610090575b5f80fd5b61007b610076366004614d16565b6100ee565b60405190151581526020015b60405180910390f35b6100a361009e366004614e16565b610186565b6040516100879190614e90565b6100c36100be366004614e16565b61023e565b604051610087929190614f41565b6100d961025e565b6040516100879190614f96565b6100d961026d565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082167f1a2c8edd00000000000000000000000000000000000000000000000000000000148061018057507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b92915050565b6040805160208101909152606081525f6101e3836101a2610277565b6101aa61029a565b60408051808201909152600881527f1ca11fed202d208a00000000000000000000000000000000000000000000000060208201526102ba565b90505f6020840190505f6101fa8580510160200190565b90506102078383836104ac565b915061021483838361050e565b9150604051806020016040528061022a856106db565b90529350505050610239610739565b919050565b606080610255610250846101a2610277565b61077e565b91509150915091565b60606102686108fb565b905090565b6060610268610948565b6060604051806101a0016040528061016781526020016152b26101679139905090565b60606040518060c001604052806092815260200161541960929139905090565b6103476040518061026001604052805f81526020015f81526020015f81526020015f81526020015f81526020015f81526020015f80191681526020015f81526020015f81526020015f81526020015f81526020015f81526020015f80191681526020016060815260200160608152602001606081526020015f815260200160608152602001606081525090565b5f6040518061026001604052805f81526020015f81526020015f81526020015f81526020015f81526020015f81526020015f801b81526020015f8152602001600481526020015f81526020015f81526020015f81526020015f801b8152602001848152602001858152602001600467ffffffffffffffff8111156103cd576103cd614d55565b6040519080825280602002602001820160405280156103f6578160200160208202803683370190505b5081525f602080830182905260408084018b905260609384018a90528051601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016828152808301825283517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00001681178452855290840182905283018190529082018190526080820181905260a082018190526101208201819052610140820181905261020082015290505b95945050505050565b5f5b8183101561050457825160015f9190911a1b6401000026008116156104df576104d8858585610c11565b93506104fe565b658000000000008116156104f8576104d8858585610c55565b50610504565b506104ae565b50815b9392505050565b815160408051808201909152601081527f7573696e672d776f7264732d66726f6d0000000000000000000000000000000060208201525f919061055090614fa8565b7fffffffffffffffffffffffffffffffff000000000000000000000000000000008216146105815783915050610507565b5060108301925081831061061a5761022084015183037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0017f53c102422473590ce12511beab7637e1c33b596a7d58a80ea98463ad78950000175b6040517fe3e4992d00000000000000000000000000000000000000000000000000000000815260040161061191815260200190565b60405180910390fd5b825160015f91821a1b90640100002600821690036106835761022085015184037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0017f53c102422473590ce12511beab7637e1c33b596a7d58a80ea98463ad78950000176105dc565b836001019350505b818310156105045761069e8484846104ac565b925081831015610504575f806106b5868686610e83565b9096509092509050816106c9575050610504565b6106d4868683611035565b505061068b565b60c08101516040516060919073ffffffffffffffffffffffffffffffffffffffff602082015f5b841561072357848316825260a09490941c5193602090910190600101610702565b8352604052610731826110f4565b509392505050565b60405162010000811061077b576040517f766c065f00000000000000000000000000000000000000000000000000000000815260048101829052602401610611565b50565b6060805f8361022001515111156108d0575f61079f84610220015160200190565b90505f6107b485610220015180510160200190565b90506107c18583836104ac565b91506107ce85838361050e565b91505b80821015610805576107e48583836104ac565b91506107f1858383611142565b91506107fe858383611545565b91506107d1565b80821461083e576040517f7d565df600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610100850151600816156108cd5761022085015182037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0017f53c102422473590ce12511beab7637e1c33b596a7d58a80ea98463ad78950000176040517ff06f54cf00000000000000000000000000000000000000000000000000000000815260040161061191815260200190565b50505b5f806108e56108de86611b04565b8690611c39565b915091506108f1610739565b9094909350915050565b6040805160a0810182526004808252611ca16020830152611fed9282019290925261202d60608281019190915261208a608083015291908190805b61093f81612273565b94505050505090565b6060614d0c5f604990508091505f6040518061094001604052808467ffffffffffffffff1667ffffffffffffffff1681526020016123038152602001612303815260200161230381526020016123cf81526020016124e381526020016124e381526020016123cf81526020016123cf81526020016124e381526020016123038152602001612303815260200161230381526020016124e381526020016124e381526020016124e381526020016124e381526020016124e381526020016124e381526020016124e381526020016124e381526020016124e381526020016124e381526020016124e381526020016124e381526020016124e381526020016124e381526020016124e381526020016124e381526020016124e381526020016124e381526020016124e381526020016124e381526020016124e381526020016124e381526020016124e381526020016124e381526020016124e381526020016124e381526020016124e381526020016124e381526020016124e381526020016124e381526020016124e381526020016124e381526020016124e381526020016124e381526020016124e381526020016124e381526020016124e381526020016124e381526020016124e381526020016124e381526020016124e381526020016124e381526020016124e381526020016124e381526020016124e381526020016124e381526020016124e381526020016124e381526020016124e381526020016124e381526020016124e381526020016124e381526020016124e381526020016124e381526020016124e381526020016124e381526020016124e381526020016124e381526020016124e381526020016124e381526020016124e38152509050606081905060498151146109365780516040517fc8b56901000000000000000000000000000000000000000000000000000000008152600481019190915260248101849052604401610611565b610100830180517ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1690525f610c4d8383640100002600612525565b949350505050565b6101008301805160011790525f60048301821015610cef5761022084015183037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0017f53c102422473590ce12511beab7637e1c33b596a7d58a80ea98463ad78950000175b6040517f25a7646800000000000000000000000000000000000000000000000000000000815260040161061191815260200190565b825160f01c612f2a8114610d7e5761022085015184037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0017f53c102422473590ce12511beab7637e1c33b596a7d58a80ea98463ad78950000176040517f3e47169c00000000000000000000000000000000000000000000000000000000815260040161061191815260200190565b6003840193505f5b83851015610e235784515f1a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd18101610e17577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff86015160f01c7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd5d18101610e1557505050600193840193610e23565b505b85600101955050610d86565b80610e795761022086015185037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0017f53c102422473590ce12511beab7637e1c33b596a7d58a80ea98463ad7895000017610cba565b5092949350505050565b81515f90819081908190600181831a1b6703ff200000000000811615610faa5786610eaf89600161501a565b1015610fa157600182811a1b7ffffffffffffffffffffffffffffffffffeffffffffffffffffff00000000000082821701610eec575f9350610f9b565b7ffffffffffffffffffffffffffffffffffffffffffeffffffffff00000000000082821701610f96576102208a015189037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0017f53c102422473590ce12511beab7637e1c33b596a7d58a80ea98463ad78950000176040517f75c28ff900000000000000000000000000000000000000000000000000000000815260040161061191815260200190565b600193505b50610fef565b60019250610fef565b640400000000811615610fc05760029250610fef565b6b080000000000000000000000811615610fdd5760039250610fef565b505f945086935084925061102c915050565b505f905061101d88888861101583876101a09190910151600291820201015161ffff1690565b63ffffffff16565b90975060019550879450925050505b93509350939050565b73ffffffffffffffffffffffffffffffffffffffff8111156110d25761022083015182037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0017f53c102422473590ce12511beab7637e1c33b596a7d58a80ea98463ad78950000176040517f9d7e517e00000000000000000000000000000000000000000000000000000000815260040161061191815260200190565b60c09092018051604080516020810190915290815260a01b9290921790915250565b60208101602082510282015b8082101561113d5781518151835281526020909101907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001611100565b505050565b5f5b818310156105045782515f90600190821a1b6f07fffffe8000000000000000000000008116156113bf57610100860151600116156111fe5761022086015185037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0017f53c102422473590ce12511beab7637e1c33b596a7d58a80ea98463ad78950000175b6040517f5520a51700000000000000000000000000000000000000000000000000000000815260040161061191815260200190565b6f07fffffe0000000000000000000000008116156112d15761123185856f07fffffe0000000003ff20000000000061254e565b90955091505f611241878461261d565b50905080156112cb5761022087015186037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0017f53c102422473590ce12511beab7637e1c33b596a7d58a80ea98463ad78950000176040517f53e6feba00000000000000000000000000000000000000000000000000000000815260040161061191815260200190565b506112f2565b6112ef60018601856f07fffffe0000000003ff200000000000612525565b94505b856040015160ff1660ff148061130f57508560a0015160ff1660ff145b156113955761022086015185037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0017f53c102422473590ce12511beab7637e1c33b596a7d58a80ea98463ad78950000176040517f3820634100000000000000000000000000000000000000000000000000000000815260040161061191815260200190565b604086018051600190810190915260a087018051909101905261010086018051600917905261153e565b640100002600811615611411576113df6001860185640100002600612525565b610100870180517ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe169052945061153e565b67040000000000000081161561145d575050610100840180516008177ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe16905260019290920191610504565b658000000000008116156114ed5761022086015185037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0017f53c102422473590ce12511beab7637e1c33b596a7d58a80ea98463ad78950000175b6040517fedad0c5800000000000000000000000000000000000000000000000000000000815260040161061191815260200190565b61022086015185037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0017f53c102422473590ce12511beab7637e1c33b596a7d58a80ea98463ad78950000176111c9565b5050611144565b5f5b818310156105045782515f90600190821a1b6f07fffffe00000000000000000000000081161561176557610100860151600116156116015761022086015185037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0017f53c102422473590ce12511beab7637e1c33b596a7d58a80ea98463ad78950000175b6040517f4e803df600000000000000000000000000000000000000000000000000000000815260040161061191815260200190565b8461161d81866f07fffffe0000000003ff20000000000061254e565b80945081975050505f8061163689610240015186612698565b9150915081156116775761164b89898961276c565b97505f6116588a836129f7565b90506116658a8383612a1d565b50610100890180516002179052611751565b6116818986612c02565b909250905081156116a557611697895f83612a1d565b6116a089612c7c565b611751565b5f6060848a03600581016116ba8d8d8d61276c565b9b508c6101e0015151602002602001810190505f60059050604051935060208201840160405282818501528184528394506117028860056116fb8760200190565b0185612ce2565b5050506101e08b01518051600101906117359061172f836117268680510160200190565b90602002900390565b83612ceb565b506117428b60ff84612a1d565b50506101008901805160021790525b505050610100860180516001179052611afd565b61010086015160021615611887576501000000000081165f036118035761022086015185037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0017f53c102422473590ce12511beab7637e1c33b596a7d58a80ea98463ad78950000176040517f23b5c6ea00000000000000000000000000000000000000000000000000000000815260040161061191815260200190565b606086810180515f1a6003019190829053603b82111561184f576040517f6232f2d900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050610100860180517ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc169052600190940193611afd565b65020000000000811615611963576060868101515f90811a91908290036119295761022088015187037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0017f53c102422473590ce12511beab7637e1c33b596a7d58a80ea98463ad78950000176040517f7f9db54200000000000000000000000000000000000000000000000000000000815260040161061191815260200190565b808801600383039250828153826004820101515f1a8360028301015160f01c600101535061195688612c7c565b5050600190940193611afd565b6401000026008116156119b5576119836001860185640100002600612525565b610100870180517ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1690529450611afd565b6b0800000003ff2004000000008116156119f0576119d4868686612cf7565b94506119df86612c7c565b610100860180516001179052611afd565b65100000000000811615611a1557611a088686612e21565b5050600190920191610504565b670800000000000000811615611a4d57611a2f8686612e21565b611a3886613279565b50506004610100850152600190920191610504565b65800000000000811615611aac5761022086015185037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0017f53c102422473590ce12511beab7637e1c33b596a7d58a80ea98463ad78950000176114b8565b61022086015185037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0017f53c102422473590ce12511beab7637e1c33b596a7d58a80ea98463ad78950000176115cc565b5050611547565b60e08101518151516060919060f082901c9060208114611b50576040517f858f2dcf00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604051935060208401601083045f8183535060016008850483018101928391015f80805b88811015611bad5789811c61ffff81165163ffff0000601092831b16811760e01b8786015284019360f08390031b929092179101611b74565b50825117909152878203017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08181018952908801601f01166040525f5b82811015611c2d576002810288016003015161ffff90811683018051602060f082901c019260e09190911c1690611c22838284612ce2565b505050600101611bea565b50505050505050919050565b6060805f611c46846135a7565b90505f5b81811015611c89575f611c5d86836135c1565b60040190505f611c6d87846135f0565b60040282019050611c7f888383613607565b5050600101611c4a565b5083611c94866138c7565b92509250505b9250929050565b5f80808080611cb188888861393c565b985090925090508181036040811115611d455761022089015183037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0017f53c102422473590ce12511beab7637e1c33b596a7d58a80ea98463ad78950000176040517fff2f594900000000000000000000000000000000000000000000000000000000815260040161061191815260200190565b805f03611dcd5761022089015183037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0017f53c102422473590ce12511beab7637e1c33b596a7d58a80ea98463ad78950000176040517fc75cd50900000000000000000000000000000000000000000000000000000000815260040161061191815260200190565b60028106600103611e595761022089015183037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0017f53c102422473590ce12511beab7637e1c33b596a7d58a80ea98463ad78950000176040517fd76d9b5700000000000000000000000000000000000000000000000000000000815260040161061191815260200190565b6001820397505f5b838910611fdc5788515f90811a906001821b906703ff000000000000821615611ead57507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd08201611fa6565b6c7e000000000000000000000000821615611eeb57507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa98201611fa6565b687e0000000000000000821615611f2557507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc98201611fa6565b6102208d01518c037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0017f53c102422473590ce12511beab7637e1c33b596a7d58a80ea98463ad78950000176040517f69f1e3e600000000000000000000000000000000000000000000000000000000815260040161061191815260200190565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff909b019a831b96909617955050600401611e61565b50509350909150505b935093915050565b5f805f805f80611ffd888861398c565b92965090945092509050612012898486613e2b565b8261201d8383613eaf565b9550955050505050935093915050565b5f80808061203c878787613f01565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08301805184840382529199509294509092505f9161207a816140bb565b9190529698969750505050505050565b6001909101905f80836120ae81856fffffffffdffffffffffffffeffffd9ff612525565b9450848181036121395761022087015186037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0017f53c102422473590ce12511beab7637e1c33b596a7d58a80ea98463ad78950000176040517ff73a1aa800000000000000000000000000000000000000000000000000000000815260040161061191815260200190565b612144878787610c11565b95508561216281876fffffffffdfffffffffffffffffffffff612525565b9650868681106121ee5761022089015188037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0017f53c102422473590ce12511beab7637e1c33b596a7d58a80ea98463ad78950000175b6040517fc4b1913500000000000000000000000000000000000000000000000000000000815260040161061191815260200190565b875160015f91821a1b906b2000000000000000000000008216900361225e576102208a015189037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0017f53c102422473590ce12511beab7637e1c33b596a7d58a80ea98463ad78950000176121b9565b506001909701968761201d8a868686866140e7565b60605f825160020267ffffffffffffffff81111561229357612293614d55565b6040519080825280601f01601f1916602001820160405280156122bd576020820181803683370190505b50905061ffff80196020850160208651028101600285015b818310156122f7578051835186169085161781526020909201916002016122d5565b50939695505050505050565b5f815160010361238e575060208101517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8116601b0b60e082901d5f6123468383836142ab565b905061ffff811115612384576040517f7938075c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b9250610239915050565b81515f0361239d57505f919050565b6040517f1ac6690800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f81516002036124a757602082015160408301517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8216601b0b60e083901d5f6124168383836142ab565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8516601b0b935060e085901d925090505f61244f8484836142ab565b905060ff821180612460575060ff81115b15612497576040517f7938075c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60081b1794506102399350505050565b60028251101561239d576040517ff16066b000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f81515f1461251e576040517f9f16b02000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505f919050565b5f5b5f82600186515f1a1b1611838510161561254657600184019350612527565b509192915050565b5f8080600181878703602081116125655780612568565b60205b915050875192505b8519600184841a1b1615818310161561258e57600182019150612570565b9681019660208290036008810293841c90931b9261261057604080516020810185905201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152908290527fe47fe8b700000000000000000000000000000000000000000000000000000000825261061191600401614f96565b5095969095509350505050565b5f806126298484612c02565b909250905081611c9a5750610120830180515f93845260209384902060408051928352948201855293909401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000909316601084901b62ff00001617909317909252909160ff90911660010190565b600182810180515f928392600560ff93909316602102870192830192909101835b8183101561275d5760018301516021909301805190935f90819060ff1681806126e2838e614307565b915091508186165f03612704575f809b509b5050505050505050505050611c9a565b5f87612714600185038916614332565b016004028b015195505062ffffff90811693508416830391506127489050575060019750601c1a9550611c9a945050505050565b61275183614332565b840193505050506126b9565b505f9788975095505050505050565b81516101e08401515f80825291600190831a1b907ffffffffffffffffffffffffffffffffffffffffffffffffff0000000000000008201610e79576127b08561505a565b610100870180517ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe169052805190955060015f91821a1b9250805b8587101561299557865160015f9190911a1b935064010000260084161561281e57612817888888610c11565b96506127eb565b674000000000000000841615612842576128378761505a565b965060019050612995565b6001886101000151165f0361291357600482036128da5761022088015187037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0017f53c102422473590ce12511beab7637e1c33b596a7d58a80ea98463ad78950000176040517f8c9fdbb300000000000000000000000000000000000000000000000000000000815260040161061191815260200190565b5f6128e689898961440a565b60208581028701018190526101008b0180516001179052909850905061290b8361505a565b9250506127eb565b61022088015187037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0017f53c102422473590ce12511beab7637e1c33b596a7d58a80ea98463ad78950000175b6040517f722cd24a00000000000000000000000000000000000000000000000000000000815260040161061191815260200190565b806129eb5761022088015187037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0017f53c102422473590ce12511beab7637e1c33b596a7d58a80ea98463ad7895000017612960565b50905250919392505050565b6101c08201516002828102820101516101e08401515f9261ffff90921691906104a39083565b612a2683614432565b610100830180517ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb1660081790526020808401515f90811a8501602101805190911a60ff811492919060018101825350508115612aaf576040517f8092d1ea00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050825180516060808601515f90811a87016061018051939461ffff8616949093921a60ff81149291600886048503601c0191600181018253505f60038201537fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe30180517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00001690911790528115612b72576040517f3abd0c5e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050602090920183821b176018820185901b178083529160e0829003612bfa5760408051601083901b6020908117601f9092017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016918252810190915281517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000168117825286525b505050505050565b6101208201516101408301515f8381526020808220919384939290911c91600160ff84161b80821615612c675761ffff83165b8015612c65578360201c8503612c58576001965061ffff8460101c169550612c65565b51925061ffff8316612c35565b505b17610140909601959095525090939092509050565b6060818101515f90811a919082900361113d57602083810180515f1a600101919082815350603e8210612cdb576040517fe826b5f600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050505050565b8083835e505050565b6020810283835e505050565b5f8080612d05868686610e83565b9096509250905080612d935761022086015185037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0017f53c102422473590ce12511beab7637e1c33b596a7d58a80ea98463ad78950000175b6040517fb0e4e5b300000000000000000000000000000000000000000000000000000000815260040161061191815260200190565b5f80612d9e846144be565b6101808901511615612ddf5761016088015160101c5b8015801590612dc1575082155b15612ddd57602081015190519085149250600190910190612db4565b505b61016088015161ffff16612e05600184612df95782612dfd565b8383035b8b9190612a1d565b5081612e1557612e1588856144d5565b50949695505050505050565b6060828101515f1a908115612eb15761022084015183037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0017f53c102422473590ce12511beab7637e1c33b596a7d58a80ea98463ad78950000176040517f6fb11cdc00000000000000000000000000000000000000000000000000000000815260040161061191815260200190565b5050612ebc82614432565b61010082018051600416600890811790915260a0830151602084015160ff8083169360f89290921c9290911c1681035f819003612fe6576004856101000151165f03612f835761022085015184037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0017f53c102422473590ce12511beab7637e1c33b596a7d58a80ea98463ad78950000176040517fab1d3ea700000000000000000000000000000000000000000000000000000000815260040161061191815260200190565b90820190603e8210612fc1576040517fe826b5f600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60f882901b6020860152610200850151612fdb9084614527565b610200860152613101565b600181111561310157808310156130785761022085015184037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0017f53c102422473590ce12511beab7637e1c33b596a7d58a80ea98463ad78950000176040517f78ef278200000000000000000000000000000000000000000000000000000000815260040161061191815260200190565b808311156131015761022085015184037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0017f53c102422473590ce12511beab7637e1c33b596a7d58a80ea98463ad78950000176040517f43168e6800000000000000000000000000000000000000000000000000000000815260040161061191815260200190565b8082036001016020601083028101905b818110156132655760a08801516020848a0181015191831c61ffff16915f1a9060015b8281116132535760208406601c0361314d57925160f01c925b83516102008d015160019190911a9061316690826145ab565b6102008e01525f828514801561317c5750896001145b613187576001613189565b8b5b6102008f015190915061319c90826145f1565b6102008f0152600f8111806131b15750600f82115b15613237576102208e01518d037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0017f53c102422473590ce12511beab7637e1c33b596a7d58a80ea98463ad78950000176040517f7ea1869f00000000000000000000000000000000000000000000000000000000815260040161061191815260200190565b818160041b176001870153505060049390930192600101613134565b50506001909401935050601001613111565b5050505060081b60a0909301929092525050565b60e081015160208083015160f083811c925f9290921a60010191908390036132cd576040517fa806284100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610200850151855180515f928392909160219060101c61ffff165b80156132ff57805190925060101c61ffff166132e8565b506040518a82018051919650601c8401939160049160248901915f90811a805b8d8310156133e45760048202860195506004878a03045b8082111561335457965161ffff16601c810199509690036007613336565b506004810298899003805186529894909401938103865b60078211156133b0575160101c61ffff1680518652601c909501947ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff99091019061336b565b81156133cb575160101c61ffff168051865260048202909501945b50505060019182018051909291909101905f1a8061331f565b50505082895250600488810180517fffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9290940491909101601881901b8817939093179052601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660405260ff1094505083156134b0576040517fe972437e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6134bd6001808a1b615091565b891685891b60f06134cf8b601061501a565b901b171760e08b01526101008a0180517ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7169052604080516020601f9091017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01681815280820183525f80517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00001682178152908d52908c01819052908b0181905260608b0181905260808b0181905260a08b018190526101208b018190526101408b018190526102008b015250505050505050505050565b5f81515f036135b757505f919050565b50602001515f1a90565b5f806135cc846135a7565b60020260010190505f6135df8585614664565b949091019093016020019392505050565b5f806135fc84846135c1565b515f1a949350505050565b8082101561113d5781517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0160f882901c016138415760c08401515b801561383f5760a081901c5161016086015161ffff60e085901c1660208101805160089390931b62ffff0016600187901a1760e81b7cffffffffffffffffffffffffffffffffffffffffffffffffffffffffff909316929092179091526040517f570c7a630000000000000000000000000000000000000000000000000000000081529192915f908190819073ffffffffffffffffffffffffffffffffffffffff86169063570c7a63906136fa908790600401614f96565b5f60405180830381865afa158015613714573d5f803e3d5ffd5b505050506040513d5f823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682016040526137599190810190615130565b92509250925082156138355781516004146137a257816040517fbe2d187d0000000000000000000000000000000000000000000000000000000081526004016106119190614f96565b60208201517fffffffff00000000000000000000000000000000000000000000000000000000167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff88161789525f5b815181101561382a5761382282828151811061380b5761380b6151dd565b60200260200101518c6144d590919063ffffffff16565b6001016137ed565b50505050505061383f565b5050505050613642565b505b5081517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0160f882901c016138bb57606061ffff8260e01c1690505f6003820152600581019050806040517faedfba2f0000000000000000000000000000000000000000000000000000000081526004016106119190614f96565b50600482019150613607565b6101608101516040805161ffff8316808252602080820283019081019093529092909160109190911c90835b808211156139335760208301518252915161ffff16917fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0909101906138f3565b50505050919050565b5f80808061394b86600261501a565b9050806c7e0000007e03ff0000000000005b86821081600184515f1a1b161515161561397c5760018201915061395d565b5090979096508695509350505050565b5f8281806139a1838665200000000000612525565b925085831415836139bb81886703ff000000000000612525565b94508085036139f557507f34bd20690000000000000000000000000000000000000000000000000000000094505f9250829150613e229050565b5f80613a018a886146ba565b90925090507fffffffff00000000000000000000000000000000000000000000000000000000821615613a3f575095505f9350839250613e22915050565b86519095506540000000000060015f9290921a9190911b161515888710169150508015613cce57506001909301925f84613a8281896703ff000000000000612525565b9550808603613abd57507f7bfa48af0000000000000000000000000000000000000000000000000000000095505f9350839250613e22915050565b855b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81018051908a1160015f9290921a9190911b660100000000000016151516600103613b2c577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01613abf565b818114613b83575f80613b3f84846146ba565b90925090507fffffffff00000000000000000000000000000000000000000000000000000000821615613b7f575097505f9550859450613e229350505050565b9350505b5f831215613bbe57507f7bfa48af0000000000000000000000000000000000000000000000000000000096505f9450849350613e2292505050565b8315613bca57825f0392505b80820394505f851315613c0a57507f013b2aaa0000000000000000000000000000000000000000000000000000000096505f9450849350613e2292505050565b855f03613c1957829550613ccb565b5f8590036043811115613c5a57507f32b8b8be0000000000000000000000000000000000000000000000000000000097505f9550859450613e229350505050565b600a0a8681025f88838381613c7157613c7161502d565b0514159050601b82900b8214158180613c875750805b15613cc357507f32b8b8be000000000000000000000000000000000000000000000000000000009a505f9850889750613e229650505050505050565b505084019650505b50505b84516c2000000020000000000000000060015f9290921a9190911b161515878610168015613e135760019095019485613d0e818a65200000000000612525565b965086613d24818b6703ff000000000000612525565b9750808803613d6157507f013b2aaa0000000000000000000000000000000000000000000000000000000097505f9550859450613e229350505050565b505f80613d6e838a6146ba565b90925090507fffffffff00000000000000000000000000000000000000000000000000000000821615613dae575097505f9550859450613e229350505050565b9250508482015f83138015613dc257508581125b80613dd657505f83128015613dd657508581135b15613e0f57507fd556b1110000000000000000000000000000000000000000000000000000000097505f9550859450613e229350505050565b9450505b845f03613e1e575f93505b5050505b92959194509250565b7fffffffff0000000000000000000000000000000000000000000000000000000081161561113d576102208301515f9083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0017f53c102422473590ce12511beab7637e1c33b596a7d58a80ea98463ad78950000179050815f528060045260245ffd5b5f805f613ebc85856147e4565b9150915080610731576040517f22c9f7bb0000000000000000000000000000000000000000000000000000000081526004810186905260248101859052604401610611565b5f80806001850181806f7ffffffffffffffffffffffb0000000081807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8b8b0301602080821015613f4f5750805b875193505b84600185851a1b1615158184101615613f7257600183019250613f54565b505080602003613ffd576102208c01518b037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0017f53c102422473590ce12511beab7637e1c33b596a7d58a80ea98463ad78950000176040517f30515bda00000000000000000000000000000000000000000000000000000000815260040161061191815260200190565b85810180519095505f1a6001811b64040000000016158061401d5750858b145b156140a3576102208d015186037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0017f53c102422473590ce12511beab7637e1c33b596a7d58a80ea98463ad78950000176040517f04022fbf00000000000000000000000000000000000000000000000000000000815260040161061191815260200190565b50949b939a505060018a019850919650505050505050565b5f80601f90505f60e09050818451168082175f528060208601600183016020035e50505f519392505050565b5f60608186860361ffff81111561412d576040517fb6da789c00000000000000000000000000000000000000000000000000000000815260048101829052602401610611565b604080516041888803848101838101929092017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01690935260028281018590520181529350602284019250614183898484612ce2565b6141908783850183612ce2565b50505060c08701515b801561425a5760a081901c516040517fc6c0cbb60000000000000000000000000000000000000000000000000000000081529091905f90819073ffffffffffffffffffffffffffffffffffffffff84169063c6c0cbb6906141fe908890600401614f96565b6040805180830381865afa158015614218573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061423c919061520a565b9150915081156142525794506104a39350505050565b505050614199565b61022088015187037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0017f53c102422473590ce12511beab7637e1c33b596a7d58a80ea98463ad7895000017612d5e565b5f805f6142b98686866148ea565b91509150806142fe576040517f05e476780000000000000000000000000000000000000000000000000000000081526004810187905260248101869052604401610611565b50949350505050565b5f80825f528360205360215f2090506001815f1a1b915062ffffff8116611c9a575060019250929050565b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036143635750610100919050565b507f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f7f5555555555555555555555555555555555555555555555555555555555555555600183901c16909103600281901c7f3333333333333333333333333333333333333333333333333333333333333333908116911601600481901c01167f01010101010101010101010101010101010101010101010101010101010101010260f81c90565b5f805f805f61441a888888610e83565b925092509250821561425a579093509150611fe59050565b8051602080830180515f90811a8086016021015160a0939190831a6144845785518488018051600861ffff909316929092046020038801601e83901a840360010160100290811b909217905260f01092505b50508015612cdb576040517f5b1a42d600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f6144cb61010083615234565b6001901b92915050565b6101608201805160408051808201909152601091821c808252602082018590528351600161ffff909116019282901b92909217909252614514836144be565b6101809094018051909417909352505050565b5f61453283836145f1565b925060ff600884901c8116830190811115614579576040517fe826b5f600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff841660089190911b17905092915050565b5f60ff8316828110156145ea576040517f23b49a2a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050900390565b5f60ff808416830190600885901c811690601086901c90831115614641576040517fe826b5f600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8083111561464c5750815b601081901b600883901b841717935050505092915050565b5f61466e836135a7565b82106146aa5781836040517ffcfaeff100000000000000000000000000000000000000000000000000000000815260040161061192919061526c565b50600202016003015161ffff1690565b81515f90819065200000000000600191831a9190911b161515838510168085019082806146e78488614af1565b90925090507fffffffff00000000000000000000000000000000000000000000000000000000821615614722575093505f9250611c9a915050565b825f03614785577f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8111614756575f614778565b7f0fdc2635000000000000000000000000000000000000000000000000000000005b95509350611c9a92505050565b7f800000000000000000000000000000000000000000000000000000000000000081116147b2575f6147d4565b7f0fdc2635000000000000000000000000000000000000000000000000000000005b95505f0393505050509250929050565b5f601b83900b8314838382614848577d90e40fbeea1d3a4abc8955e946fe31cdcf66f634e100000000000000000086051561482857620186a0860595506005850194505b8586601b0b1461484357600a86059550846001019450614828565b61485e565b855f0361485e57505f925060019150611c9a9050565b848560030b146148ba575f85121561487e57505f9250829150611c9a9050565b6040517fd556b1110000000000000000000000000000000000000000000000000000000081526004810183905260248101829052604401610611565b50507bffffffffffffffffffffffffffffffffffffffffffffffffffffffff841660e084901b1791509250929050565b5f805f851215614930576040517f4a7d166b0000000000000000000000000000000000000000000000000000000081526004810186905260248101859052604401610611565b845f0361494257505f90506001611fe5565b8460ff841685018581121561498d576040517fd556b1110000000000000000000000000000000000000000000000000000000081526004810188905260248101879052604401610611565b5f805f8312156149f7577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb38312156149ce575f809550955050505050611fe5565b825f03600a0a91508184816149e5576149e561502d565b0495505084029091149150611fe59050565b5f831315614ae157604d831315614a4d576040517fc849483b000000000000000000000000000000000000000000000000000000008152600481018a90526024810189905260ff88166044820152606401610611565b82600a0a9150817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81614a8257614a8261502d565b04841115614acf576040517fc849483b000000000000000000000000000000000000000000000000000000008152600481018a90526024810189905260ff88166044820152606401610611565b5091909102925060019150611fe59050565b8360019550955050505050611fe5565b5f80828410614b2457507f34bd20690000000000000000000000000000000000000000000000000000000090505f611c9a565b835f03614b5d576040517fda6966d400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60305f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8501815b878210158015614b955750604d83105b15614bd857815160018401937fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90930192600a0a5f9190911a8590030201614b85565b878210614cfe5781515f1a8490036001811115614c2057507f0fdc26350000000000000000000000000000000000000000000000000000000095505f9450611c9a9350505050565b600a84900a8102828101831115614c6357507f0fdc26350000000000000000000000000000000000000000000000000000000096505f9550611c9a945050505050565b9190910190507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff909101905b878210614cfe5781515f1a60308114614cd357507f0fdc26350000000000000000000000000000000000000000000000000000000095505f9450611c9a9350505050565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90910190614c8f565b5f9890975095505050505050565b614d14615284565b565b5f60208284031215614d26575f80fd5b81357fffffffff0000000000000000000000000000000000000000000000000000000081168114610507575f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715614dc957614dc9614d55565b604052919050565b5f67ffffffffffffffff821115614dea57614dea614d55565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b5f60208284031215614e26575f80fd5b813567ffffffffffffffff811115614e3c575f80fd5b8201601f81018413614e4c575f80fd5b8035614e5f614e5a82614dd1565b614d82565b818152856020838501011115614e73575f80fd5b816020840160208301375f91810160200191909152949350505050565b602080825282518282018290528051604084018190525f9291820190839060608601905b80831015614eea57835173ffffffffffffffffffffffffffffffffffffffff168252928401926001929092019190840190614eb4565b509695505050505050565b5f81518084528060208401602086015e5f6020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b604081525f614f536040830185614ef5565b8281036020848101919091528451808352858201928201905f5b81811015614f8957845183529383019391830191600101614f6d565b5090979650505050505050565b602081525f6105076020830184614ef5565b80516020808301519190811015614fe7577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8160200360031b1b821691505b50919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b8082018082111561018057610180614fed565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361508a5761508a614fed565b5060010190565b8181038181111561018057610180614fed565b80518015158114610239575f80fd5b5f82601f8301126150c2575f80fd5b8151602067ffffffffffffffff8211156150de576150de614d55565b8160051b6150ed828201614d82565b9283528481018201928281019087851115615106575f80fd5b83870192505b848310156151255782518252918301919083019061510c565b979650505050505050565b5f805f60608486031215615142575f80fd5b61514b846150a4565b9250602084015167ffffffffffffffff80821115615167575f80fd5b818601915086601f83011261517a575f80fd5b8151615188614e5a82614dd1565b81815288602083860101111561519c575f80fd5b8160208501602083015e5f60208383010152809550505060408601519150808211156151c6575f80fd5b506151d3868287016150b3565b9150509250925092565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f806040838503121561521b575f80fd5b615224836150a4565b9150602083015190509250929050565b5f82615267577f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b500690565b828152604060208201525f610c4d6040830184614ef5565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52605160045260245ffdfe0288400100420b0280046b0641220186adb8a044003012020f2a881521281ac8811a000000000000000000080000000000100000000000000002000000000000000000290ea98a3a10f9c53927bda61c6395ad0e9fb4a8075dbeaf2d313e9e09b06d681dfe49062ce21ac13f83a6cc2ad2d2123422c3e0052f369e1f27267220a0a68d2f3576963b82189e475d217b131120880f24f4a8242f1af54041f7290afa3e8638acf3d13397e9fd00443a453c406bb548b9059d25a3cd1e11d0c3260b15eb4d16fc94274527bc412baf2cc2321b8f630dca9efe413ce35f1400684846c291e3435d68b13e5f9a151eb98c15239cd9c10c1f698235c8d3843d08d579273459d41a2c9ff617a5b2cd15c0031810f621af127ba34c26bb6c4137b2ad3d1b73563d0210215f36aa563921098e690457fb180376e752066a470128f11de101fcc60522de7ddd183d3d6d4296c37031cba2872e7b3af5304eee7219a8093544082b5f0801f5a523032303230323cf24e324e323cf23cf24e323032303230324e324e324e324e324e324e324e324e324e324e324e324e324e324e324e324e324e324e324e324e324e324e324e324e324e324e324e324e324e324e324e324e324e324e324e324e324e324e324e324e324e324e324e324e324e324e324e324e324e324e324e324e324e324e324e324e324e324e324e324e324e3" } } From 0595bdef4867fc32e6e83cd4be5a764ad119387b Mon Sep 17 00:00:00 2001 From: David Meister Date: Tue, 16 Jun 2026 15:17:03 +0000 Subject: [PATCH 3/4] ci: retrigger after rainix LICENSE-symlink fix landed on main The prior red was transient: CI staged rainix@main during the ~3.5h window when rainix main HEAD (c54864d1) had the dangling LICENSE symlink that broke GitHub action-staging. That is now fixed on rainix main (LICENSE -> LICENSES/ LicenseRef-DCL-1.0.txt); this retriggers CI to pick it up. Co-Authored-By: Claude Opus 4.8 From 776cb72a998442da04556579f1d8679fedb48fa6 Mon Sep 17 00:00:00 2001 From: David Meister Date: Mon, 15 Jun 2026 17:36:18 +0000 Subject: [PATCH 4/4] [3b-attempt] test: one contract per file (fix pre-existing static violation) --- .../BaseRainlangExtern.construction.t.sol | 48 +------- .../abstract/BaseRainlangExtern.ierc165.t.sol | 23 +--- ...eRainlangExtern.integrityOpcodeRange.t.sol | 21 +--- .../BaseRainlangSubParser.ierc165.t.sol | 22 +--- ...seRainlangSubParser.subParseLiteral2.t.sol | 102 +--------------- .../BaseRainlangSubParser.subParseWord2.t.sol | 110 +----------------- test/src/abstract/ChildRainlangExtern.sol | 26 +++++ test/src/abstract/ChildRainlangSubParser.sol | 25 ++++ test/src/abstract/EmptyPointersExtern.sol | 16 +++ .../abstract/EmptyWordParsersSubParser.sol | 57 +++++++++ .../abstract/HappyPathLiteralSubParser.sol | 53 +++++++++ .../MismatchedExternMoreIntegrity.sol | 16 +++ .../abstract/MismatchedExternMoreOpcodes.sol | 16 +++ .../abstract/MismatchedLiteralSubParser.sol | 35 ++++++ test/src/abstract/MismatchedWordSubParser.sol | 59 ++++++++++ test/src/abstract/NoMatchLiteralSubParser.sol | 24 ++++ test/src/abstract/TestableExtern.sol | 16 +++ test/src/abstract/TwoOpExtern.sol | 24 ++++ .../concrete/MockExternBadLiteralIndex.sol | 14 +++ test/src/concrete/ModifierTestParser.sol | 23 ++++ ...langInterpreter.zeroFunctionPointers.t.sol | 7 +- .../RainlangParser.parseMemoryOverflow.t.sol | 20 +--- ...enceExtern.subParserIndexOutOfBounds.t.sol | 11 +- .../concrete/ZeroFPRainlangInterpreter.sol | 12 ++ test/src/lib/integrity/IntegrityHighwater.sol | 45 +++++++ test/src/lib/integrity/IntegritySingleOp.sol | 40 +++++++ .../src/lib/integrity/LibIntegrityCheck.t.sol | 77 +----------- test/src/lib/parse/BadLengthSubParser.sol | 28 +++++ .../lib/parse/ConstantReturningSubParser.sol | 46 ++++++++ .../lib/parse/ContextReturningSubParser.sol | 32 +++++ .../LibSubParse.badSubParserResult.t.sol | 25 +--- .../LibSubParse.constantAccumulation.t.sol | 81 +------------ .../lib/parse/LibSubParse.subParseWords.t.sol | 27 +---- test/src/lib/parse/MultiConstantSubParser.sol | 45 +++++++ .../LibInterpreterStateDataContract.t.sol | 46 +------- .../LibInterpreterStateDataContractExtern.sol | 54 +++++++++ 36 files changed, 730 insertions(+), 596 deletions(-) create mode 100644 test/src/abstract/ChildRainlangExtern.sol create mode 100644 test/src/abstract/ChildRainlangSubParser.sol create mode 100644 test/src/abstract/EmptyPointersExtern.sol create mode 100644 test/src/abstract/EmptyWordParsersSubParser.sol create mode 100644 test/src/abstract/HappyPathLiteralSubParser.sol create mode 100644 test/src/abstract/MismatchedExternMoreIntegrity.sol create mode 100644 test/src/abstract/MismatchedExternMoreOpcodes.sol create mode 100644 test/src/abstract/MismatchedLiteralSubParser.sol create mode 100644 test/src/abstract/MismatchedWordSubParser.sol create mode 100644 test/src/abstract/NoMatchLiteralSubParser.sol create mode 100644 test/src/abstract/TestableExtern.sol create mode 100644 test/src/abstract/TwoOpExtern.sol create mode 100644 test/src/concrete/MockExternBadLiteralIndex.sol create mode 100644 test/src/concrete/ModifierTestParser.sol create mode 100644 test/src/concrete/ZeroFPRainlangInterpreter.sol create mode 100644 test/src/lib/integrity/IntegrityHighwater.sol create mode 100644 test/src/lib/integrity/IntegritySingleOp.sol create mode 100644 test/src/lib/parse/BadLengthSubParser.sol create mode 100644 test/src/lib/parse/ConstantReturningSubParser.sol create mode 100644 test/src/lib/parse/ContextReturningSubParser.sol create mode 100644 test/src/lib/parse/MultiConstantSubParser.sol create mode 100644 test/src/lib/state/LibInterpreterStateDataContractExtern.sol diff --git a/test/src/abstract/BaseRainlangExtern.construction.t.sol b/test/src/abstract/BaseRainlangExtern.construction.t.sol index 9eff8b5d5..76ac4850a 100644 --- a/test/src/abstract/BaseRainlangExtern.construction.t.sol +++ b/test/src/abstract/BaseRainlangExtern.construction.t.sol @@ -3,52 +3,10 @@ pragma solidity =0.8.25; import {Test} from "forge-std-1.16.1/src/Test.sol"; -import {BaseRainlangExtern} from "../../../src/abstract/BaseRainlangExtern.sol"; import {ExternPointersMismatch, ExternOpcodePointersEmpty} from "../../../src/error/ErrExtern.sol"; - -/// @dev Shared base that exposes the internal pointer functions externally. -abstract contract TestableExtern is BaseRainlangExtern { - function buildIntegrityFunctionPointers() external pure returns (bytes memory) { - return integrityFunctionPointers(); - } - - function buildOpcodeFunctionPointers() external view returns (bytes memory) { - return opcodeFunctionPointers(); - } -} - -/// @dev Extern with empty opcode and integrity pointers. -contract EmptyPointersExtern is TestableExtern { - function opcodeFunctionPointers() internal pure override returns (bytes memory) { - return hex""; - } - - function integrityFunctionPointers() internal pure override returns (bytes memory) { - return hex""; - } -} - -/// @dev Extern with 2 opcode pointers but 1 integrity pointer. -contract MismatchedExternMoreOpcodes is TestableExtern { - function opcodeFunctionPointers() internal pure override returns (bytes memory) { - return hex"00010002"; - } - - function integrityFunctionPointers() internal pure override returns (bytes memory) { - return hex"0001"; - } -} - -/// @dev Extern with 1 opcode pointer but 2 integrity pointers. -contract MismatchedExternMoreIntegrity is TestableExtern { - function opcodeFunctionPointers() internal pure override returns (bytes memory) { - return hex"0001"; - } - - function integrityFunctionPointers() internal pure override returns (bytes memory) { - return hex"00010002"; - } -} +import {EmptyPointersExtern} from "./EmptyPointersExtern.sol"; +import {MismatchedExternMoreOpcodes} from "./MismatchedExternMoreOpcodes.sol"; +import {MismatchedExternMoreIntegrity} from "./MismatchedExternMoreIntegrity.sol"; /// @title BaseRainlangExternConstructionTest /// @notice Tests construction invariants for BaseRainlangExtern. diff --git a/test/src/abstract/BaseRainlangExtern.ierc165.t.sol b/test/src/abstract/BaseRainlangExtern.ierc165.t.sol index 8ac8fed72..921793dc8 100644 --- a/test/src/abstract/BaseRainlangExtern.ierc165.t.sol +++ b/test/src/abstract/BaseRainlangExtern.ierc165.t.sol @@ -5,30 +5,9 @@ pragma solidity =0.8.25; import {Test} from "forge-std-1.16.1/src/Test.sol"; import {IERC165} from "@openzeppelin-contracts-5.6.1/utils/introspection/IERC165.sol"; import {IInterpreterExternV4} from "rain-interpreter-interface-0.1.0/src/interface/IInterpreterExternV4.sol"; -import {BaseRainlangExtern} from "../../../src/abstract/BaseRainlangExtern.sol"; import {IIntegrityToolingV1} from "rain-sol-codegen-0.1.0/src/interface/IIntegrityToolingV1.sol"; import {IOpcodeToolingV1} from "rain-sol-codegen-0.1.0/src/interface/IOpcodeToolingV1.sol"; - -/// @dev We need a contract that is deployable in order to test the abstract -/// base contract. Must override the function pointer virtuals to return -/// non-empty, equal-length bytes so the constructor validation passes. -contract ChildRainlangExtern is BaseRainlangExtern { - function opcodeFunctionPointers() internal pure override returns (bytes memory) { - return hex"0000"; - } - - function integrityFunctionPointers() internal pure override returns (bytes memory) { - return hex"0000"; - } - - function buildIntegrityFunctionPointers() external pure returns (bytes memory) { - return integrityFunctionPointers(); - } - - function buildOpcodeFunctionPointers() external pure returns (bytes memory) { - return opcodeFunctionPointers(); - } -} +import {ChildRainlangExtern} from "./ChildRainlangExtern.sol"; /// @title BaseRainlangExternTest /// @notice Test suite for BaseRainlangExtern. diff --git a/test/src/abstract/BaseRainlangExtern.integrityOpcodeRange.t.sol b/test/src/abstract/BaseRainlangExtern.integrityOpcodeRange.t.sol index 92e08b449..41fb685b6 100644 --- a/test/src/abstract/BaseRainlangExtern.integrityOpcodeRange.t.sol +++ b/test/src/abstract/BaseRainlangExtern.integrityOpcodeRange.t.sol @@ -3,28 +3,9 @@ pragma solidity =0.8.25; import {Test} from "forge-std-1.16.1/src/Test.sol"; -import {BaseRainlangExtern} from "../../../src/abstract/BaseRainlangExtern.sol"; import {ExternDispatchV2} from "rain-interpreter-interface-0.1.0/src/interface/IInterpreterExternV4.sol"; import {ExternOpcodeOutOfRange} from "../../../src/error/ErrExtern.sol"; - -/// @dev Extern with exactly 2 opcode and integrity pointers. -contract TwoOpExtern is BaseRainlangExtern { - function opcodeFunctionPointers() internal pure override returns (bytes memory) { - return hex"00010002"; - } - - function integrityFunctionPointers() internal pure override returns (bytes memory) { - return hex"00010002"; - } - - function buildIntegrityFunctionPointers() external pure returns (bytes memory) { - return integrityFunctionPointers(); - } - - function buildOpcodeFunctionPointers() external pure returns (bytes memory) { - return opcodeFunctionPointers(); - } -} +import {TwoOpExtern} from "./TwoOpExtern.sol"; /// @title BaseRainlangExternIntegrityOpcodeRangeTest /// @notice Tests that externIntegrity reverts for out-of-range opcodes. diff --git a/test/src/abstract/BaseRainlangSubParser.ierc165.t.sol b/test/src/abstract/BaseRainlangSubParser.ierc165.t.sol index a17681e37..2cfc3f9a3 100644 --- a/test/src/abstract/BaseRainlangSubParser.ierc165.t.sol +++ b/test/src/abstract/BaseRainlangSubParser.ierc165.t.sol @@ -5,30 +5,10 @@ pragma solidity =0.8.25; import {Test} from "forge-std-1.16.1/src/Test.sol"; import {IERC165} from "@openzeppelin-contracts-5.6.1/utils/introspection/IERC165.sol"; import {ISubParserV4} from "rain-interpreter-interface-0.1.0/src/interface/ISubParserV4.sol"; -import {BaseRainlangSubParser} from "../../../src/abstract/BaseRainlangSubParser.sol"; import {IDescribedByMetaV1} from "rain-metadata-0.1.0/src/interface/IDescribedByMetaV1.sol"; import {IParserToolingV1} from "rain-sol-codegen-0.1.0/src/interface/IParserToolingV1.sol"; import {ISubParserToolingV1} from "rain-sol-codegen-0.1.0/src/interface/ISubParserToolingV1.sol"; - -/// @dev We need a contract that is deployable in order to test the abstract -/// base contract. -contract ChildRainlangSubParser is BaseRainlangSubParser { - function describedByMetaV1() external pure override returns (bytes32) { - return 0; - } - - function buildLiteralParserFunctionPointers() external pure returns (bytes memory) { - return new bytes(0); - } - - function buildOperandHandlerFunctionPointers() external pure returns (bytes memory) { - return new bytes(0); - } - - function buildSubParserWordParsers() external pure returns (bytes memory) { - return new bytes(0); - } -} +import {ChildRainlangSubParser} from "./ChildRainlangSubParser.sol"; /// @title BaseRainlangSubParserTest /// @notice Test suite for BaseRainlangSubParser. diff --git a/test/src/abstract/BaseRainlangSubParser.subParseLiteral2.t.sol b/test/src/abstract/BaseRainlangSubParser.subParseLiteral2.t.sol index 183636537..c943c35f5 100644 --- a/test/src/abstract/BaseRainlangSubParser.subParseLiteral2.t.sol +++ b/test/src/abstract/BaseRainlangSubParser.subParseLiteral2.t.sol @@ -3,104 +3,10 @@ pragma solidity =0.8.25; import {Test} from "forge-std-1.16.1/src/Test.sol"; -import {BaseRainlangSubParser, SubParserIndexOutOfBounds} from "../../../src/abstract/BaseRainlangSubParser.sol"; -import {LibConvert} from "rain-lib-typecast-0.1.0/src/LibConvert.sol"; - -/// @dev Simple literal parser that returns the dispatch value unchanged. -function echoLiteralParser(bytes32 dispatchValue, uint256, uint256) pure returns (bytes32) { - return dispatchValue; -} - -/// @dev Sub parser where matchSubParseLiteralDispatch always succeeds at -/// index 0, returning a known dispatch value. subParserLiteralParsers has a -/// single valid function pointer to echoLiteralParser. -contract HappyPathLiteralSubParser is BaseRainlangSubParser { - function matchSubParseLiteralDispatch(uint256, uint256) internal pure override returns (bool, uint256, bytes32) { - return (true, 0, bytes32(uint256(0x42))); - } - - function subParserLiteralParsers() internal pure override returns (bytes memory) { - unchecked { - function(bytes32, uint256, uint256) internal pure returns (bytes32) lengthPointer; - uint256 length = 1; - assembly ("memory-safe") { - lengthPointer := length - } - function(bytes32, uint256, uint256) internal pure returns (bytes32)[2] memory parsersFixed = - [lengthPointer, echoLiteralParser]; - uint256[] memory parsersDynamic; - assembly ("memory-safe") { - parsersDynamic := parsersFixed - } - return LibConvert.unsafeTo16BitBytes(parsersDynamic); - } - } - - function describedByMetaV1() external pure override returns (bytes32) { - return bytes32(0); - } - - function buildLiteralParserFunctionPointers() external pure returns (bytes memory) { - return ""; - } - - function buildOperandHandlerFunctionPointers() external pure returns (bytes memory) { - return ""; - } - - function buildSubParserWordParsers() external pure returns (bytes memory) { - return ""; - } -} - -/// @dev Sub parser using default matchSubParseLiteralDispatch (returns false). -contract NoMatchLiteralSubParser is BaseRainlangSubParser { - function describedByMetaV1() external pure override returns (bytes32) { - return bytes32(0); - } - - function buildLiteralParserFunctionPointers() external pure returns (bytes memory) { - return ""; - } - - function buildOperandHandlerFunctionPointers() external pure returns (bytes memory) { - return ""; - } - - function buildSubParserWordParsers() external pure returns (bytes memory) { - return ""; - } -} - -/// @dev Sub parser where matchSubParseLiteralDispatch always succeeds with -/// index 1, but subParserLiteralParsers returns only 1 pointer (2 bytes). -/// This triggers SubParserIndexOutOfBounds(1, 1) in subParseLiteral2. -contract MismatchedLiteralSubParser is BaseRainlangSubParser { - function matchSubParseLiteralDispatch(uint256, uint256) internal pure override returns (bool, uint256, bytes32) { - return (true, 1, bytes32(0)); - } - - function subParserLiteralParsers() internal pure override returns (bytes memory) { - // 1 pointer = 2 bytes, so parsersLength = 1. Index 1 is out of range. - return hex"0001"; - } - - function describedByMetaV1() external pure override returns (bytes32) { - return bytes32(0); - } - - function buildLiteralParserFunctionPointers() external pure returns (bytes memory) { - return ""; - } - - function buildOperandHandlerFunctionPointers() external pure returns (bytes memory) { - return ""; - } - - function buildSubParserWordParsers() external pure returns (bytes memory) { - return ""; - } -} +import {SubParserIndexOutOfBounds} from "../../../src/abstract/BaseRainlangSubParser.sol"; +import {HappyPathLiteralSubParser} from "./HappyPathLiteralSubParser.sol"; +import {NoMatchLiteralSubParser} from "./NoMatchLiteralSubParser.sol"; +import {MismatchedLiteralSubParser} from "./MismatchedLiteralSubParser.sol"; /// @title BaseRainlangSubParserLiteral2Test /// @notice Direct unit tests for subParseLiteral2: happy path, no-match, and diff --git a/test/src/abstract/BaseRainlangSubParser.subParseWord2.t.sol b/test/src/abstract/BaseRainlangSubParser.subParseWord2.t.sol index dd44e1cbc..7d0e46d08 100644 --- a/test/src/abstract/BaseRainlangSubParser.subParseWord2.t.sol +++ b/test/src/abstract/BaseRainlangSubParser.subParseWord2.t.sol @@ -3,113 +3,9 @@ pragma solidity =0.8.25; import {Test} from "forge-std-1.16.1/src/Test.sol"; -import { - BaseRainlangSubParser, - SubParserIndexOutOfBounds, - AuthoringMetaV2 -} from "../../../src/abstract/BaseRainlangSubParser.sol"; -import {LibGenParseMeta} from "rain-interpreter-interface-0.1.0/src/lib/codegen/LibGenParseMeta.sol"; -import {LibParseOperand} from "../../../src/lib/parse/LibParseOperand.sol"; -import {LibConvert} from "rain-lib-typecast-0.1.0/src/LibConvert.sol"; -import {OperandV2} from "rain-interpreter-interface-0.1.0/src/interface/IInterpreterV4.sol"; - -/// @dev Sub parser with 2 words in meta but only 1 word parser pointer. -/// Looking up the word at index 1 triggers SubParserIndexOutOfBounds. -contract MismatchedWordSubParser is BaseRainlangSubParser { - function subParserParseMeta() internal pure override returns (bytes memory) { - AuthoringMetaV2[] memory meta = new AuthoringMetaV2[](2); - meta[0] = AuthoringMetaV2("aaa", ""); - meta[1] = AuthoringMetaV2("bbb", ""); - return LibGenParseMeta.buildParseMetaV2(meta, 2); - } - - function subParserOperandHandlers() internal pure override returns (bytes memory) { - unchecked { - function(bytes32[] memory) internal pure returns (OperandV2) lengthPointer; - uint256 length = 2; - assembly ("memory-safe") { - lengthPointer := length - } - function(bytes32[] memory) internal pure returns (OperandV2)[3] memory handlersFixed = - [lengthPointer, LibParseOperand.handleOperandDisallowed, LibParseOperand.handleOperandDisallowed]; - uint256[] memory handlersDynamic; - assembly ("memory-safe") { - handlersDynamic := handlersFixed - } - return LibConvert.unsafeTo16BitBytes(handlersDynamic); - } - } - - function subParserWordParsers() internal pure override returns (bytes memory) { - // Only 1 word parser pointer (2 bytes), so parsersLength = 1. - // Any index >= 1 is out of range. - return hex"0001"; - } - - function describedByMetaV1() external pure override returns (bytes32) { - return bytes32(0); - } - - function buildLiteralParserFunctionPointers() external pure returns (bytes memory) { - return ""; - } - - function buildOperandHandlerFunctionPointers() external pure returns (bytes memory) { - return ""; - } - - function buildSubParserWordParsers() external pure returns (bytes memory) { - return ""; - } -} - -/// @dev Sub parser with 1 word in meta but zero word parser pointers. -/// Looking up the word at index 0 triggers SubParserIndexOutOfBounds(0, 0). -contract EmptyWordParsersSubParser is BaseRainlangSubParser { - function subParserParseMeta() internal pure override returns (bytes memory) { - AuthoringMetaV2[] memory meta = new AuthoringMetaV2[](1); - meta[0] = AuthoringMetaV2("aaa", ""); - return LibGenParseMeta.buildParseMetaV2(meta, 1); - } - - function subParserOperandHandlers() internal pure override returns (bytes memory) { - unchecked { - function(bytes32[] memory) internal pure returns (OperandV2) lengthPointer; - uint256 length = 1; - assembly ("memory-safe") { - lengthPointer := length - } - function(bytes32[] memory) internal pure returns (OperandV2)[2] memory handlersFixed = - [lengthPointer, LibParseOperand.handleOperandDisallowed]; - uint256[] memory handlersDynamic; - assembly ("memory-safe") { - handlersDynamic := handlersFixed - } - return LibConvert.unsafeTo16BitBytes(handlersDynamic); - } - } - - function subParserWordParsers() internal pure override returns (bytes memory) { - // Empty — parsersLength = 0. - return ""; - } - - function describedByMetaV1() external pure override returns (bytes32) { - return bytes32(0); - } - - function buildLiteralParserFunctionPointers() external pure returns (bytes memory) { - return ""; - } - - function buildOperandHandlerFunctionPointers() external pure returns (bytes memory) { - return ""; - } - - function buildSubParserWordParsers() external pure returns (bytes memory) { - return ""; - } -} +import {SubParserIndexOutOfBounds} from "../../../src/abstract/BaseRainlangSubParser.sol"; +import {MismatchedWordSubParser} from "./MismatchedWordSubParser.sol"; +import {EmptyWordParsersSubParser} from "./EmptyWordParsersSubParser.sol"; /// @title BaseRainlangSubParserWord2Test /// @notice Direct unit tests for subParseWord2. diff --git a/test/src/abstract/ChildRainlangExtern.sol b/test/src/abstract/ChildRainlangExtern.sol new file mode 100644 index 000000000..00708d257 --- /dev/null +++ b/test/src/abstract/ChildRainlangExtern.sol @@ -0,0 +1,26 @@ +// SPDX-License-Identifier: LicenseRef-DCL-1.0 +// SPDX-FileCopyrightText: Copyright (c) 2020 Rain Open Source Software Ltd +pragma solidity =0.8.25; + +import {BaseRainlangExtern} from "../../../src/abstract/BaseRainlangExtern.sol"; + +/// @dev We need a contract that is deployable in order to test the abstract +/// base contract. Must override the function pointer virtuals to return +/// non-empty, equal-length bytes so the constructor validation passes. +contract ChildRainlangExtern is BaseRainlangExtern { + function opcodeFunctionPointers() internal pure override returns (bytes memory) { + return hex"0000"; + } + + function integrityFunctionPointers() internal pure override returns (bytes memory) { + return hex"0000"; + } + + function buildIntegrityFunctionPointers() external pure returns (bytes memory) { + return integrityFunctionPointers(); + } + + function buildOpcodeFunctionPointers() external pure returns (bytes memory) { + return opcodeFunctionPointers(); + } +} diff --git a/test/src/abstract/ChildRainlangSubParser.sol b/test/src/abstract/ChildRainlangSubParser.sol new file mode 100644 index 000000000..4a806eed2 --- /dev/null +++ b/test/src/abstract/ChildRainlangSubParser.sol @@ -0,0 +1,25 @@ +// SPDX-License-Identifier: LicenseRef-DCL-1.0 +// SPDX-FileCopyrightText: Copyright (c) 2020 Rain Open Source Software Ltd +pragma solidity =0.8.25; + +import {BaseRainlangSubParser} from "../../../src/abstract/BaseRainlangSubParser.sol"; + +/// @dev We need a contract that is deployable in order to test the abstract +/// base contract. +contract ChildRainlangSubParser is BaseRainlangSubParser { + function describedByMetaV1() external pure override returns (bytes32) { + return 0; + } + + function buildLiteralParserFunctionPointers() external pure returns (bytes memory) { + return new bytes(0); + } + + function buildOperandHandlerFunctionPointers() external pure returns (bytes memory) { + return new bytes(0); + } + + function buildSubParserWordParsers() external pure returns (bytes memory) { + return new bytes(0); + } +} diff --git a/test/src/abstract/EmptyPointersExtern.sol b/test/src/abstract/EmptyPointersExtern.sol new file mode 100644 index 000000000..975896cef --- /dev/null +++ b/test/src/abstract/EmptyPointersExtern.sol @@ -0,0 +1,16 @@ +// SPDX-License-Identifier: LicenseRef-DCL-1.0 +// SPDX-FileCopyrightText: Copyright (c) 2020 Rain Open Source Software Ltd +pragma solidity =0.8.25; + +import {TestableExtern} from "./TestableExtern.sol"; + +/// @dev Extern with empty opcode and integrity pointers. +contract EmptyPointersExtern is TestableExtern { + function opcodeFunctionPointers() internal pure override returns (bytes memory) { + return hex""; + } + + function integrityFunctionPointers() internal pure override returns (bytes memory) { + return hex""; + } +} diff --git a/test/src/abstract/EmptyWordParsersSubParser.sol b/test/src/abstract/EmptyWordParsersSubParser.sol new file mode 100644 index 000000000..0f63dcd90 --- /dev/null +++ b/test/src/abstract/EmptyWordParsersSubParser.sol @@ -0,0 +1,57 @@ +// SPDX-License-Identifier: LicenseRef-DCL-1.0 +// SPDX-FileCopyrightText: Copyright (c) 2020 Rain Open Source Software Ltd +pragma solidity =0.8.25; + +import {BaseRainlangSubParser, AuthoringMetaV2} from "../../../src/abstract/BaseRainlangSubParser.sol"; +import {LibGenParseMeta} from "rain-interpreter-interface-0.1.0/src/lib/codegen/LibGenParseMeta.sol"; +import {LibParseOperand} from "../../../src/lib/parse/LibParseOperand.sol"; +import {LibConvert} from "rain-lib-typecast-0.1.0/src/LibConvert.sol"; +import {OperandV2} from "rain-interpreter-interface-0.1.0/src/interface/IInterpreterV4.sol"; + +/// @dev Sub parser with 1 word in meta but zero word parser pointers. +/// Looking up the word at index 0 triggers SubParserIndexOutOfBounds(0, 0). +contract EmptyWordParsersSubParser is BaseRainlangSubParser { + function subParserParseMeta() internal pure override returns (bytes memory) { + AuthoringMetaV2[] memory meta = new AuthoringMetaV2[](1); + meta[0] = AuthoringMetaV2("aaa", ""); + return LibGenParseMeta.buildParseMetaV2(meta, 1); + } + + function subParserOperandHandlers() internal pure override returns (bytes memory) { + unchecked { + function(bytes32[] memory) internal pure returns (OperandV2) lengthPointer; + uint256 length = 1; + assembly ("memory-safe") { + lengthPointer := length + } + function(bytes32[] memory) internal pure returns (OperandV2)[2] memory handlersFixed = + [lengthPointer, LibParseOperand.handleOperandDisallowed]; + uint256[] memory handlersDynamic; + assembly ("memory-safe") { + handlersDynamic := handlersFixed + } + return LibConvert.unsafeTo16BitBytes(handlersDynamic); + } + } + + function subParserWordParsers() internal pure override returns (bytes memory) { + // Empty — parsersLength = 0. + return ""; + } + + function describedByMetaV1() external pure override returns (bytes32) { + return bytes32(0); + } + + function buildLiteralParserFunctionPointers() external pure returns (bytes memory) { + return ""; + } + + function buildOperandHandlerFunctionPointers() external pure returns (bytes memory) { + return ""; + } + + function buildSubParserWordParsers() external pure returns (bytes memory) { + return ""; + } +} diff --git a/test/src/abstract/HappyPathLiteralSubParser.sol b/test/src/abstract/HappyPathLiteralSubParser.sol new file mode 100644 index 000000000..f82d6dafa --- /dev/null +++ b/test/src/abstract/HappyPathLiteralSubParser.sol @@ -0,0 +1,53 @@ +// SPDX-License-Identifier: LicenseRef-DCL-1.0 +// SPDX-FileCopyrightText: Copyright (c) 2020 Rain Open Source Software Ltd +pragma solidity =0.8.25; + +import {BaseRainlangSubParser} from "../../../src/abstract/BaseRainlangSubParser.sol"; +import {LibConvert} from "rain-lib-typecast-0.1.0/src/LibConvert.sol"; + +/// @dev Simple literal parser that returns the dispatch value unchanged. +function echoLiteralParser(bytes32 dispatchValue, uint256, uint256) pure returns (bytes32) { + return dispatchValue; +} + +/// @dev Sub parser where matchSubParseLiteralDispatch always succeeds at +/// index 0, returning a known dispatch value. subParserLiteralParsers has a +/// single valid function pointer to echoLiteralParser. +contract HappyPathLiteralSubParser is BaseRainlangSubParser { + function matchSubParseLiteralDispatch(uint256, uint256) internal pure override returns (bool, uint256, bytes32) { + return (true, 0, bytes32(uint256(0x42))); + } + + function subParserLiteralParsers() internal pure override returns (bytes memory) { + unchecked { + function(bytes32, uint256, uint256) internal pure returns (bytes32) lengthPointer; + uint256 length = 1; + assembly ("memory-safe") { + lengthPointer := length + } + function(bytes32, uint256, uint256) internal pure returns (bytes32)[2] memory parsersFixed = + [lengthPointer, echoLiteralParser]; + uint256[] memory parsersDynamic; + assembly ("memory-safe") { + parsersDynamic := parsersFixed + } + return LibConvert.unsafeTo16BitBytes(parsersDynamic); + } + } + + function describedByMetaV1() external pure override returns (bytes32) { + return bytes32(0); + } + + function buildLiteralParserFunctionPointers() external pure returns (bytes memory) { + return ""; + } + + function buildOperandHandlerFunctionPointers() external pure returns (bytes memory) { + return ""; + } + + function buildSubParserWordParsers() external pure returns (bytes memory) { + return ""; + } +} diff --git a/test/src/abstract/MismatchedExternMoreIntegrity.sol b/test/src/abstract/MismatchedExternMoreIntegrity.sol new file mode 100644 index 000000000..aa502ea49 --- /dev/null +++ b/test/src/abstract/MismatchedExternMoreIntegrity.sol @@ -0,0 +1,16 @@ +// SPDX-License-Identifier: LicenseRef-DCL-1.0 +// SPDX-FileCopyrightText: Copyright (c) 2020 Rain Open Source Software Ltd +pragma solidity =0.8.25; + +import {TestableExtern} from "./TestableExtern.sol"; + +/// @dev Extern with 1 opcode pointer but 2 integrity pointers. +contract MismatchedExternMoreIntegrity is TestableExtern { + function opcodeFunctionPointers() internal pure override returns (bytes memory) { + return hex"0001"; + } + + function integrityFunctionPointers() internal pure override returns (bytes memory) { + return hex"00010002"; + } +} diff --git a/test/src/abstract/MismatchedExternMoreOpcodes.sol b/test/src/abstract/MismatchedExternMoreOpcodes.sol new file mode 100644 index 000000000..49893f6f9 --- /dev/null +++ b/test/src/abstract/MismatchedExternMoreOpcodes.sol @@ -0,0 +1,16 @@ +// SPDX-License-Identifier: LicenseRef-DCL-1.0 +// SPDX-FileCopyrightText: Copyright (c) 2020 Rain Open Source Software Ltd +pragma solidity =0.8.25; + +import {TestableExtern} from "./TestableExtern.sol"; + +/// @dev Extern with 2 opcode pointers but 1 integrity pointer. +contract MismatchedExternMoreOpcodes is TestableExtern { + function opcodeFunctionPointers() internal pure override returns (bytes memory) { + return hex"00010002"; + } + + function integrityFunctionPointers() internal pure override returns (bytes memory) { + return hex"0001"; + } +} diff --git a/test/src/abstract/MismatchedLiteralSubParser.sol b/test/src/abstract/MismatchedLiteralSubParser.sol new file mode 100644 index 000000000..7242e1cf6 --- /dev/null +++ b/test/src/abstract/MismatchedLiteralSubParser.sol @@ -0,0 +1,35 @@ +// SPDX-License-Identifier: LicenseRef-DCL-1.0 +// SPDX-FileCopyrightText: Copyright (c) 2020 Rain Open Source Software Ltd +pragma solidity =0.8.25; + +import {BaseRainlangSubParser} from "../../../src/abstract/BaseRainlangSubParser.sol"; + +/// @dev Sub parser where matchSubParseLiteralDispatch always succeeds with +/// index 1, but subParserLiteralParsers returns only 1 pointer (2 bytes). +/// This triggers SubParserIndexOutOfBounds(1, 1) in subParseLiteral2. +contract MismatchedLiteralSubParser is BaseRainlangSubParser { + function matchSubParseLiteralDispatch(uint256, uint256) internal pure override returns (bool, uint256, bytes32) { + return (true, 1, bytes32(0)); + } + + function subParserLiteralParsers() internal pure override returns (bytes memory) { + // 1 pointer = 2 bytes, so parsersLength = 1. Index 1 is out of range. + return hex"0001"; + } + + function describedByMetaV1() external pure override returns (bytes32) { + return bytes32(0); + } + + function buildLiteralParserFunctionPointers() external pure returns (bytes memory) { + return ""; + } + + function buildOperandHandlerFunctionPointers() external pure returns (bytes memory) { + return ""; + } + + function buildSubParserWordParsers() external pure returns (bytes memory) { + return ""; + } +} diff --git a/test/src/abstract/MismatchedWordSubParser.sol b/test/src/abstract/MismatchedWordSubParser.sol new file mode 100644 index 000000000..4b2f36d79 --- /dev/null +++ b/test/src/abstract/MismatchedWordSubParser.sol @@ -0,0 +1,59 @@ +// SPDX-License-Identifier: LicenseRef-DCL-1.0 +// SPDX-FileCopyrightText: Copyright (c) 2020 Rain Open Source Software Ltd +pragma solidity =0.8.25; + +import {BaseRainlangSubParser, AuthoringMetaV2} from "../../../src/abstract/BaseRainlangSubParser.sol"; +import {LibGenParseMeta} from "rain-interpreter-interface-0.1.0/src/lib/codegen/LibGenParseMeta.sol"; +import {LibParseOperand} from "../../../src/lib/parse/LibParseOperand.sol"; +import {LibConvert} from "rain-lib-typecast-0.1.0/src/LibConvert.sol"; +import {OperandV2} from "rain-interpreter-interface-0.1.0/src/interface/IInterpreterV4.sol"; + +/// @dev Sub parser with 2 words in meta but only 1 word parser pointer. +/// Looking up the word at index 1 triggers SubParserIndexOutOfBounds. +contract MismatchedWordSubParser is BaseRainlangSubParser { + function subParserParseMeta() internal pure override returns (bytes memory) { + AuthoringMetaV2[] memory meta = new AuthoringMetaV2[](2); + meta[0] = AuthoringMetaV2("aaa", ""); + meta[1] = AuthoringMetaV2("bbb", ""); + return LibGenParseMeta.buildParseMetaV2(meta, 2); + } + + function subParserOperandHandlers() internal pure override returns (bytes memory) { + unchecked { + function(bytes32[] memory) internal pure returns (OperandV2) lengthPointer; + uint256 length = 2; + assembly ("memory-safe") { + lengthPointer := length + } + function(bytes32[] memory) internal pure returns (OperandV2)[3] memory handlersFixed = + [lengthPointer, LibParseOperand.handleOperandDisallowed, LibParseOperand.handleOperandDisallowed]; + uint256[] memory handlersDynamic; + assembly ("memory-safe") { + handlersDynamic := handlersFixed + } + return LibConvert.unsafeTo16BitBytes(handlersDynamic); + } + } + + function subParserWordParsers() internal pure override returns (bytes memory) { + // Only 1 word parser pointer (2 bytes), so parsersLength = 1. + // Any index >= 1 is out of range. + return hex"0001"; + } + + function describedByMetaV1() external pure override returns (bytes32) { + return bytes32(0); + } + + function buildLiteralParserFunctionPointers() external pure returns (bytes memory) { + return ""; + } + + function buildOperandHandlerFunctionPointers() external pure returns (bytes memory) { + return ""; + } + + function buildSubParserWordParsers() external pure returns (bytes memory) { + return ""; + } +} diff --git a/test/src/abstract/NoMatchLiteralSubParser.sol b/test/src/abstract/NoMatchLiteralSubParser.sol new file mode 100644 index 000000000..cf718444d --- /dev/null +++ b/test/src/abstract/NoMatchLiteralSubParser.sol @@ -0,0 +1,24 @@ +// SPDX-License-Identifier: LicenseRef-DCL-1.0 +// SPDX-FileCopyrightText: Copyright (c) 2020 Rain Open Source Software Ltd +pragma solidity =0.8.25; + +import {BaseRainlangSubParser} from "../../../src/abstract/BaseRainlangSubParser.sol"; + +/// @dev Sub parser using default matchSubParseLiteralDispatch (returns false). +contract NoMatchLiteralSubParser is BaseRainlangSubParser { + function describedByMetaV1() external pure override returns (bytes32) { + return bytes32(0); + } + + function buildLiteralParserFunctionPointers() external pure returns (bytes memory) { + return ""; + } + + function buildOperandHandlerFunctionPointers() external pure returns (bytes memory) { + return ""; + } + + function buildSubParserWordParsers() external pure returns (bytes memory) { + return ""; + } +} diff --git a/test/src/abstract/TestableExtern.sol b/test/src/abstract/TestableExtern.sol new file mode 100644 index 000000000..89ed809e2 --- /dev/null +++ b/test/src/abstract/TestableExtern.sol @@ -0,0 +1,16 @@ +// SPDX-License-Identifier: LicenseRef-DCL-1.0 +// SPDX-FileCopyrightText: Copyright (c) 2020 Rain Open Source Software Ltd +pragma solidity =0.8.25; + +import {BaseRainlangExtern} from "../../../src/abstract/BaseRainlangExtern.sol"; + +/// @dev Shared base that exposes the internal pointer functions externally. +abstract contract TestableExtern is BaseRainlangExtern { + function buildIntegrityFunctionPointers() external pure returns (bytes memory) { + return integrityFunctionPointers(); + } + + function buildOpcodeFunctionPointers() external view returns (bytes memory) { + return opcodeFunctionPointers(); + } +} diff --git a/test/src/abstract/TwoOpExtern.sol b/test/src/abstract/TwoOpExtern.sol new file mode 100644 index 000000000..278473c47 --- /dev/null +++ b/test/src/abstract/TwoOpExtern.sol @@ -0,0 +1,24 @@ +// SPDX-License-Identifier: LicenseRef-DCL-1.0 +// SPDX-FileCopyrightText: Copyright (c) 2020 Rain Open Source Software Ltd +pragma solidity =0.8.25; + +import {BaseRainlangExtern} from "../../../src/abstract/BaseRainlangExtern.sol"; + +/// @dev Extern with exactly 2 opcode and integrity pointers. +contract TwoOpExtern is BaseRainlangExtern { + function opcodeFunctionPointers() internal pure override returns (bytes memory) { + return hex"00010002"; + } + + function integrityFunctionPointers() internal pure override returns (bytes memory) { + return hex"00010002"; + } + + function buildIntegrityFunctionPointers() external pure returns (bytes memory) { + return integrityFunctionPointers(); + } + + function buildOpcodeFunctionPointers() external pure returns (bytes memory) { + return opcodeFunctionPointers(); + } +} diff --git a/test/src/concrete/MockExternBadLiteralIndex.sol b/test/src/concrete/MockExternBadLiteralIndex.sol new file mode 100644 index 000000000..93a6052bc --- /dev/null +++ b/test/src/concrete/MockExternBadLiteralIndex.sol @@ -0,0 +1,14 @@ +// SPDX-License-Identifier: LicenseRef-DCL-1.0 +// SPDX-FileCopyrightText: Copyright (c) 2020 Rain Open Source Software Ltd +pragma solidity =0.8.25; + +import {RainlangReferenceExtern} from "../../../src/concrete/extern/RainlangReferenceExtern.sol"; + +/// @dev Mock subclass that forces matchSubParseLiteralDispatch to return an +/// out-of-bounds index, triggering the SubParserIndexOutOfBounds check. +contract MockExternBadLiteralIndex is RainlangReferenceExtern { + /// @notice Override to always return success with an out-of-bounds index. + function matchSubParseLiteralDispatch(uint256, uint256) internal pure override returns (bool, uint256, bytes32) { + return (true, 999, bytes32(0)); + } +} diff --git a/test/src/concrete/ModifierTestParser.sol b/test/src/concrete/ModifierTestParser.sol new file mode 100644 index 000000000..dc178853f --- /dev/null +++ b/test/src/concrete/ModifierTestParser.sol @@ -0,0 +1,23 @@ +// SPDX-License-Identifier: LicenseRef-DCL-1.0 +// SPDX-FileCopyrightText: Copyright (c) 2020 Rain Open Source Software Ltd +pragma solidity =0.8.25; + +import {RainlangParser} from "../../../src/concrete/RainlangParser.sol"; + +/// Exposes the checkParseMemoryOverflow modifier on a trivial function so it +/// can be tested in isolation without running the real parser. +contract ModifierTestParser is RainlangParser { + /// Sets the free memory pointer to exactly 0x10000. The modifier should + /// revert after this function body completes. + function overflowMemory() external pure checkParseMemoryOverflow { + assembly ("memory-safe") { + mstore(0x40, 0x10000) + } + } + + /// Does nothing. The modifier should pass because memory stays below + /// 0x10000. + function noOverflow() external pure checkParseMemoryOverflow { + // Free memory pointer stays well below 0x10000. + } +} diff --git a/test/src/concrete/RainlangInterpreter.zeroFunctionPointers.t.sol b/test/src/concrete/RainlangInterpreter.zeroFunctionPointers.t.sol index da2c6a521..5f8b838bd 100644 --- a/test/src/concrete/RainlangInterpreter.zeroFunctionPointers.t.sol +++ b/test/src/concrete/RainlangInterpreter.zeroFunctionPointers.t.sol @@ -6,12 +6,7 @@ import {Test} from "forge-std-1.16.1/src/Test.sol"; import {RainlangInterpreter} from "../../../src/concrete/RainlangInterpreter.sol"; import {ZeroFunctionPointers} from "../../../src/error/ErrEval.sol"; - -contract ZeroFPRainlangInterpreter is RainlangInterpreter { - function opcodeFunctionPointers() internal pure override returns (bytes memory) { - return hex""; - } -} +import {ZeroFPRainlangInterpreter} from "./ZeroFPRainlangInterpreter.sol"; contract RainlangInterpreterZeroFunctionPointersTest is Test { /// Deploying a RainlangInterpreter with empty function pointers must revert. diff --git a/test/src/concrete/RainlangParser.parseMemoryOverflow.t.sol b/test/src/concrete/RainlangParser.parseMemoryOverflow.t.sol index cb87f17a5..a41efb055 100644 --- a/test/src/concrete/RainlangParser.parseMemoryOverflow.t.sol +++ b/test/src/concrete/RainlangParser.parseMemoryOverflow.t.sol @@ -4,26 +4,8 @@ pragma solidity =0.8.25; import {Test} from "forge-std-1.16.1/src/Test.sol"; -import {RainlangParser} from "../../../src/concrete/RainlangParser.sol"; import {ParseMemoryOverflow} from "../../../src/error/ErrParse.sol"; - -/// Exposes the checkParseMemoryOverflow modifier on a trivial function so it -/// can be tested in isolation without running the real parser. -contract ModifierTestParser is RainlangParser { - /// Sets the free memory pointer to exactly 0x10000. The modifier should - /// revert after this function body completes. - function overflowMemory() external pure checkParseMemoryOverflow { - assembly ("memory-safe") { - mstore(0x40, 0x10000) - } - } - - /// Does nothing. The modifier should pass because memory stays below - /// 0x10000. - function noOverflow() external pure checkParseMemoryOverflow { - // Free memory pointer stays well below 0x10000. - } -} +import {ModifierTestParser} from "./ModifierTestParser.sol"; contract RainlangParserParseMemoryOverflowTest is Test { /// The modifier must revert when the free memory pointer exceeds the diff --git a/test/src/concrete/RainlangReferenceExtern.subParserIndexOutOfBounds.t.sol b/test/src/concrete/RainlangReferenceExtern.subParserIndexOutOfBounds.t.sol index 71049da3a..f524febc0 100644 --- a/test/src/concrete/RainlangReferenceExtern.subParserIndexOutOfBounds.t.sol +++ b/test/src/concrete/RainlangReferenceExtern.subParserIndexOutOfBounds.t.sol @@ -3,17 +3,8 @@ pragma solidity =0.8.25; import {Test} from "forge-std-1.16.1/src/Test.sol"; -import {RainlangReferenceExtern} from "../../../src/concrete/extern/RainlangReferenceExtern.sol"; import {SubParserIndexOutOfBounds} from "../../../src/error/ErrSubParse.sol"; - -/// @dev Mock subclass that forces matchSubParseLiteralDispatch to return an -/// out-of-bounds index, triggering the SubParserIndexOutOfBounds check. -contract MockExternBadLiteralIndex is RainlangReferenceExtern { - /// @notice Override to always return success with an out-of-bounds index. - function matchSubParseLiteralDispatch(uint256, uint256) internal pure override returns (bool, uint256, bytes32) { - return (true, 999, bytes32(0)); - } -} +import {MockExternBadLiteralIndex} from "./MockExternBadLiteralIndex.sol"; /// @title RainlangReferenceExternSubParserIndexOutOfBoundsTest /// @notice Test that `SubParserIndexOutOfBounds` reverts when an diff --git a/test/src/concrete/ZeroFPRainlangInterpreter.sol b/test/src/concrete/ZeroFPRainlangInterpreter.sol new file mode 100644 index 000000000..efd0c664a --- /dev/null +++ b/test/src/concrete/ZeroFPRainlangInterpreter.sol @@ -0,0 +1,12 @@ +// SPDX-License-Identifier: LicenseRef-DCL-1.0 +// SPDX-FileCopyrightText: Copyright (c) 2020 Rain Open Source Software Ltd +pragma solidity =0.8.25; + +import {RainlangInterpreter} from "../../../src/concrete/RainlangInterpreter.sol"; + +/// @dev RainlangInterpreter override with empty opcode function pointers. +contract ZeroFPRainlangInterpreter is RainlangInterpreter { + function opcodeFunctionPointers() internal pure override returns (bytes memory) { + return hex""; + } +} diff --git a/test/src/lib/integrity/IntegrityHighwater.sol b/test/src/lib/integrity/IntegrityHighwater.sol new file mode 100644 index 000000000..6f5839fdb --- /dev/null +++ b/test/src/lib/integrity/IntegrityHighwater.sol @@ -0,0 +1,45 @@ +// SPDX-License-Identifier: LicenseRef-DCL-1.0 +// SPDX-FileCopyrightText: Copyright (c) 2020 Rain Open Source Software Ltd +pragma solidity =0.8.25; + +import {LibIntegrityCheck, IntegrityCheckState} from "../../../../src/lib/integrity/LibIntegrityCheck.sol"; +import {LibConvert} from "rain-lib-typecast-0.1.0/src/LibConvert.sol"; +import {OperandV2} from "rain-interpreter-interface-0.1.0/src/interface/IInterpreterV4.sol"; + +/// @dev Contract with 2 opcodes for testing StackUnderflowHighwater. +/// Opcode 0: 0 inputs, 2 outputs (advances highwater). +/// Opcode 1: 2 inputs, 1 output (drops stack below highwater). +contract IntegrityHighwater { + function zeroInputTwoOutput(IntegrityCheckState memory, OperandV2) internal pure returns (uint256, uint256) { + return (0, 2); + } + + function twoInputOneOutput(IntegrityCheckState memory, OperandV2) internal pure returns (uint256, uint256) { + return (2, 1); + } + + function buildIntegrityPointers() external pure returns (bytes memory) { + unchecked { + function(IntegrityCheckState memory, OperandV2) internal pure returns (uint256, uint256) lengthPointer; + uint256 length = 2; + assembly ("memory-safe") { + lengthPointer := length + } + function(IntegrityCheckState memory, OperandV2) internal pure returns (uint256, uint256)[3] memory + pointersFixed = [lengthPointer, zeroInputTwoOutput, twoInputOneOutput]; + uint256[] memory pointersDynamic; + assembly ("memory-safe") { + pointersDynamic := pointersFixed + } + return LibConvert.unsafeTo16BitBytes(pointersDynamic); + } + } + + function runIntegrityCheck(bytes memory fPointers, bytes memory bytecode, bytes32[] memory constants) + external + view + returns (bytes memory) + { + return LibIntegrityCheck.integrityCheck2(fPointers, bytecode, constants); + } +} diff --git a/test/src/lib/integrity/IntegritySingleOp.sol b/test/src/lib/integrity/IntegritySingleOp.sol new file mode 100644 index 000000000..db760d560 --- /dev/null +++ b/test/src/lib/integrity/IntegritySingleOp.sol @@ -0,0 +1,40 @@ +// SPDX-License-Identifier: LicenseRef-DCL-1.0 +// SPDX-FileCopyrightText: Copyright (c) 2020 Rain Open Source Software Ltd +pragma solidity =0.8.25; + +import {LibIntegrityCheck, IntegrityCheckState} from "../../../../src/lib/integrity/LibIntegrityCheck.sol"; +import {LibConvert} from "rain-lib-typecast-0.1.0/src/LibConvert.sol"; +import {OperandV2} from "rain-interpreter-interface-0.1.0/src/interface/IInterpreterV4.sol"; + +/// @dev Contract whose integrity function pointers are valid for its own +/// bytecode. Has a single opcode (index 0) that always returns (1, 1). +contract IntegritySingleOp { + function oneInputOneOutput(IntegrityCheckState memory, OperandV2) internal pure returns (uint256, uint256) { + return (1, 1); + } + + function buildIntegrityPointers() external pure returns (bytes memory) { + unchecked { + function(IntegrityCheckState memory, OperandV2) internal pure returns (uint256, uint256) lengthPointer; + uint256 length = 1; + assembly ("memory-safe") { + lengthPointer := length + } + function(IntegrityCheckState memory, OperandV2) internal pure returns (uint256, uint256)[2] memory + pointersFixed = [lengthPointer, oneInputOneOutput]; + uint256[] memory pointersDynamic; + assembly ("memory-safe") { + pointersDynamic := pointersFixed + } + return LibConvert.unsafeTo16BitBytes(pointersDynamic); + } + } + + function runIntegrityCheck(bytes memory fPointers, bytes memory bytecode, bytes32[] memory constants) + external + view + returns (bytes memory) + { + return LibIntegrityCheck.integrityCheck2(fPointers, bytecode, constants); + } +} diff --git a/test/src/lib/integrity/LibIntegrityCheck.t.sol b/test/src/lib/integrity/LibIntegrityCheck.t.sol index 245f9b463..4b7384421 100644 --- a/test/src/lib/integrity/LibIntegrityCheck.t.sol +++ b/test/src/lib/integrity/LibIntegrityCheck.t.sol @@ -3,7 +3,7 @@ pragma solidity =0.8.25; import {Test} from "forge-std-1.16.1/src/Test.sol"; -import {LibIntegrityCheck, IntegrityCheckState} from "../../../../src/lib/integrity/LibIntegrityCheck.sol"; +import {LibIntegrityCheck} from "../../../../src/lib/integrity/LibIntegrityCheck.sol"; import { OpcodeOutOfRange, StackUnderflow, @@ -14,79 +14,8 @@ import { import {BadOpInputsLength, BadOpOutputsLength} from "rain-interpreter-interface-0.1.0/src/error/ErrIntegrity.sol"; import {INTEGRITY_FUNCTION_POINTERS} from "../../../../src/generated/RainlangExpressionDeployer.pointers.sol"; import {ALL_STANDARD_OPS_LENGTH} from "../../../../src/lib/op/LibAllStandardOps.sol"; -import {LibConvert} from "rain-lib-typecast-0.1.0/src/LibConvert.sol"; -import {OperandV2} from "rain-interpreter-interface-0.1.0/src/interface/IInterpreterV4.sol"; - -/// @dev Contract whose integrity function pointers are valid for its own -/// bytecode. Has a single opcode (index 0) that always returns (1, 1). -contract IntegritySingleOp { - function oneInputOneOutput(IntegrityCheckState memory, OperandV2) internal pure returns (uint256, uint256) { - return (1, 1); - } - - function buildIntegrityPointers() external pure returns (bytes memory) { - unchecked { - function(IntegrityCheckState memory, OperandV2) internal pure returns (uint256, uint256) lengthPointer; - uint256 length = 1; - assembly ("memory-safe") { - lengthPointer := length - } - function(IntegrityCheckState memory, OperandV2) internal pure returns (uint256, uint256)[2] memory - pointersFixed = [lengthPointer, oneInputOneOutput]; - uint256[] memory pointersDynamic; - assembly ("memory-safe") { - pointersDynamic := pointersFixed - } - return LibConvert.unsafeTo16BitBytes(pointersDynamic); - } - } - - function runIntegrityCheck(bytes memory fPointers, bytes memory bytecode, bytes32[] memory constants) - external - view - returns (bytes memory) - { - return LibIntegrityCheck.integrityCheck2(fPointers, bytecode, constants); - } -} - -/// @dev Contract with 2 opcodes for testing StackUnderflowHighwater. -/// Opcode 0: 0 inputs, 2 outputs (advances highwater). -/// Opcode 1: 2 inputs, 1 output (drops stack below highwater). -contract IntegrityHighwater { - function zeroInputTwoOutput(IntegrityCheckState memory, OperandV2) internal pure returns (uint256, uint256) { - return (0, 2); - } - - function twoInputOneOutput(IntegrityCheckState memory, OperandV2) internal pure returns (uint256, uint256) { - return (2, 1); - } - - function buildIntegrityPointers() external pure returns (bytes memory) { - unchecked { - function(IntegrityCheckState memory, OperandV2) internal pure returns (uint256, uint256) lengthPointer; - uint256 length = 2; - assembly ("memory-safe") { - lengthPointer := length - } - function(IntegrityCheckState memory, OperandV2) internal pure returns (uint256, uint256)[3] memory - pointersFixed = [lengthPointer, zeroInputTwoOutput, twoInputOneOutput]; - uint256[] memory pointersDynamic; - assembly ("memory-safe") { - pointersDynamic := pointersFixed - } - return LibConvert.unsafeTo16BitBytes(pointersDynamic); - } - } - - function runIntegrityCheck(bytes memory fPointers, bytes memory bytecode, bytes32[] memory constants) - external - view - returns (bytes memory) - { - return LibIntegrityCheck.integrityCheck2(fPointers, bytecode, constants); - } -} +import {IntegritySingleOp} from "./IntegritySingleOp.sol"; +import {IntegrityHighwater} from "./IntegrityHighwater.sol"; /// @title LibIntegrityCheckTest /// @notice Tests for LibIntegrityCheck. diff --git a/test/src/lib/parse/BadLengthSubParser.sol b/test/src/lib/parse/BadLengthSubParser.sol new file mode 100644 index 000000000..5f5c52f61 --- /dev/null +++ b/test/src/lib/parse/BadLengthSubParser.sol @@ -0,0 +1,28 @@ +// SPDX-License-Identifier: LicenseRef-DCL-1.0 +// SPDX-FileCopyrightText: Copyright (c) 2020 Rain Open Source Software Ltd +pragma solidity =0.8.25; + +import {ISubParserV4} from "rain-interpreter-interface-0.1.0/src/interface/ISubParserV4.sol"; +import {IERC165} from "@openzeppelin-contracts-5.6.1/utils/introspection/IERC165.sol"; + +/// A bad sub parser that claims to know every word but returns bytecode of +/// the wrong length. +contract BadLengthSubParser is ISubParserV4, IERC165 { + bytes public badBytecode; + + constructor(bytes memory badBytecode_) { + badBytecode = badBytecode_; + } + + function supportsInterface(bytes4 interfaceId) external pure override returns (bool) { + return interfaceId == type(ISubParserV4).interfaceId || interfaceId == type(IERC165).interfaceId; + } + + function subParseLiteral2(bytes calldata) external pure override returns (bool, bytes32) { + return (false, 0); + } + + function subParseWord2(bytes calldata) external view override returns (bool, bytes memory, bytes32[] memory) { + return (true, badBytecode, new bytes32[](0)); + } +} diff --git a/test/src/lib/parse/ConstantReturningSubParser.sol b/test/src/lib/parse/ConstantReturningSubParser.sol new file mode 100644 index 000000000..139cb8c15 --- /dev/null +++ b/test/src/lib/parse/ConstantReturningSubParser.sol @@ -0,0 +1,46 @@ +// SPDX-License-Identifier: LicenseRef-DCL-1.0 +// SPDX-FileCopyrightText: Copyright (c) 2020 Rain Open Source Software Ltd +pragma solidity =0.8.25; + +import {ISubParserV4} from "rain-interpreter-interface-0.1.0/src/interface/ISubParserV4.sol"; +import {IERC165} from "@openzeppelin-contracts-5.6.1/utils/introspection/IERC165.sol"; +import {OPCODE_CONSTANT} from "rain-interpreter-interface-0.1.0/src/interface/IInterpreterV4.sol"; + +/// @dev A sub parser that resolves any word by returning a constant opcode +/// with a known constant value. Each call returns exactly one constant. +contract ConstantReturningSubParser is ISubParserV4, IERC165 { + bytes32 public constant RETURN_VALUE = bytes32(uint256(0xDEADBEEF)); + + function supportsInterface(bytes4 interfaceId) external pure override returns (bool) { + return interfaceId == type(ISubParserV4).interfaceId || interfaceId == type(IERC165).interfaceId; + } + + function subParseLiteral2(bytes calldata) external pure override returns (bool, bytes32) { + return (false, 0); + } + + /// @notice Returns a constant opcode pointing at the current constants + /// height from the header, with a single constant value. + function subParseWord2(bytes calldata data) external pure override returns (bool, bytes memory, bytes32[] memory) { + // Extract constantsHeight from header (first 2 bytes). + uint256 constantsHeight = uint256(uint16(bytes2(data[0:2]))); + + // Build 4-byte constant opcode: [OPCODE_CONSTANT][IO=0x10][operand=constantsHeight] + bytes memory bytecode = new bytes(4); + // Safe: opcode constants and IO byte are small known values that fit + // in uint8/bytes1. + //forge-lint: disable-next-line(unsafe-typecast) + bytecode[0] = bytes1(uint8(OPCODE_CONSTANT)); + //forge-lint: disable-next-line(unsafe-typecast) + bytecode[1] = bytes1(uint8(0x10)); // 0 inputs, 1 output + //forge-lint: disable-next-line(unsafe-typecast) + bytecode[2] = bytes1(uint8(constantsHeight >> 8)); + //forge-lint: disable-next-line(unsafe-typecast) + bytecode[3] = bytes1(uint8(constantsHeight)); + + bytes32[] memory constants = new bytes32[](1); + constants[0] = RETURN_VALUE; + + return (true, bytecode, constants); + } +} diff --git a/test/src/lib/parse/ContextReturningSubParser.sol b/test/src/lib/parse/ContextReturningSubParser.sol new file mode 100644 index 000000000..0822e7997 --- /dev/null +++ b/test/src/lib/parse/ContextReturningSubParser.sol @@ -0,0 +1,32 @@ +// SPDX-License-Identifier: LicenseRef-DCL-1.0 +// SPDX-FileCopyrightText: Copyright (c) 2020 Rain Open Source Software Ltd +pragma solidity =0.8.25; + +import {ISubParserV4} from "rain-interpreter-interface-0.1.0/src/interface/ISubParserV4.sol"; +import {IERC165} from "@openzeppelin-contracts-5.6.1/utils/introspection/IERC165.sol"; +import {OPCODE_CONTEXT} from "rain-interpreter-interface-0.1.0/src/interface/IInterpreterV4.sol"; + +/// @dev A sub parser that resolves any word by returning a context opcode with +/// no constants. Used to verify that subParseWords iterates multiple sources. +contract ContextReturningSubParser is ISubParserV4, IERC165 { + function supportsInterface(bytes4 interfaceId) external pure override returns (bool) { + return interfaceId == type(ISubParserV4).interfaceId || interfaceId == type(IERC165).interfaceId; + } + + function subParseLiteral2(bytes calldata) external pure override returns (bool, bytes32) { + return (false, 0); + } + + /// @notice Returns a context opcode (0,0) with no constants. + function subParseWord2(bytes calldata) external pure override returns (bool, bytes memory, bytes32[] memory) { + bytes memory bytecode = new bytes(4); + // Safe: opcode constant and IO byte are small known values. + //forge-lint: disable-next-line(unsafe-typecast) + bytecode[0] = bytes1(uint8(OPCODE_CONTEXT)); + //forge-lint: disable-next-line(unsafe-typecast) + bytecode[1] = bytes1(uint8(0x10)); // 0 inputs, 1 output + bytecode[2] = bytes1(0); // row 0 + bytecode[3] = bytes1(0); // column 0 + return (true, bytecode, new bytes32[](0)); + } +} diff --git a/test/src/lib/parse/LibSubParse.badSubParserResult.t.sol b/test/src/lib/parse/LibSubParse.badSubParserResult.t.sol index 9d9ff6307..f7841546a 100644 --- a/test/src/lib/parse/LibSubParse.badSubParserResult.t.sol +++ b/test/src/lib/parse/LibSubParse.badSubParserResult.t.sol @@ -3,32 +3,9 @@ pragma solidity =0.8.25; import {OpTest} from "test/abstract/OpTest.sol"; -import {ISubParserV4} from "rain-interpreter-interface-0.1.0/src/interface/ISubParserV4.sol"; -import {IERC165} from "@openzeppelin-contracts-5.6.1/utils/introspection/IERC165.sol"; import {BadSubParserResult} from "../../../../src/error/ErrParse.sol"; import {Strings} from "@openzeppelin-contracts-5.6.1/utils/Strings.sol"; - -/// A bad sub parser that claims to know every word but returns bytecode of -/// the wrong length. -contract BadLengthSubParser is ISubParserV4, IERC165 { - bytes public badBytecode; - - constructor(bytes memory badBytecode_) { - badBytecode = badBytecode_; - } - - function supportsInterface(bytes4 interfaceId) external pure override returns (bool) { - return interfaceId == type(ISubParserV4).interfaceId || interfaceId == type(IERC165).interfaceId; - } - - function subParseLiteral2(bytes calldata) external pure override returns (bool, bytes32) { - return (false, 0); - } - - function subParseWord2(bytes calldata) external view override returns (bool, bytes memory, bytes32[] memory) { - return (true, badBytecode, new bytes32[](0)); - } -} +import {BadLengthSubParser} from "./BadLengthSubParser.sol"; /// @title LibSubParseBadSubParserResultTest /// @notice Tests that parsing reverts with `BadSubParserResult` when a sub parser diff --git a/test/src/lib/parse/LibSubParse.constantAccumulation.t.sol b/test/src/lib/parse/LibSubParse.constantAccumulation.t.sol index d1fed625a..3a887a221 100644 --- a/test/src/lib/parse/LibSubParse.constantAccumulation.t.sol +++ b/test/src/lib/parse/LibSubParse.constantAccumulation.t.sol @@ -6,88 +6,11 @@ import {Test} from "forge-std-1.16.1/src/Test.sol"; import {LibParseState, ParseState} from "../../../../src/lib/parse/LibParseState.sol"; import {LibParse} from "../../../../src/lib/parse/LibParse.sol"; import {LibMetaFixture} from "test/lib/parse/LibMetaFixture.sol"; -import {ISubParserV4} from "rain-interpreter-interface-0.1.0/src/interface/ISubParserV4.sol"; -import {IERC165} from "@openzeppelin-contracts-5.6.1/utils/introspection/IERC165.sol"; import {OPCODE_CONSTANT} from "rain-interpreter-interface-0.1.0/src/interface/IInterpreterV4.sol"; import {LibBytecode, Pointer} from "rain-interpreter-interface-0.1.0/src/lib/bytecode/LibBytecode.sol"; import {Strings} from "@openzeppelin-contracts-5.6.1/utils/Strings.sol"; - -/// @dev A sub parser that resolves any word by returning a constant opcode -/// with a known constant value. Each call returns exactly one constant. -contract ConstantReturningSubParser is ISubParserV4, IERC165 { - bytes32 public constant RETURN_VALUE = bytes32(uint256(0xDEADBEEF)); - - function supportsInterface(bytes4 interfaceId) external pure override returns (bool) { - return interfaceId == type(ISubParserV4).interfaceId || interfaceId == type(IERC165).interfaceId; - } - - function subParseLiteral2(bytes calldata) external pure override returns (bool, bytes32) { - return (false, 0); - } - - /// @notice Returns a constant opcode pointing at the current constants - /// height from the header, with a single constant value. - function subParseWord2(bytes calldata data) external pure override returns (bool, bytes memory, bytes32[] memory) { - // Extract constantsHeight from header (first 2 bytes). - uint256 constantsHeight = uint256(uint16(bytes2(data[0:2]))); - - // Build 4-byte constant opcode: [OPCODE_CONSTANT][IO=0x10][operand=constantsHeight] - bytes memory bytecode = new bytes(4); - // Safe: opcode constants and IO byte are small known values that fit - // in uint8/bytes1. - //forge-lint: disable-next-line(unsafe-typecast) - bytecode[0] = bytes1(uint8(OPCODE_CONSTANT)); - //forge-lint: disable-next-line(unsafe-typecast) - bytecode[1] = bytes1(uint8(0x10)); // 0 inputs, 1 output - //forge-lint: disable-next-line(unsafe-typecast) - bytecode[2] = bytes1(uint8(constantsHeight >> 8)); - //forge-lint: disable-next-line(unsafe-typecast) - bytecode[3] = bytes1(uint8(constantsHeight)); - - bytes32[] memory constants = new bytes32[](1); - constants[0] = RETURN_VALUE; - - return (true, bytecode, constants); - } -} - -/// @dev A sub parser that returns multiple constants per word resolution. -contract MultiConstantSubParser is ISubParserV4, IERC165 { - bytes32 public constant VALUE_A = bytes32(uint256(0xAAAA)); - bytes32 public constant VALUE_B = bytes32(uint256(0xBBBB)); - - function supportsInterface(bytes4 interfaceId) external pure override returns (bool) { - return interfaceId == type(ISubParserV4).interfaceId || interfaceId == type(IERC165).interfaceId; - } - - function subParseLiteral2(bytes calldata) external pure override returns (bool, bytes32) { - return (false, 0); - } - - /// @notice Returns a constant opcode with two constants. The first constant - /// is used as the operand target; the second is an extra accumulation. - function subParseWord2(bytes calldata data) external pure override returns (bool, bytes memory, bytes32[] memory) { - uint256 constantsHeight = uint256(uint16(bytes2(data[0:2]))); - - bytes memory bytecode = new bytes(4); - // Safe: opcode constants and IO byte are small known values that fit - // in uint8/bytes1. - //forge-lint: disable-next-line(unsafe-typecast) - bytecode[0] = bytes1(uint8(OPCODE_CONSTANT)); - //forge-lint: disable-next-line(unsafe-typecast) - bytecode[1] = bytes1(uint8(0x10)); - //forge-lint: disable-next-line(unsafe-typecast) - bytecode[2] = bytes1(uint8(constantsHeight >> 8)); - //forge-lint: disable-next-line(unsafe-typecast) - bytecode[3] = bytes1(uint8(constantsHeight)); - - bytes32[] memory constants = new bytes32[](2); - constants[0] = VALUE_A; - constants[1] = VALUE_B; - - return (true, bytecode, constants); - } -} +import {ConstantReturningSubParser} from "./ConstantReturningSubParser.sol"; +import {MultiConstantSubParser} from "./MultiConstantSubParser.sol"; /// @title LibSubParseConstantAccumulationTest /// @notice Tests that constants returned by sub parsers during word resolution diff --git a/test/src/lib/parse/LibSubParse.subParseWords.t.sol b/test/src/lib/parse/LibSubParse.subParseWords.t.sol index af08eefb5..7d2f24512 100644 --- a/test/src/lib/parse/LibSubParse.subParseWords.t.sol +++ b/test/src/lib/parse/LibSubParse.subParseWords.t.sol @@ -9,7 +9,6 @@ import {LibParse} from "../../../../src/lib/parse/LibParse.sol"; import {LibMetaFixture} from "test/lib/parse/LibMetaFixture.sol"; import {LibBytecode, Pointer} from "rain-interpreter-interface-0.1.0/src/lib/bytecode/LibBytecode.sol"; import {ISubParserV4} from "rain-interpreter-interface-0.1.0/src/interface/ISubParserV4.sol"; -import {IERC165} from "@openzeppelin-contracts-5.6.1/utils/introspection/IERC165.sol"; import { OPCODE_UNKNOWN, OPCODE_CONSTANT, @@ -17,31 +16,7 @@ import { } from "rain-interpreter-interface-0.1.0/src/interface/IInterpreterV4.sol"; import {Strings} from "@openzeppelin-contracts-5.6.1/utils/Strings.sol"; import {UnknownWord} from "../../../../src/error/ErrParse.sol"; - -/// @dev A sub parser that resolves any word by returning a context opcode with -/// no constants. Used to verify that subParseWords iterates multiple sources. -contract ContextReturningSubParser is ISubParserV4, IERC165 { - function supportsInterface(bytes4 interfaceId) external pure override returns (bool) { - return interfaceId == type(ISubParserV4).interfaceId || interfaceId == type(IERC165).interfaceId; - } - - function subParseLiteral2(bytes calldata) external pure override returns (bool, bytes32) { - return (false, 0); - } - - /// @notice Returns a context opcode (0,0) with no constants. - function subParseWord2(bytes calldata) external pure override returns (bool, bytes memory, bytes32[] memory) { - bytes memory bytecode = new bytes(4); - // Safe: opcode constant and IO byte are small known values. - //forge-lint: disable-next-line(unsafe-typecast) - bytecode[0] = bytes1(uint8(OPCODE_CONTEXT)); - //forge-lint: disable-next-line(unsafe-typecast) - bytecode[1] = bytes1(uint8(0x10)); // 0 inputs, 1 output - bytecode[2] = bytes1(0); // row 0 - bytecode[3] = bytes1(0); // column 0 - return (true, bytecode, new bytes32[](0)); - } -} +import {ContextReturningSubParser} from "./ContextReturningSubParser.sol"; /// @title LibSubParseSubParseWordsTest /// @notice Direct unit tests for `LibSubParse.subParseWords`. diff --git a/test/src/lib/parse/MultiConstantSubParser.sol b/test/src/lib/parse/MultiConstantSubParser.sol new file mode 100644 index 000000000..27cfbb3cf --- /dev/null +++ b/test/src/lib/parse/MultiConstantSubParser.sol @@ -0,0 +1,45 @@ +// SPDX-License-Identifier: LicenseRef-DCL-1.0 +// SPDX-FileCopyrightText: Copyright (c) 2020 Rain Open Source Software Ltd +pragma solidity =0.8.25; + +import {ISubParserV4} from "rain-interpreter-interface-0.1.0/src/interface/ISubParserV4.sol"; +import {IERC165} from "@openzeppelin-contracts-5.6.1/utils/introspection/IERC165.sol"; +import {OPCODE_CONSTANT} from "rain-interpreter-interface-0.1.0/src/interface/IInterpreterV4.sol"; + +/// @dev A sub parser that returns multiple constants per word resolution. +contract MultiConstantSubParser is ISubParserV4, IERC165 { + bytes32 public constant VALUE_A = bytes32(uint256(0xAAAA)); + bytes32 public constant VALUE_B = bytes32(uint256(0xBBBB)); + + function supportsInterface(bytes4 interfaceId) external pure override returns (bool) { + return interfaceId == type(ISubParserV4).interfaceId || interfaceId == type(IERC165).interfaceId; + } + + function subParseLiteral2(bytes calldata) external pure override returns (bool, bytes32) { + return (false, 0); + } + + /// @notice Returns a constant opcode with two constants. The first constant + /// is used as the operand target; the second is an extra accumulation. + function subParseWord2(bytes calldata data) external pure override returns (bool, bytes memory, bytes32[] memory) { + uint256 constantsHeight = uint256(uint16(bytes2(data[0:2]))); + + bytes memory bytecode = new bytes(4); + // Safe: opcode constants and IO byte are small known values that fit + // in uint8/bytes1. + //forge-lint: disable-next-line(unsafe-typecast) + bytecode[0] = bytes1(uint8(OPCODE_CONSTANT)); + //forge-lint: disable-next-line(unsafe-typecast) + bytecode[1] = bytes1(uint8(0x10)); + //forge-lint: disable-next-line(unsafe-typecast) + bytecode[2] = bytes1(uint8(constantsHeight >> 8)); + //forge-lint: disable-next-line(unsafe-typecast) + bytecode[3] = bytes1(uint8(constantsHeight)); + + bytes32[] memory constants = new bytes32[](2); + constants[0] = VALUE_A; + constants[1] = VALUE_B; + + return (true, bytecode, constants); + } +} diff --git a/test/src/lib/state/LibInterpreterStateDataContract.t.sol b/test/src/lib/state/LibInterpreterStateDataContract.t.sol index 0fb294620..cab4490c8 100644 --- a/test/src/lib/state/LibInterpreterStateDataContract.t.sol +++ b/test/src/lib/state/LibInterpreterStateDataContract.t.sol @@ -9,51 +9,7 @@ import {Pointer} from "rain-solmem-0.1.3/src/lib/LibPointer.sol"; import {FullyQualifiedNamespace} from "rain-interpreter-interface-0.1.0/src/interface/IInterpreterV4.sol"; import {IInterpreterStoreV3} from "rain-interpreter-interface-0.1.0/src/interface/IInterpreterStoreV3.sol"; import {MemoryKV} from "rain-lib-memkv-0.1.0/src/lib/LibMemoryKV.sol"; - -/// @dev Wraps unsafeDeserialize as an external call to avoid -/// stack-too-deep from inlining the 9-field struct return. -contract LibInterpreterStateDataContractExtern { - function deserialize( - bytes memory serialized, - uint256 sourceIndex, - FullyQualifiedNamespace namespace, - IInterpreterStoreV3 store, - bytes32[][] memory context, - bytes memory fs - ) external pure returns (InterpreterState memory) { - return LibInterpreterStateDataContract.unsafeDeserialize(serialized, sourceIndex, namespace, store, context, fs); - } - - /// Deserializes and reads each stack's allocated length from memory. - /// Must run inside the same call context as deserialization so that - /// the stack pointers reference live memory. - function deserializeStackLengths(bytes memory serialized) external pure returns (uint256[] memory) { - InterpreterState memory state = LibInterpreterStateDataContract.unsafeDeserialize( - serialized, 0, FullyQualifiedNamespace.wrap(0), IInterpreterStoreV3(address(0)), new bytes32[][](0), "" - ); - uint256 count = state.stackBottoms.length; - uint256[] memory lengths = new uint256[](count); - for (uint256 i = 0; i < count; i++) { - Pointer bottom = state.stackBottoms[i]; - uint256 len; - assembly ("memory-safe") { - // Scan backwards from bottom for the array length word. - // Stack layout is [length][slot0]...[slotN-1], bottom - // points past slotN-1. At offset (length+1) words back - // from bottom, mload == length. - for { let offset := 2 } 1 { offset := add(offset, 1) } { - let v := mload(sub(bottom, mul(offset, 0x20))) - if eq(add(v, 1), offset) { - len := v - break - } - } - } - lengths[i] = len; - } - return lengths; - } -} +import {LibInterpreterStateDataContractExtern} from "./LibInterpreterStateDataContractExtern.sol"; /// @title LibInterpreterStateDataContractTest /// @notice Tests for LibInterpreterStateDataContract serialization and deserialization. diff --git a/test/src/lib/state/LibInterpreterStateDataContractExtern.sol b/test/src/lib/state/LibInterpreterStateDataContractExtern.sol new file mode 100644 index 000000000..bd5a40b76 --- /dev/null +++ b/test/src/lib/state/LibInterpreterStateDataContractExtern.sol @@ -0,0 +1,54 @@ +// SPDX-License-Identifier: LicenseRef-DCL-1.0 +// SPDX-FileCopyrightText: Copyright (c) 2020 Rain Open Source Software Ltd +pragma solidity =0.8.25; + +import {LibInterpreterStateDataContract} from "../../../../src/lib/state/LibInterpreterStateDataContract.sol"; +import {InterpreterState} from "../../../../src/lib/state/LibInterpreterState.sol"; +import {Pointer} from "rain-solmem-0.1.3/src/lib/LibPointer.sol"; +import {FullyQualifiedNamespace} from "rain-interpreter-interface-0.1.0/src/interface/IInterpreterV4.sol"; +import {IInterpreterStoreV3} from "rain-interpreter-interface-0.1.0/src/interface/IInterpreterStoreV3.sol"; + +/// @dev Wraps unsafeDeserialize as an external call to avoid +/// stack-too-deep from inlining the 9-field struct return. +contract LibInterpreterStateDataContractExtern { + function deserialize( + bytes memory serialized, + uint256 sourceIndex, + FullyQualifiedNamespace namespace, + IInterpreterStoreV3 store, + bytes32[][] memory context, + bytes memory fs + ) external pure returns (InterpreterState memory) { + return LibInterpreterStateDataContract.unsafeDeserialize(serialized, sourceIndex, namespace, store, context, fs); + } + + /// Deserializes and reads each stack's allocated length from memory. + /// Must run inside the same call context as deserialization so that + /// the stack pointers reference live memory. + function deserializeStackLengths(bytes memory serialized) external pure returns (uint256[] memory) { + InterpreterState memory state = LibInterpreterStateDataContract.unsafeDeserialize( + serialized, 0, FullyQualifiedNamespace.wrap(0), IInterpreterStoreV3(address(0)), new bytes32[][](0), "" + ); + uint256 count = state.stackBottoms.length; + uint256[] memory lengths = new uint256[](count); + for (uint256 i = 0; i < count; i++) { + Pointer bottom = state.stackBottoms[i]; + uint256 len; + assembly ("memory-safe") { + // Scan backwards from bottom for the array length word. + // Stack layout is [length][slot0]...[slotN-1], bottom + // points past slotN-1. At offset (length+1) words back + // from bottom, mload == length. + for { let offset := 2 } 1 { offset := add(offset, 1) } { + let v := mload(sub(bottom, mul(offset, 0x20))) + if eq(add(v, 1), offset) { + len := v + break + } + } + } + lengths[i] = len; + } + return lengths; + } +}