1 文本格式
/// <summary>
/// 阶乘的非递归算法
/// </summary>
/// <param name="a"></param>
/// <returns></returns>
private int Factorial_Original(int a)
{
int r = 1;
for (int i = a; i > 1; i--)
{
r = r * i;
}
return r;
}
/// <summary>
/// 阶乘的递归算法
/// 递归简单理解就是函数调用自己(当然参数不同哈!)
/// </summary>
/// <param name="a"></param>
/// <returns></returns>
private int Factorial(int a)
{
if (a > 1) return a * Factorial(a - 1);
else return 1;
}
/// <summary>
/// 《小白学程序》第十一课:阶乘(Factorial)的计算方法与代码
/// 阶乘是基斯顿·卡曼(Christian Kramp,1760~1826)于 1808 年发明的运算符号,是数学术语。
/// 一个正整数的阶乘(factorial)是所有小于及等于该数的正整数的积,并且0的阶乘为1。自然数n的阶乘写作n!。
/// 1808年,基斯顿·卡曼引进这个表示法。亦即 n! = 1×2×3×...×(n-1)×n。
/// 阶乘亦可以递归方式定义:
/// 0! = 1
/// n! = (n-1)! × n
///
/// 本节课接触了函数(阶乘函数)。
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void button11_Click(object sender, EventArgs e)
{
int n = 4;
StringBuilder sb = new StringBuilder();
sb.AppendLine("非递归算法:" + n + "! = " + Factorial_Original(n) + "<br>");
sb.AppendLine("递归算法:" + n + "! = " + Factorial(n) + "<br>");
webBrowser1.DocumentText = sb.ToString();
}
2 代码格式
/// <summary>
/// 阶乘的非递归算法
/// </summary>
/// <param name="a"></param>
/// <returns></returns>
private int Factorial_Original(int a)
{int r = 1;for (int i = a; i > 1; i--){r = r * i;}return r;
}/// <summary>
/// 阶乘的递归算法
/// 递归简单理解就是函数调用自己(当然参数不同哈!)
/// </summary>
/// <param name="a"></param>
/// <returns></returns>
private int Factorial(int a)
{if (a > 1) return a * Factorial(a - 1);else return 1;
}/// <summary>
/// 《小白学程序》第十一课:阶乘(Factorial)的计算方法与代码
/// 阶乘是基斯顿·卡曼(Christian Kramp,1760~1826)于 1808 年发明的运算符号,是数学术语。
/// 一个正整数的阶乘(factorial)是所有小于及等于该数的正整数的积,并且0的阶乘为1。自然数n的阶乘写作n!。
/// 1808年,基斯顿·卡曼引进这个表示法。亦即 n! = 1×2×3×...×(n-1)×n。
/// 阶乘亦可以递归方式定义:
/// 0! = 1
/// n! = (n-1)! × n
///
/// 本节课接触了函数(阶乘函数)。
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void button11_Click(object sender, EventArgs e)
{int n = 4;StringBuilder sb = new StringBuilder();sb.AppendLine("非递归算法:" + n + "! = " + Factorial_Original(n) + "<br>");sb.AppendLine("递归算法:" + n + "! = " + Factorial(n) + "<br>");webBrowser1.DocumentText = sb.ToString();
}
3 局限性
咱们尝试着计算其他数据的阶乘:
16! = 2004189184
17! = -288522240
可见,上面的算法无法计算超过 16 的阶乘!!!!
将数据类型改为 long 可以计算更大的阶乘。
private long Factorial(long a)
{if (a > 1) return a * Factorial(a - 1);else return 1;
}
20! = 2432902008176640000
21! = -4249290049419214848
超过 20 又不行了!
怎么办?
后面学习 大数的乘法,可计算很大数的阶乘。
4 512 阶乘
512! = 347728979313260536328304591754560471199225065564351457034247483155161041206635254347320985033950225364432243311021394545295001702070069013264153113260937941358711864044716186861040899557497361427588282356254968425012480396855239725120562512065555822121708786443620799246550959187232026838081415178588172535280020786313470076859739980965720873849904291373826841584712798618430387338042329771801724767691095019545758986942732515033551529595009876999279553931070378592917099002397061907147143424113252117585950817850896618433994140232823316432187410356341262386332496954319973130407342567282027398579382543048456876800862349928140411905431276197435674603281842530744177527365885721629512253872386613118821540847897493107398381956081763695236422795880296204301770808809477147632428639299038833046264585834888158847387737841843413664892833586209196366979775748895821826924040057845140287522238675082137570315954526727437094904914796782641000740777897919134093393530422760955140211387173650047358347353379234387609261306673773281412893026941927424000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
5 1024,2048,4096,32768 阶乘
1024! = 541852879605885728307692194468385473800155396353801344448287027068321061207337660373314098413621458671907918845708980753931994165770187368260454133333721939108367528012764993769768292516937891165755680659663747947314518404886677672556125188694335251213677274521963430770133713205796248433128870088436171654690237518390452944732277808402932158722061853806162806063925435310822186848239287130261690914211362251144684713888587881629252104046295315949943900357882410243934315037444113890806181406210863953275235375885018598451582229599654558541242789130902486944298610923153307579131675745146436304024890820442907734561827369030502252796926553072967370990758747793127635104702469889667961462133026237158973227857814631807156427767644064591085076564783456324457736853810336981776080498707767046394272605341416779125697733374568037475186676265961665615884681450263337042522664141862157046825684773360944326737493676674915098953768112945831626643856479027816385730291542667725665642276826058264393884514911976419675509290208592713156362983290989441052732125187249527501314071676405516936190781821236701912295767363117054126589929916482008515781751955466910902838729232224509906388638147771255227782631322385756948819393658889908993670874516860653098411020299853816281564334981847105777839534742531499622103488807584513705769839763993103929665046046121166651345131149513657400869056334867859885025601787284982567787314407216524272262997319791568603629406624740101482697559533155736658800562921274680657285201570401940692285557800611429055755324549794008939849146812639860750085263298820224719585505344773711590656682821041417265040658600683844945104354998812886801316551551714673388323340851763819713591312372548673734783537316341517369387565212899726597964903241208727348690699802996369265070088758384854547542272771024255049902319275830918157448205196421072837204937293516175341957775422453152442280391372407717891661203061040255830055033886790052116025408740454620938384367637886658769912790922323717371343176067483352513629123362885893627132294183565884010418727869354439077085278288558308427090461075019007184933139915558212752392329879780649639075333845719173822840501869570463626600235265587502335595489311637509380219119860471335771652403999403296360245577257963673286654348957325740999710567131623272345766761937651408103999193633908286420510098577454524068106897392493138287362226257920000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
2048! = 167269193191001170516995246879367623401850700235673655982230529087007497001150189464562167172244191810665887847061637079033572657587606724927176064411850673538816702094852249025170976846544894144492238547330879766103003737614588529869631274547146786486313136709493904720895941960615037390908827437698953474096249623860359480640047349040733433804728876364450963667628649245193472994473426299983829288535300331569658839843683941937484701719248710449059649772609232826660927442513874961446552519035703842425586329739136571385916008010499692353806298527098095619357949916717757471763375079695338045095734802867900539901811438653172260631408744187119026744886274190722977068970333058934735559698504818896666594967618205627427915668047813731528741984434253880829651365185257156926079584550717439298373834616543222621007932030195616966635627358210950933249166947190176851856626721766355737249649913525261767325505033525707650952451197669902386791427505854373774467592511445037955157363519844046070866012323564203247053923418941638476980895731673690269105846605963819878284099117073715073600110089079910239267591220513622217926920931339913069942301627691548028154720203269146609575157682076398045793038415042524529319710467963856177837558185933925900685196829348560910716449478050894130104705347519687402278780429129026019434214905354580682873162986740046246038598314168114689685857501050134492203190452427896082989429524668626650741086133683100285358314171585888160808657686833198165689617199176570794580594861549118782788264227169691791347263308662634291899095808175352666673055949591557628807748056299521597721933276401879259600207078203739783302354022502194460658715129277239489679570253190443510863937928258341813889673260710017639897506164389015195471697436293670556508944823627700409290748710269779349342587535181536813134901920073870552977622575556528345288257109379242710259321033707657002073809143306233535883750088962826233934576421995210730902178447093793160171627356086119361696607654532685304373715059901418912273687371106661903493110965724766007030303870277700083994961152287619313578287965106908428302670288859326911083417287658478213844557845922361261144224806426346987922659552956258949288101283104872720525023085898655803546626380592048131705867720734250305987681851326173632820163600387388398089026095858587764904854291170517090545362244570703885801746023014292672387375040109088651831279314994939204259824487691682661231343556742236296129252641239314489270072416416549932943048773654041359683229482796591192744407118102930670207618586551539454897832037593583882442517560181784165466616793266976983033634130664709045324600902327938386725285995086243230922494951386701173918319688395401655894166911689959525666459610030336487532811226847600197599099346233794078363367237022330741017754910105473671628337534780107084659727978666797848881380668633809988337108150512370914765984403579249663948211831376305688321379358431443456667195971489954005279332440019720317478881482193523834769250503063761868645030042252407951341026394430900079291938697570262873301146378433667503844425805937180871002202437528936895608469083367673199107442663630415017388768903934035674236405734062929156099190011071598442124521987854112885443963556185486289803374754941822528490518288516883219558122342523741976035593565290858151167088514316383423587538913203462632990060848589619930427250130428130884988916940638013701385075991330566996305098877980737551992278106273979311186940103821495400181313935519382687311666286856929354335347961436977426987638588447802144821439555205618073937498757307837188061159203981347318152194748959091212093235493788916715388209822873729588951940265253660059695704849699741647172533628588515596871466021548739162300985307143733129071686063097871954394342828399474722216537978868354775837798505520465938065648645012947725939503241475642256923523576262501678185947970243719608592625402812051035044612000128854163660698380721903388628306255117259081230879574984377360678362642469615230376812458697494087512253639549727677777791571409722171969421661069155656416027953758713000041815806570217028451575202876187083236942137962937080621987614123032731606781904254337327428221998691483670099003073108056738845992787333862413262589168163260674385337993343700836872004120669732156188963224065093100850773700462470906303131937560382334349997468350757403744335718854601575454245391401774015005518272801726874979019267349249602097480915186924984498959314184936572815501961886290417901595709001715157866529304118201049828994959092957467230085568207825160359576597044939531456250996897793728304503301986664974826207148065579099704589596858638161672280719273932556915174040025823485583427043874325793893343221010172613515662279283702259217760717545402883347162274913641573329347722091780519025801297201032612799322717574776178506885916555844224505711135948732252102732784827810585083122193635922599881491040354230967216654731796061870931844008552081037414143072843872955471407149682930418194076245284204274086611926846723351201777998483690543807511643388936308228593127757114645345922523921559538451340314989055523539009171241398077499560928811731408904581724401522402400390760933003529139272265025386252056773385300278995252352046095863967520848774577211110041904438900473448028126068785755337158310807628322116014699696668090567733086561902838770716848362489206927133868528735328455884800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
4096! = 364273638945704193156582747031164692057124492350985542995093848478037874935832413874911388522601924140891623559751804416272059989050947403083905593144607140864780865563877083016858744291222620028736518359143885077476828236052811215226577977366900003486516084407006124804757734802670252003255573271909405070405489095939111644332882127299206876767540287827143344139131740972056353826154697115312092071048875123602717508202331490356780500479545365440905612916948636705878725157544232003427924882523487688053953194328835298217036438745983226072486172401073086432340778391528724436743763446801685568833263738639580497693486499913498951789104908975441457409757087583463448077112563058862371618900940163633053646993798805858616415177816195672825567716704614583969786253408039236584854356908643177953076931301027201621640265991660426111519501968931122679609394928458398078100113442228613143904163956274722899432279182381175801431729436236647788828054830138775105564028503534206213046181660639686595689630286641598194855461165121960746503127778591908645352536976469142211904390782083457230155149002324902114496694453040301645114156085038405713871745252163181012414117847330924157706064661223486314733327431651554796556720258741050554812638740054596320919678135257157165896931704333085482371580601686017982399210625094851407596769999413049147266421215221178538844539709568640555023490874879277619942955696541293033197148703450477211713369242157726411517927388590616237286137120137042922988454003047849833760673016223170248398447842606260592722174490055358838392125829991214836449889162856310294197119997515028819431794525437180923381816442983789306703885638574343065044395728670113716355992964776736574971199568205480928431052193293749489177156862427223816287254733997372828715556763095744254521708286724240555013733899038779826830442052344208753357952887977021815033676959461231434905044519497978446883785603791720709320311662885681041694000355495940965566640021459509370815198059571878663002675007914091395105579429388210632420577931871329120168819948075375491689564836729652295536675468060137806332182604573631470946056208612968224344233898994836471445548023771674088047295116853014562072695023735534150590123829829023175320390898489714616191079152500160148312362385386548148999469239630259588685715940144458215501540896469816033400931820262017453457576313658258905629556656958662497665454332919551038868983267629896865396428969672521341013481496598618823960785897291905907636941294725118003292772188372632949960664158503313136448068629511935929651312969971133661409649040128525759029166129098087692872504628099670816498692264864662073433571689768351150810237100749684914817871679652216950612271232355403134085154215987627834659294948851788367105098669548657248660045515752134569765362846212796284409822804210093887097271062618886280887810191956739547356974739477224875961580186861549824824196958589394220249002098851590676178657798938038215126965439162933164022458962606534189827026386527559579652045420753086480666955060459395949766802238512929396739882827244777215807217286605754761993027464606060793409248319488688259841640493639590264707610618381285762382032703110478990939023730832983638989041958973882775936476920301428047744707561614824394442871976396883082630843110487402814537646791228130895046515045914391964275592231149601779853217504346285499321346930041336747875962981022858924946156006022480445428436062909030983354170826460690411699726669245497259756396116418648257025392950441991738155664280464228672219626440161050938738949600773145044547860243262059035557928212018966452513951454067335909371516648750342969475904385334395114798845438648652070589306591735448823750935347565722954365113052262359425183149146515606586288552808594755228662940137802326522460887967427444104878239898934041584963997626302189888067973676230201690561635628959074046073991860219431450987628441036526644442153282467677719384124811751646525547172746795372377699765838269715139709926420324071644994002695873706011010084140358417913631534698206709614694213091003748850519174754219911935152274830950609486240122477274949948175361325803965893668756476999198477393569483983568588015568938889925410408979078954780434059273785668929010253607072432304293854066198011048083431288219540451429167083096797393656114876886620827072968211125333515167730503439910157885761326190575889178577457489053033717525920991367031651512823331004944993233471280319484976902881766394475461525991737720009115652978418284853009372535302633741167226822951281670323446947301371749751420115023980455620924032300629560206166445878040058150999740691018322106737571639250383698914898855184176622054522420001452078604195865777221288628762369966539502049672383011548039199455120250348602003212025393162336940063591684394080912559276424035181045592412927626064799049758414488405977573013263504105599252090446182272325256729137346978179219678246752223880884692517978816838410176242510866271824695293539565621187107502766152511505657498922927846212127960200180369732511088739805534344947312318447795091991564251268676423355849668266159481493700856673636672625212289391277075680601451021972410264960757655567603555819188991771808172057954892007215261170873726241172393763218260229718814603574218473998207157080167047927847516229320205078788004467357272275576623074184484920981754172406980963360979187075078641110772014094850639445341168955848573268729666007205934602411993024705007512800991460542290401458775056425199199293879762658289393632779108744631811825828634918818364668835053658683687739654870089250799053156012926397326249513425680157460056792069261847141849344594437514603375088484154934859399450403643927321803663661275933332699744411959049037476388595090458823551609562724199182791494518499219590644637893576786219670656962453751416566885966000797106011597388451804556408721378565160521434260807651276769695192512605683624612339419683266617007807585238172448106626580825372163351752798357923691911782400981004194131471737120941029047130452335046010835366394163230324532235151131836349998104907178262819354606145923371057127413957229079506399247930047442055291984569372722568090903922877600905502006275568971114588835937431490479735519535592017873975992754635045877182883946369955211136725311999929461773000875067305557158363491884187912686093334000334812536706414392954068309712419614939329778124590484559274421546432997872869679550425201820588831987857423792478480956079306395824738844157868212780122724324471096045186036747357174095125531851631062416897458269485706881498083546029121123795761928233886480672822931253264819154143116743426326308896236066022090819463632583033276384395876788672907512283546259944684635596887511928674690753598900095915109530293413066965474109133708090087344454002729407507277439901610645219332279546205085652659428993425095900583129656114076586926168599520907237515791938856503924152004989486488652979138099816470903092880815289483296844347575278701783545632344711640083988043013423170493495843625211966405184791690130270861260063044843918647003373254528983002263410178035451197566047451677781001530494060689889172831358155330093304553073031519209150437455115786892798951941379955590514322738783346771892369848180693765920110881889188953398072833139463668991809952346163400688357827545954559967898642295645786741172973794455635547430019574153677416999940204998994683922444397291442627217521150548621573299748626647720871722457646746446585504950815942621654065732528495710144767280780681975005931343861868852999227165145783822248312447440025236100453880042895705751389247786408261926539493092831106767328385056104734119090262256541935513272374278222533360356526001518198853278268235351907046913791354576635220772299065755245339664536104617507130000299418224976537843988181775758175766915473299209570893913289990182605820751842909315450390053892128278375448068342740887982153661592177649487051063875435823974487047091135025131037525679147126867537230731708113072742830726797331042729558880781569365658606412909679009266060339461476868527944199151589902941967738761944286956393265025304324417117941080877061012470638512215856594799982587116853772001901644033030819925204925351466014615770749861793750685507032845268370507752392073141363431036683456418500669306205736898207748589212504288123962047620912784875198286222456780717439579938621246414756581890748398892938904053872570926194129092009009558498907683845225486837717259122688824397944510200353824114622253249620463392457557302224921732629181941791892054650145621955009292833905044736855789559032224182361526561480714697726703442875949128573561172684555831376265701163152286637155608646529110874557687162693983969652686218087361243846848101049434907943255294959632516097510610420682293639135594874533386159196293499579648733291992792851778889369765189231928086308943255036596619624810139509051435798737097971023646955660216911494610739730437871421699334289872805488751634810127654918579785467746109172416838021824423822402204401556738361156382739063402418514383755371682246015824002438099530639277855786166893012748129579184756313625455797647322137651541260924320449330182786554734299529835621123643118919008676367706175427387124468195295148414388024957301295479209289005664171497396770096067930625703140808350348149581122926465261575170598109793261137181522559061159650296254117842888365186176459817262875470581752438519477484578567778168313603258348377717633591791465094930330116808251249245540110372237590783368451668660638377118815241903936517979124883961377652571987683959622904718089890707844846177189198647892865742829513920457060053618591097952156052158910369682365018148164631407150543372332392611228383225697881990279647532295566423275888982784519564599208208390035117256254892771716252605350075048315169893033651546003389723866649229912587323643611742592582556155755951518749197988850729875916543688991445163950759486808159838138834063924583076393341736569942961807248081327861638158165144222651381212623229629513931799055727185173553990703982396436648001637015114745652547145224867806480184609154204029863948894797528149178996087904525173509905742380023107676728164986130437527136314204606330209454360381496598857295036982221439411539623525601187949690398497979176553798990323672605493962743256906584137441988285323199416592533725190606455350257032476757548008055194404834714164313669871426392367837325661791396498502470484687737816463081830865145459143722150559339053122892609537294089238806337761371418148917591519586101693856942201752897391828058569692342326838630777017257884843221046778601795120613514323070254165759045092472806728375363558685669234112805888796861845782105016945267506330317174479943199423165823438165568592117566787026426395016563193985322329322090540892520145213308630572882338325331699213800200751365176851915234952325743570141012210053660782325451156645514216617305138064765818147243083294802113471932282687286002243917812391971067138390232515026329536757474008913182496488941350746860321588759077957957523770966920151358424413016483038064583849116476056414730273792527807785533586813629589541976899185560373045365800141385442270907586655316340036604167228976000277130672412811873264639505207835166227875984511181175251474527057729162186311247044087962026784363816027773700455019430772369910299876882813803795235741523672160476690898455450453556099143013063913291525822657514008124436646449755913874174049422217427857061203190929390099015187993316990734821764472063651160530351996144569828629496706962497160465582258924387170361070889007101722338326119213769299766240721918398546577910638693146892477495548410231826072920225809806629202490509139539829520312977101778880298351947911469925091637531055199840047030511110891105788079670261914250803451795008703599664901702662077476238607201894008199372197378412754960851836322106500605575411996862895235585063984260192096369375716781254292857272352981928108827207040151749249157190137461910549106058492054773376295749315740021252897862578264065069508535998026980473800344207360000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
32768! = 909288629637420947762264278419827186689526599785810411551641432940230147369518835482233754417412178786716528309297890368852524554881852141647791871153315736034002484244669654440562428479978309147097399938222117405013930852429484685666749341256326405949821744095644374594011255573957120190187318656419026976708955632021117746124480081767581341324756153228671767382431035308077521756621467285809817956733695639932127155983363283427891285642716363507775922159795356107511548508539944086084396913586685269594211800947594993342275779788722136786569917219774180119074263674876433929729911283385274164412644448905025564942680587851484117551352226519504750208044713233059783794667470923278265099081380392598372967665812723888555028446583149728105783798985248541399047323845439043478495624464634245841916817944287895700792497297336437484859674222891098075112200269905639366108964316351598458920709142156533759560182422353497111083073204870956818906764138136163542359407777386618522567084024329716247721184224789162582821378776860857897829737722886256498349088427480593205438713325743794528052965186974175777307938933307890361117680360134767835638050710110214655229987966393268714249991495023067951376691332600076158843883937236639640479493985823674173062642265109311837052893216818785697473091612542635386869950709582663091746466358249249934838791550786275233346354100286849212379707258730554752197653385673693519687859436101426531745136001560428416448563171802361500018344671914524655292893681949865488960191009214018761472139995130694074170617271330021083306228676266263004334164217019518201664020800924679958438541255664499585142384496097905308497384272230161947357464674055430005343350223521021675051531139462238184436902051626452309999930467934632393812413014306290917949998877596261974810726294923224659475770210130673327308794789416330209174039820734785251545553874463227272036324027793337324232653751401178275116807487180957545745445874927986381420413555520988139142783755916001121469250842001977915712023039653570522305025891483328057641074575911546915106189977938104088154829037693330314627191557272719092488400752379957740034652087930873513337301299492573849066075913437118766970835751607917502230932325730437325277730270804272215707701975504604023841626305725717912283953809276768593611279388722349159219010794023078031551944389998764309313460559864982509959998142439344640718467768607429746589046323977239101732781384363995110917267640104602961476166441903488381188596838595605537393494991542465573221657873231536549201913110044047276974884400440306556146072927487364081275912617533747281477179830036808831037451947593033876383519821311416059885997038069013835743047631759019889351070164809853405281810256378412940095811849804087866868851300690488078116479921325350809868239074079715528637717487350523445001473830211246278069753392824730528655211674894572907140571997354869764520334516808414407431806542011804713776732711915919760623111160363149382385448771593948530581489591232299234530045900758282498219092229117334262978613322610177569983718034591893345678148261031387803143423924725187155743608848892170898183811548077475453575948726027883840538028669925882885980935611450166555253142190679948397290593820861464919622233898653405757056772103881477616267952055490769525920189814798367663329200828702939185428333422633589623200252148792194962864214294260089136425386034457970818383324460048472498976596535130725308596674972144653154023630382199845942236830656336865284838360477535615453366974660091929895945374964562782882077950365160666173321108788465704199357644901074136271294035784970699137823028499275159670302319879946886163675688198763964637215651008277002080108931841066218622573220280577503515123831525725165793262770514561298107231519572634396935787140070954596768948469332101078172445397770615693970229404504100436301762831743219142466056244832247865070291482007325680977981658589644673452875141051149168731019162327135130875685750197270944820328826575005105947814362773567262806874780701591460654785236613932100812253325889848454136339049820316150210643512714354951588345128816258656472328033074620270127032264857723016382310757829491899481552325618942159901424004558115428659256659740232162245030148670800271557034395202745643547973839038613018955363022369757709107367323192387076663582492664373254259711125377400173617365612197179268156010944277412108115694504284720065698088158026104601177391317451320957736037618764804086297815149671792725511886469934224009415792445409963165127973263599695464720382393657963842473309917767689923551671361932970712860764282676176339637924097391065996161008999427061000915411716424925800230959008012363831758847369654707855047743833227521555767036671488457094051372157558499128429782008941795695831532301968916053923926034887932056940108763446102631875126778734573285635137120791410083957494405028572313055659223539031620414285270218233058274043224825645303072200845977440279435012966108602320053107224819240723969997569856841947621812403166269334320096539456222360509254761859383798781867337294175795317144444211242782095959384895664153906756109129747286303280992495671240061852885740743750475392334063939929515643607323836238164466691114872622915555422245383692061548311715979246093944125265840080420541820241166800601874634678591562958950009949406075194635145544397626400542016272176564273670340381274102177620783453994943886247874283159936199780978731704712162209683094681506333860762801823744845794097942545652379896880337996451384494061676279966564372156458505254173273045979415998487168032600178489603113771135826117743583735700797351556327197489604094755494383308461283401510032315488035417542018178588284217165550075294845180271758298679952498692187629063442038858457214223225701109581017404637068202593652381622763012508638391979049088984428812058276175585416188049886813939831114579389908206798834629635855317005207544533203688666802513621221678662886240306798679827301987814151289734052709001245833209827579001945287471792165562113125725353012333238065175684743563701616364832785584731521710555282473234750114893940946826045590298648631199767644885526666315333217262526525380262372300392018698009022080510428462699545264682769386935850598331701440286163643533896596065197713107919864805994593125744286919247021034909544134746727124786614958325492105488651202380322617423597590818270852376788703089541070116647458602876758414721234542193954527581434801558082835407227221810633138779019181133449685547353746130583090453389376645091969328774337071088935974231206644806110059264922263419026804408139445945182928874887619271375849034635077590657834348243400896469127988511420304559253803101079801375706457469854035905807720220210580248197463196549237856360392869198975595693473394724972966649298248907028201306125340890544150369433020459707281006871115999415236572437596703463547286397442870978730133142257103395405477419328234983040015587928650549990930139991759035832483641116044970224543782006998133215110439052368935681109765130078134713232105369996469237342845053483560496529658597180148507189793912439882804350336190919314864251821598481248479193777110209019585196381362099714632265374020798159548762246843581687235193475175184001405425570137673763187593923585493855728283605512740629907549622708893084295291667133800700380181047433853315452331308648646470014677752127589240972538828006244081556901435251579807817187782512205423916403293220099601058733896825459082283452411927091524651908224226939065864484240003949993435636602873364534727468798297454863230445314775606001552652018230305717080071778252124920872623239812870181514063072644825666395608902906210652841916786812788620574183716834494903016698489147542654367501545287661967317340372237847565219693961586504947573910437274045333627427374917930202635025598005283033140252632700677765648729535119352266415277446878163714211379065886460683875651311255216928269595241397318301694549316665275477934217327437872127471055305896171120031821666696333534888270182649188600186212379279758700275049594034924591603809320518012858080405427775904736320157244640565590486931632059560159618356850960764582467622041935924637038818695495004774949323858926535453798783019554474119039693688568199663881410591896200310269880102987748253225224365789105517317208982914309578380407011107312512172189089173846831413636074843875506302014725067130855807748889840725119863325989957310698993638726341387808412847233183573942151179315423233866121211878674210046959804202211137565301705898379554562799643138036320584580655640836432977596034481354416214368208376172019625954757299011173428545596001346751245189829602264372495196657255091508136953149976891819212752508218838826628046523591807818909995405176405715689480140331372922946580516318134776521621232051336248544313124263196129864630862849419004922133228563116164860780733369729944928099430246571809928896173873247931480947791646128751415055885119650474611963850657510022472905121707183923402099955719991683625601647629796777589767146323625517982987745171354548240595451208831256832350181111310212176065663125543888740753866481946664475615036133559369290173459805716869047360568266237213213798455772871117420672594727648421698330795990791842271827881241774835009322122274074711577770756871032352943416394608999952027257496444371303513709104660935018707079696888735215831168564701682078106940328380372096651241599874101218040099511070020801997456572024623935364982622826750310501320834814805602643410387551528535905174839058535747088351908025431380709298214876569957509925983832558780443546697070432444118784954422877199703022840972149646969499282303414364068130639277014252090124776489885638277883775081612906321679725392754180187424649164642386845666612576651262432630424143416647291638023922780487580854322006456852688484978805985239341322459605757146667789606017774502215346560087867920616076162767276002271805334730053307284278863057175483628710984306912994440776156517592423404434548789837640914269474153820356414934977525854621956498039872430203559165647939762764101850993255837828180950531602357206216186158904510724584865137127566817134595610836287852728200472160774780354544279382926624250631215217549859524916477900947225761923359739375556428810522416182968568107865665049780950282852000759205485262223771186480287720134561588100382426325948956358005364518259424160276083225214218374532413790391806493255907257548390850385394126097617044147666112691997015596100229614705800826969339072127871621754660155427309967500626797215882109505497961249395371958304390722577628347547805516079959176463966285788767486430064768323713309602600346964957694229334610172258573055602019203258876114171505322684446971436196156527525734747044008703093916662087503484331042492666098850451526148890571239416451435203093896743373971684948517963213423607660717353573836371655643569830178888401704254983590008681798346009355842721471106689919230648884122780025159232941372433365893911234504203237297655165593159793057755837275789365505470639947817703140534340087194870889429772850000194141380098386848564384491091375536815347556625474679946363986304005817775249362171404606030048775226134961855176198486155789904309414021802433894971297962837011609112565844930559193408401554564810931182959116479595385050945388875596323172894491984272337871047843961525274943238386331441700840855741638996009943883849416155579512561565211677037453270193121221215911054887574573731973219459095977634564658184598559938262390443816643850013219234832791515298274148617545544408284631466716142219796916529053441167262509339928751460251503228885050604170075941676687467141665638143883818918712316175242442808360202711528115087024842363021978923458296289771088094709849937584927618613384640960111093156261614750884860399748115749265086379966424210607316708638735361208450809708586401321367907686263373233729201229802379635903675640972114624279780774203633384553575711675166878845345213648289334073515850999003671747639648648987749137287469857400683809827016164494710067813271824133123431413457130876465943229857098627293518899791535316574630979708704751265555414548328422571113402616942111398642236736257728354072798667171194911580629990449377176959710377536207992220922533254566117362314508527929392976335863835369554950128157900832131301521555161474214135519641172429476593405049990797487743673090794883957102623850367250505988792098695948484516718254890031545560490262995566201428560597688341107728226510345168273231739697316355913753747730478188606067051578959103863252484291259199034069475008036116796401106454574232750069480919551479541322526750647948196407378621677325425301763058879313860884606081093362876192726111005387734591190496189040046656148703176293323433996787336205710092512187418785983278597961463156396840957881453215367923845763298999746652553366699283591714827677704897954127022274632443988330645114750541736582643439051913485728404497794994920651969490112032178140488852735635569307283786501055136921530702640325532911253665983151558640156823658089770024692428764781142945913443751497370122913326630554351964900904558387512208582456503414133877154304947007015037881320703059618510522540407331991768055380874512681447650653594357847138555876840908987016707177186377562472935662283035509756034375714480385243043164868702069012856756239805065648736711696783042520231777025044550531694046634697898033442198758263480854316559571827246531028545662351155761910575960889323767864361226589924295195922053215471058542252028136119757026376284483428689321684150261296403447256994915440420074662782674908739035108597575218093215668459355797045867130932810669806649851901518921695381795746613420595940282520366808017086369890650203635942941718393215050296758726151790559983524837495464678511598182879431935564454688838350833958372201478674869849507072001561612430923148198835818631646670275775080244754097773925084471523308902500637223304369542665003359765073965763169831947065405979203543488404498474791923114514105970839040595668256856822824780878515595101190583405592145376780058503442609989215739434184870925231479733603878239478541344801317254710801315658364555024718250935200764029084504030291954812009779946990868691120926394399352366523144145999308567499646119775116391943498586921631506758445850289263743350255422957741303989792957355195669799684091549739300249057271509728940406887995736784466197249484362485103729563393234259056259697013336215962414542748249684163066214869626045222946661185314941121478688909756208147373885069710826103472526794493748334416869309341707618842364486623817345754589913359703760955630955960740586637168647019124784626564116510419419200822892709954286875600603229616059641843342084682208562203961342521887853170200803255691757552135536674981883130969688094865636160182581182247656545851342781402379330186282263165854445957604926006732358901285120860122561494452242028861014751497974097721718337094825190464892815821942345848787315785988197800077247628627443394651777226216572154885300082498031898908235593645934084050410773054898548681560020166824511131006118379341559474109794377223331681229493292274639351028369136366005077757927101706670747877695631525204158130066732147405571176563153635835489865467803733121869023845569541481441779957035957329051033925614546600065073161579964554384008936183694410154110951888917682876707368058737305845760406897707444121506528319223851463428667653288877820803662470767846212227026453465354161456622417765885546413754962030436207386756916199519681590889000014839116108155927949755544638671899717226318522682050599510441590785115151407745118317858991287019660079754150029981156488508449975622710007628878148003347218770582604845541922694409133176413566673815313614156968943504598735873142668095951334611110627679716001344191159535626674868233948289799773222238604554732788914202750022729116605545656342606157194290053222239117704612842956246460493438496821392792259857207814592058434982882479020490192258237408167651593293473563119621372143633187693570116469154462328399474506107052825915322285143003034877245884646466321984563338279049209408320931243618785196388786118095845221667849291392404732529099785732434776087660256874361234778408009649526762465281531242321323570088714534248710033043582527891145459302624784483349928985497863865076726467569830678487937425817251696030771397104872892147090048940550592336288512086385308366202849802196045015949555247902335400569731949765644827260786546482374778009530584578519699958124037278692805645566025219330185251150410784617488912979100250486947640341941057728672366414910482423028072946877554212087785517783429203479469846758965348230080179330463936890964330367184804610655597074854067665146451818492724867317051346230718838177480247728466562265868658892236267032837675177675568256032325800869755121408359862353821656134484804274484372066753956255723412979260649547346348580508639603606913728039894762199885827007872444886125846281516543813311936900767312478199602575075307286844867079329435786832305525993805624731607034076959804118543741031443884110021462534443393852003294889731583636793893480226247609634830841959170759001490315292739535213310522081824581415670512594079687865412719236934581423636223339800418055757053892792274708268996534698708734080969800576905883006253280181362575510255267833800816691280771572810368249322953921960464741073203034069315717680093429331903732679867791368433470541872521783682343286483887068504887903605901902297948418347262412954172803767423922278148235049569173569796189109838458968342067332228185768836563151780528997924340307235590023889654127720335331273036759376363787028244094727586377562407292649992485342053308016167215196765167568633242443401850778387072302205259916185541562022268520652165153485331489604494971165796622742739512574917287383509874707968003273552400319566707296319260116036130045019923027837149919752911532499721804229839392974963887945671632517406574144510591463838921550908502720129471988023609389558273039508579981994714903145875593584457340622010712917028131296820969736155549900675727988437873946142844920841080263742771979812820587747219599956835485603275952275403272023205209396857069051303039848111001727510391418753100206368804957242119787562582834044801690350898029943900292381803872114643707775916576731256629716950169003733902399380077244818465504311336681873546721214720954344507774342355826384844526262115515097524577083391985097265666321901789137108821395417028929579899447835729184538800431530823265532531823159935827046737754703905144489573323737835524306214981295023343340490738852560453107767995204007243522366345269969397280156442636343191160684028124068682175037680996603755106378435446827193271696462717717589862099182049736076844308607115395903215446350415577165281886058876421867923544339309117132218179028178758172092808399731999132090245428067829836654007569768127285507352197452511767124508978042721617278655899301162629495794548063416008046535192406025156811357813715555787152185578707969830230937424017623665954273542490089323677877407858153589208363471728847373758755428329967107453872603691347337206047445985340191720426707854825256738385935172621253801339932145312210649261832734405508625077281441840298485279002585523391920329871054843173818513417194786764658372628374726824935271648798880257942954684258585252836543970130176324663249873301180174817386228021192279631663067693108487378856740280533821124843704577761957881642852925799496235163093174500206749881531937059866693553743553366697457057465262959400439939634608184872045968581677095661431118911180523164157369379799141637640602380721505780120945871087585751322523745208039505319248460804832167281396043762339527350285109284290848697215414015685098681193945813710499312334976545090620568808969865144102246385976854156024420738101292870060198325532589620060936568416891899564902010526570665320762133849817449310858791238051048983131909162304596570805950222329045783879915541179500230628472280180503925905323763331474760896474078436211103148603272390644328695341507581280406545469619636591614279716533997311837264949619710434501510005385141485306448902137501707704869285938442279489647182463411217922214336923164905740527518533682003756498432028338181512537423000804461333114067165387568577030445834628093287378670274012492955709708283277826423604763023254841416147702787213061246889552543469092901371086027754235062656300424607663754157272677702827685130418279231868537146577517299884185857807766294732651857755968251035918820143120097920570619579826943075522533578191297657661188147011247815612555511033787406058045297459134927827765841103771847617023917032774499088825246585207206639930073262713254195545067431322958104584568077995120583835391388043275963953932484960757412698982915192031446067602254567599352925486250775083146389712777181326967151393738999560415209871815022573888924398065024784085063758132175512284808482674306393272585912795825306662392633513224504297482736352769829720624671664507360429588988204332952035796110150128426559037579326699725007919742181675382511378406849803763300747045713527864777973409180019718378110831604619208303459647077337157116463180064891874046759624924619135509406831127084081229628618725913770483365607418841834527697174655396661105425844956148341855550257950720119339622637611630668209199277679618262142679989259224102608430370152006954369031042725341741860281199871368257101363336367405439265063804464353177838307872767778294414732939931799440339454579044519891664657483064942006734879622943816336218108588483728435261896698278938775404696760699360276446929557901114358714742387084811682088096800619795957911877011998488675847514625017790342885119576295429601634235090343572356188337346664691426158234205869217731166820201948878351917754892163553544259117034249109480041215305546026558004675795867415257010854393535146608453769678489386338439225917655303574914179528651913982187086497410322261610035999174647752626368081086297029709968519753513364765230971558232441946862250740168606600887363465853853482721992512111778703270370950126756339134650402910719786555193299519816029483694621550187396453077545433937158532510343705619036616452285431503667399006824621073899102199463118274123470908322179237653046746862807951770783750332501979463631747389324066906223384077100105968248135316817369001240255547208610296156682784132904117989537897607044790960351997458168927790654148208972985166742894667109898445756662982004729957795732300055748500249931403326046343044723571948945887481556184078389709990554419851803208268732996356020525252416158947680872176129153002272399183717865060637488916595612752735742118985254812069991901646002520102720249848876362800857938133106322680554879082384305175632099583493881800860797379587844698907131767962689951590401403721460074511771077683476952441840280781310434087845915476784748117273100068050023751115510833959057378418158222906434573846129011433219704969050379005656959358607726861891768308051289827113316230154970839954934962249657389507899153006140118495151761356815946013138090878501062304306456755395253758799360223048767014000915155680569314066196973951639539186202299314304061706611927397793355487880841607859181078796384385291787761042822965759976072154951047330338769369686998574752656628078545166830038453902888967879049764897956983045237739724810778166892743397316160077363553032866203983958261832954039465632862550292914281621280532530422949620476041223274490943554405008793372816582793547983124052882612723448532648822673398449823035630737169643116635858193389343226722320013691723596718314197717623945673627545554503438422392105621537467492106016770396447619461248004754539353913549921699132262444597345608502397477381038196795820776081982191436805317352708198446296412268321310362589801308635997354631600628296239688091765287960039817805762227023324777597484250387223254835758557745091509960821479097056341559916231833900843432847406634217668219291799951196460558049159314430552441363399654491348303256558885982007858726936854272822755640559805384001449034124338278948192114696335944805650281656602157455977399702948645306792951223210173555053488709900043091389069526076995539550406883274122574882135969209720500803295671998555693556497267019527723299486095841964041347149176691387642788817174573333138367925801771601960813575935995425733242935993754779848881055144959510294457392171257872355224702439829055911408159565573630450172221765912339940247682268135009320493179475184636678944743441580427013244001544607531974349095042913506333791366045716668938676939107383100181800218931420180625834762643716413894715836166787558475424858422403324121490473278789636382897058810538920769869221288974810981820656737006707795534641516417576562033121826471664565809408753115907412386689180077906590274679841244670138520396945951105742905168019967759153893279722338338236453311789307289228884590242277619982119567240298151510815235732526408950207984643391214120691349254614377028424291958512325791348809574721362257097509270814048881285328349777364728045775106620972162567404931283366764461690526415209788141095140351230877198832726980824442160937659458815260163021236355125160775095641950859027688089032198332998667064591103978145228849004779256385643813692599755923821356201043787454067733827845868984254009767776430737788728865868963094906114202447431077227959979757897659562411407315512412866653770005868232218087788753267648771006888149629104846552587693459794553183194815108098794300042681088218132770428474922958139076904595968160098008110733188616368182310996999444848160974822282555560585519635550299841864817861221316514791393094304935086467893042582230126330844120702539726015123061281753866089325755589741247600462790398371817841009186864083727980118153165942496359582103777886527300423623436150947479076368504581210796889760893024325307622401247318300433498834633492386472175864009358686230835861792476313615381905526993563880895753625843920471690121603479313308433019443892030682807788904743295166783316018474731098237232909880950935914616376873909978302226160399875729176842987591260117884767942921516405915931770466850943575064915452622103863518686844358879825053935209909163967880640571651998357831808473752032353769745041012317549172930902561430607176937427400917409865847472335771376945883783984817894849780089543274448737851742584298545644564568037900543972778247902371945195666429951974041933520126424919479411233983486744833097362819137445385560634284753948918219634787440394781144119608040684451606193177490343554480577584192939712751118875639690739719361257492710894023245631341964195068853420019178837926982420326251970676071345632010725525321315629797888591364982253778482983190802394595633462304679623678514733655165504393032953615335528288982150242065277122844099428047934803951025603883415297466626069385937751998737302921693104656804661497064486762137231740043676078860132740037338836688527250155931263532240055520852804008090107673296163751576079906176083365934602787162320510024205544905950226351792767642007827435225399958690160268013072533728819035446804797890268792823613285846086116870419946298236116491759388139779522811342479520188173167060903513743015858315140966893722874677979943207697472496237689566726367263064607124082971314804869785650999142232628289545992569233911114954309426265847214574770129023059002222932097960803200779673920512781857523105279333181074992947242054089610643182573110563750474066140799152019485834693464098189866831753251763239063951917204213375450063531981319507756434664273001500257377081546763481405658223734447666542708001691981425001786012063648451115501287065832528847481811785277086564275006762822006545468718558827492912147933163706293347513120611161667523114891872703637530621804787797674838539360596235842952390722633606544937750632111680232907433646025078302918002507298192961457155360915505946530925020661789076447820266163108037839851470781641335943904474136462941140575828420243919091709504367259268378743140600376280203860131210302819651250006018006302320747853870443650202042494866723102222536565090957915689727598302677743633854416467766380802809075124142646503542338686481513097511796973944692166499843924672089898590470255251957090925548685582784618906090311947175370432619517695753895092195529822096522997578464952041612390471704658095864323931279693181114259820880982729476102106846083388632545975870267020002824937582157553049872615942198398618427253665912136717551303734238607136380345262522414136881212799226725895646791300422467060836600493220016630829184551257481054173948159533607344982091386876523875293716752813316797074074267932467576399512850067591520773505010777762475406856629725614858876287706855629178430194535538598816992631641670107940906272026480669972221184747764311332449000538499553715510672573323878791548099150032641030893775721376505382844339754387060789751302470358117099095300454221100983781479754187086354276584918121027191461908407247222921636678552959166849487807730475496294342846185560558689983861294629210942989646982962338919210791237142430083868769379398994061935784126749997826093202940841506365895389188929468972758289783790098426672999670351213378820802241925748802381082359906864199640854453655331552769877883564484305478848719536391055233299688959296443094730290061546070597766257176923528414168033208446650229175199563075591177294833860633962700007044705713122254702774569670876111928293935951931899078696387793437321044735492912959610191857681342801027207653022314814166522998231363478247148315106105722931352422388563196171316571264943815897175744135463285616807772525930425462428143684684327790915112635004306168655342667155332740854330423474632676750866622281203575180032002640742692371086264036068067825062198608283408689820245538173326022737506058729551411984137154918772452081796960805324027982298994833635532165368516046180294988680105394968189902224589724277978893938438549004198180862463695914238370009376243212853108000644044064446125055211523705832597913954538098409073461513383842690678021585995235289038724892808072404631334436409622591403568010357386541823941099459844736115143247747956979864628791525858529934625308344288467640566843228755086423681753440817912674014573244241801684707077896396046773428712846731617823772433549959248189194089784474596984039542549563594006505645291330492092434696940115137938719617564556964677282908514419972868215577555189339289936644862378859722804387908672605893819780353984007619495928243097525963354808681987338818193313380032247046972150001063211453989791048598247388142261400899018973635197128313908979200213548610455394694327546668413601186736911128524189374164010735967156540560761207181912004814591093951212054771209964481338896758029500930380555575591708027347071938277526405193528121740572185653973771075332858341972682186494833591301721998583860747689012325622466871317774075360670838782914227747687288349423755957440855917185838154630275091395419313615820101114291893144367636443633052368371007158090711485192320943372934868052950644041324140208882318822652445527362150546624875218679150455085033172657115065286222259994385726175614542930662968912400481166516378304411742728029452467137515072064007172361971836385552455239985583363895486338433329803224681243273540809444150133207792024753402222696131585393987669238317918796953431585416709121080647503031952721847469356893084230885794901087765688006089754011583098029143084346436656812017951189565192817193375700390837952212139633586477829622162954995476624091081560099968537962359027922331461204399449250274923845545870689544789879233992179441400528610094204356864954959499958861690436763086243751593526531504101040834950315440207237406891627032338469634379088537105389423382814239689529223298030296861350252531837244005526766070766904228021897686514311038179560642384676069846484544585360517761285500397276462567888614132331684920117629882490986113942631746243632638334393089780622701223861322252569893041551866370145728826614998360386953507777592071138313570228242384251556377751631033194605055149340486259400157666925459839457949206047663736027551383339648840048695644398296687427275131758624468924344719361613276806897159037876244868305359194662891343620843449805776806806172250875876393277546937377958578271731304065658236020126672167680427794049461467178806543253735733118520481926869496641410795999243855697336238409000951824487167365339388477374689670567905444879089336652387533794643790858932861352789949992497476955354910760166467164118423421355748377194183350021106243162943303235945869845590548352971838433951508262700755144505911597503851701612022557772279507072674086102054642027803123099168829501828279328525338528968210894308900802653101711491033228259754791419399360591641590886041223454411774461542753294844946018876364623163330828595152102684317849507221294143528156609660976972324196858176542492020997885110503853287247804544797051884089016028987866318500947037450191309972394536986713132996699646024066345389343818201907300824992201555864414647479099038724140219716063117385966382966039109766086866935151178065654340149635192048373119069287893184673776482372666672182729967248758282885586204212429000900856546012690789224349210808998997491083407483830129478224498620703530866429383311409436122147864161161156791094384659970758878844517206525702143890971978543349443291784006156404651312420224295117312096157565482744363311004865884226759590732153130881938660462722605057462181602489044595993057663744560245168779239111928107501151209470621925675891799194444302796582871418744197977566616191973801733172290345182081405253612440671807120363359767682559221234009537906369254586517570563429744661287274122493221064435278474305806758266152027808743295426146062903711343027399523685379041773943364020665531211004397710424380789129565782492180304593237201535842798650348582264620229235305342647169953166048835613919205628306659987385014862633806066147585246559809420838815581167823142612931094467126978086720646530313577857733045642566878703933918946752821048698520449560067352846570660533356671328256405127178718287190991217825567138035503471298604366904587172084067411988848683214982717725992716691058966967611860588890366333301198290128677420033959690235551774611258154711215475696610735444174010339651887548953346344782670647233200161608709727688778881047901528223049217699833651959536044353366306832799601144233028048729119925373488111100278476422526186861289787417629296553771860015096209965430565563513734259007442691632867148802876352743490480871696145704570263451593398177538979844517535839732456112180255969093328383751577913136339602217724176948233435131035647926349081024272407843964616258937365227183956170835411602520981795232620880367199498414286389736531385534819853274246976976586419246621127777254045080720762603804258261572217759646452419569416811250186325241385233011320172709400678547117049825843967237929020466582005667431341767922861854747167227653266152598358400594902450311145007181067606540402075641084882397845863067977033871369032116728673930971306911481623744061577864307392306907482368414233160393341297925716516824787508896477504236072271176111165531329940953514029201417449467163746545106729007140944285663796165555774893668940146290824613771513100690921687869119878255308914246174489005670678373597538817154984534826245255674232094344818053323955020129742419317084053064284726932045347205157433468572066229920174318059531817422145102448805219844713604414029916656429202985298318590095880089822644545687091736079592634523669071935163795856486873101015011911927497262196648825764196492193007431482984116839064449720991160401048581371767293415928621256968501870847817863539542676963680348957161967813922960454431695273984723882690983846301966455992845459922375263168406151429828831069071175849721234445536261040524795288362748980780494794634035445164038599717228897147434766059410230300337745673733123344010862576296872397596250484085484882539482498257056537971080514415884914834932704374698742921169664399211499341520558001381537641548669753746431300803881471076890612441201106722634277408057832844248266518170216034631043520513784388652499126659587186493941832801452794233352772922249630184450792933014960859022076806698892891500918551371545120431636823924488358245426738428179821743074559393044195868450104804511577136145900396644108479606123746132300390539000709574577229544317910398840410786050105263633103980290454585651336582774609393610153560643254867577658345518631770866740139986729838325388255255094128152477132500381360709568646985691508473305127483957796263234654241101450305077270441794820036923711537294586213143840793854526806450095310136249532251962392108315510468403944528804896621349204907397724863143122756072243736374386704811081552091247886513999764965759448767952826522208902800785015829809751770205960336094282203796094275414571877432236508140317608217894705239639878139852446043326588343476643294568610337021145380311242615477204527472983842287047419429846267888887577403006064605204187322093259765291771894447408504941047073260120718863265620388411236638319452629158019149497370028502635604664460518165678894396874285393730530870388042398176216475813779144526495019178326775145655421646481378523677586887436502931259123423690183264270942729066422650523398520915093128456353505029663516236800747036364911343164741820404431603747433669685841758193755477116295280160279673064614144653568056975438466934407810218535007263092046218807220191882103628148142531537583560186036662411902331903390242058059930750012430454686849896145615267171197537082325483820909059009578099335766345425813974559980992560745131301614007717555183556177850714085766617745659901900277295601454370728126655446966447868607956251740959789533030892012773028465810388939432747016183199881034655563015540592957375937327365710783083212405642898020493611862467966906750059611487406955356070120378714990416480591192419125817168028925228458534279011966272082184853203738971575905651981875903860231421500813658122260653358355205228465775574661819651372694320917166740371445714276189145520989787211344923949580318526103280657481519896399684667568622839992824349842712279218879869107785522391999130310478631121427370796317493980937370369832007575689049984123603158342530781179259587208418394517047828726389630854869191899579782198453419773504996508448922764478251180268743290058007712987361949138512904038437313839452727002074162804727650580349139615360797046401054237662506609326189890828239965695015005094514168281092092314223687400476807930904225658519722479362944508121271084651371295771933708067403634327154152979944136512463125309408397232009988687129323238932953461467195958249943364823608237966023926610148879039271355340488669658400538656281499058542723861106055295983417947356315065979753535958941133748429093262080803748087748912135778254629572377468880931741906182555854923885993953768674196045270702329872192259301533423184923251907558876543390536663962118908154004090639022500762844683308896235245568610583847620407903324191429031690952149518938368159249152672258359447899153841450637896355590316997511697511122362608621304142583330256809200897069471270976246139952798842486646034204172994696807237677937089750610693496491935014208187901190054689210478002654037780003453261163141000421395553044243831264349981469664905484809064311453084888612367961008460583766187010158047644157567722996147438068583619594239016831783995735704387391373358669055792333713255605307995846435750675658920604208132412844372580883603537214508927473210170318874896789509857117580394605489481606551940297110977980695700706803491142004813658103856165962395201477887878388917437446692049371499366267367430637284338575369772086855336239357245318084788033716763246358584800537844096701864583878597961154335336315980029839141962668531682876643466497523049436225308218882926473283470787212720693615964836465407655740312896112699680941763091929149422053112836065901757132529087424546320424285521111871753639189652231385558058323010609856987824439316870930061770923223138112955307323228978479450315049913235528074174719452024507565737171893832554485913737464490022023801902758342491058402135159714616644043798655263652433695463105555080548968402709484103600143597815060044592515272520483437455052811182435325296593941547960599459070763055737703401796763711279237423278350060307028722371511109181434195133732059133656629011007047166381350109017645112747583794488910212543475035046396130647309798059671066960568204234607888805072044162309441237120093169782172529426139389186880415523214611908141347091356067855917018928671197264167118255135165652081903029964940369636753355208395691065844633662192489142936712714604207828973741374784488579679243469972050274830466553373590118780715143012103280413720372289817382473521117189105145827985885525618335904838052325496662789436015898118185323873170209243913479477760762437786043001237032053674367768222862728571898456229738234448510520332934207436699567642176560785181052275131967276568998565510599542464639483483711733819546826992722882662582549093862585403505683763253192508488255131878538467661964555927231682270216585979126219277513425247917879146942700242794495808704121700590802150342641477784904108767526713429210145518376724839096353457661456896369468184444690848861443678515272409485876581200281722769282133170511762252618126444616074544287441430903754332756161400963767273847735182135086999588681025513702654287884517744844771005068365881695469637184289963401235822930803240955307438062325144723123456454690034964855887194487986770782621663034085467562068854845526642842025636728535533227186378998933788827352031593564765842406673215566361174686105951547354967053510740373187647834766048398277290314396418887521500753552689364325812065246362060075211533879512889385078295727520220961574431727198466667387782841030961966570847513844627095788743676805330441496302815319603994231929457093512820929279578544384550462406597106326065755521655870957868365714628954770043587720053318262571970657782770016047064983848311832954907982179601347994457348199063800203649349691538514828230453445019368323438095457816814696499940872204212372640247273647536686598819574134102945779978430823667634564172232673163577108217738478705101376818449079698177642169166249548676981758463833359763822743828104038844278468663726630774121224436581946537904499662141610801102081422122951088597811236865158084551149617702527167680597076613591786592667513095732930992695756950936300387895541191298389878641579453655930662800156125795813890792029478847644581058562691697210381618696924516366223789772322263446365618463157928753631081230656150647244664555880854945046490952133262915326944325291697067361215278102517916018616330441146031003951879878399368002790933339623412948519159980376757226637823864748744608275842166931351095662935267932175393477573780428274774599555829250066254547025920389197748022737751995759571403130379918215466154170515233293755555985324075660078745051157820324832048770551738884303992013648087598127945495663328431033255963457629342056917816551667581914682401472357653691058817794259501350353825111024440316985367206776878125852375646967449449595527901691027466972661112414307461294376714957228930731861919663666770035976697328276297581343058778794250744413541918906079487135593380392428898925454768774472842141897846977128314308008275690819786617176966647315996741802238266176221242817811850536347049791781651399168808198801282674445415668590351351430070344593680128204474102112444640659161559564255066763164036761220187615272919416366299799566734604045308172281795851705630341929353265829790128029004262827535898961973942374982579568022409546270359202614110186086153498663310749148474725577256171821055465452090627356028255129395996127530612734352984994008464029912237520764127104843226693314526668375394960902966145393769093396183783114306088536264680899518483934373659333179577924317776862603322540388881074283950956057466263366411042840085556159546966222602425297304625541534017334830119092663097771554251683420794233225634127083790789690038717426966520158715557258390776748978046645391754176131128562532029367861855723988925404906609984864631609910770893920996418865130204220936801148345655074159732006298765114351676401876177888808749480850139099714994758635884636062174291340243881916664023575529952070629796334782942801566926016370674209241574121015573462531407292026304788573281564101883431557332544400414349178290531228062828193446750789810003191124981738501933268495534306927829034504761102988971586069170572846194032501614541878968270467026677550805288731975858006633507372788071419907048099317605955317887774202850043198696719058900115289014369083767129925997770394390342306644678623849566675554383722902272784910432592162329478521409959546624036092979965790500999392153669671599900421215439558705527465587378450476300254261213942870059974067005498399062207853332807435541757542092374765769392911200488104304403245880111162129464913296035549503990030501198683621214948618992990873152734100557782847535828626402901059397529159817844903412296741789442763903889487117047758060764636846327554802956003389503844586685203617615416529731792498001213623319763176441539573197947137859046604257697719679744721147875428254056820297747984692396240743164024871774244731681089301732205797056441427634462148433574859382692314108467661777624502706162976158111997304592509292045335559560794589164258095510483228196961250520939599237199092497357794213619039451267146118107048409401943225731987533201209215982693503681938250346992836015248954346775309106932402612867598685212794138835507776279737888300440053827329457517900570617255154264242278409955776687146560696756238531305547414925564837816653850589007189359632829292356979625478184703587736800231458406915275984703341043945366491471611612384170661526128174119629098359012159586891751953418852362203075996665084254899287444967811042884322176861580634327147073522874050404131948040180304465696081151556295160922107067875650073863519666422733013910326984741164625049596507921107230071662397918495121928956541341268458850269478480305157379136192467658663545521146909496701853898155286771289207648314537104924589161594773823701017724890859286547365579608694036709994404434598453138031203746079245485597973939062589872388122018023454609931628674563007991419677533168152860803608534262196181634825318884787582624471566727785752817662516836545940668754276523134350286847145325738718179372361574875384191341898467884771475344403814028372133196691507860344690327673309736928922715602328260243279536522748142861155437228212046716413754904627053774104361261942890773735904773496353141716948628169114633944307165270820631060303711654411698161535290634771878924945658677414978842765945403527090849812687495277131421715127563063369024947427891724355067353379569263515386385090263531590702048007324714127909403538554459470846758092261680348474962165493818099521735316658927078842779530360122238501890940259872449855599223513795710439364939047353072348460718957537889752327963433366034525634859824937494497228957828825068681355780477460778665921736533118709364678270385471891918279396944026128969634674729906325211602499693587031894562152790434173186782076081122325500421729465399333660296033978097942437471099848595795790946241800281160381251362103200269141644387373236256041667292246991687110285607952965388855269441396943598594770097457572855490772814607521613077934870636337967438056669769515153607640888685838970605415690928113426284530799773519210376707955706889811553121394421735757128386020474531920108989979514319198378840100583777206322784739621008110337463268538004543899345210513143013003687573837667998668532411899693865998245501183610949489256716585777052362330477040388321471836201538695927801046544194904345790036776392591039808268227433971405100690595832078094331404962933916328637422889000557170147330477726579587381900389731935984239716490480159707133149169598369440224342060228624064733513012788268194073755790602244799057342184605192058187173087341713930355097559323335105103204440335953133784176728479277206593515271885785362693555502802174849471491861260852281213329328665551861045310806348214088041081553655018906437750192709484309621877040098710805625647480749101405657977860024727878492329453386773757042374592412797818241965534339644029857668009307794294529211291250675175901652274079695341215286256229076874221152551434076445722766061233330746011144940834292449027120513544300545333788966729991697116424362391319053424731678327922831464886357537020230876034745391277678252884649931820592615226056227728664666379952716399681817722518274728969038670352363794303990230828753305082107204284731086002959671973203090250667858254074688931303313447296756804276200717052928735339971426474802152163341616330936309441453176809803106610093103622941905816204213179925227356246642761964588611776408576306897723791845182397010153695989963527172943619981734031643679699807449037708701975469679478039776991565789681162692535775081748152472881369058700622715469741082648848360628978715812001468267215280127833852152863287870162616006653090999336921810296564731464173730669054372516044191702327738823594183046412024754726248164896308430143823876816967343230169626828820589301907196995147176211048435201701501996611383977227189506681068126736977084101425092849293453433493042535386845773248377008959974200758096045597010006250924752724123924402224973909519145090750674560107212075820615865515680910624350305228867668059714501526155418987346043014865362482348021204130718455921754348762052185612391886089937559581804852574839396537128760016989371600318863437591666385568174931593359954556631435887181470423453040216648850796464449271623353479416445927584889787559458439751916372869768939883114085340833129949050665271410267014457086828263492486982548638508727962345645327704964027440526028232691435240266595281824463092806970256402420726096525742199032638338139866955998303269203813039549387515978008688860908990581250123645884177809771431118003709335367019039445536064116637045018759428197103999284265322090232948987796274409069200928731003602518332668134135655804312495527614370721177137178250625531086790541580507305841990471209903743610852554461805042071167779546451200777130949247444672441682074097261081718656513731088497991807475274408206553642815960686498125922842464142767988471804706208624189894581941951471691827760606093659942591375078174795615404921481653731030627004270719058855912952537940074448126620650010690365578873391563899312088482061967501408719573783577584686442209997035969759182842870717748033874361894978737095511135457303371466504791954293707092613612394571731169940972760692851399427940665020295079845728264054949925079563434705153940036572236134755638411018530470862461674865382345159739285821830220699317941033586952309046833096171083174187845877957797995316664711007646133561454780164162208480034361503399597028757191802214832523605805116177419904622931748699441362860785552740756073217899884984815123535491961577986603992857505564236341176450359056524738183657688040090783650612695598307672713186604487976336252876017722936845467061009290955201515505827534314789925100969477717246566897475562523842974377995987034712850327319541121659628147770602642711159439208752785128407617389176054846189618355944477188104312808863898500048659292006166023487386479447693065435386892593502838229782798763192171213592957747847420274762325812925132982184140664352167648747025759324045110520295988432374713146205106302073959171498609446610447067249063904328541671504596895850983801399658879232205287569576450382994037769572126960538047093656686861398435905469617234781331489830698480969453475628441945437878777926274672913920118240561213304124972573754019273639281443897664487180007913030884237950339655143557220971982803398386883006778783739245651195283305296021702303877499596604625350199507666796459931697176125797101038790411743302880059778664006014373877423405845146529729460298109614387924135137736772460091302479526716932072693925547329175111301478391216027831159637313327807315525650400163552353841635626141031685161197283826267255564521920608639820494528889097763563818912364241027227496416445933598832111802589636509149030500851686279631285035276920030375773723652150641337389053555770802552775303426447676003563967743118316624908840412730193990463699129203477437629645186025100436479776639326004392822870299890298579738698084822872744723894408364404922295088399956879508165126621051895195992481781098443363268859544047337821568858218936296334199844813288691740919557803405537500983976415588114936657129577257625907367926645413172573473603229387496720560586409881220701576586804486090893751332407476580905544331941311061174626207511960235761466997768142930003161026232523765645969002793270996781100187737053332249310117246598403808639611778863075121876656967518467198382176727836836860802451063936151521159796285639737828759852974797407427529488551900780009435802650384791579206694485793583818929716067410286492402911613626971488806394841126155141015926987350574043218760139830342170359123290993847834445677127763677071269579782911167324017283162563547437479069985498963556198412250544115650887683559554506982976993854264781726887132718680045325942681714198941004753362096491824581615698817735368550277283185333175604527753059888830386808895609633380535487858316764982497221189676074305371110148631004509372905242876382998197364251778791623655117308701608200561780267114712056426964754527218487120182232143763152529795083366245348053343187177178217754321977112648258553764189156604638129889452550254221355957846322133741804479996579579602678047677071020097277182789615912011637412357516780227452118452487158348754735745519087279147693444017181341573371441729611898050812137968483647366226031943498318846993387706590418895689970060351966333778548665726173721571080910884565550811164807605534334839047111526990438851847452562088801317920332855829364070423597072345885907638406857920761391847628546300765488459320792141672315442362148776950464136006744677228678451090192117091880459424496780434122709299993965453517471472433764213826345885075651673856534235174988221856700859798508961252859139325284530112229738489499111942711400030635414496679448687739698435255930635754545038985558444464527636579236177464086088070868212800929944561525184669640242534918656549869349502828587901975650428939053072006388961249723067225258701687274211198278416648693977182490499549044077939265836122234492147637598145047518112818786697768653761886970167870451898837527531473312585965238645121978966214439360908993411328800813618793478219317085857535757222373095068932890442326788112959463968210576756712895512294551139986544501985531213426055448686047285341237493548977157170430063531971182545035894800966046741511973686537468889996044099270433730633371357607796915906285770084730244959480687382335735102689866280821425145144644963290913461659849954580729111605354596971082672453791550452646147259517736435953453698029948789885693634623587703856733505832331438514130201052286885711939493070474552545636378232590120246067356647333364958057236598614941913275350584552808016653395850160710486970379574995312775747374921103495384400565379521331570114827039281786701407439987816183759063054274734431778124508001376165966099727293382553160229001635028224452567174376546410378616403048803034580858251943098818346202435670015001607044500821701174438959808311056111092264396563787026761416434752360211727881893614979411027323903843472908786971537119752505203236519499190001020805892086625934866472759806890408171393461863909970403174405853234695277703246644532458295648664314258829910586465181404849065152780136729070579259082158993164425995231698058590189356692484604563351716658281570574921573105074929931821067423911888083508792185198476942384582691129629176690043061714366094793057812132341915670837566928748022364833734110414146500096973226550812969168156423920706123419950296966848026767568290879659496371476278722862320697454434098209682994233868497456577034368490344714284383778255483848593394832923555932762050051620052219546729882138447249804459854016040630288379989074715341645479716778659679439531583812552835994292921248031822679078568121700936404335098226836043507267248341053112984482863664548731283022675520117717580039274431109711717712528617925085798204467506376426346949951787068663529446236644367561073618539829086296589071530314678193169782360873689224841796895466157646435314731481769973510281799300291191759459678278947345370363400663976975223786030924061983734141782025783937105635333285969842790364887606717700744777493696455904269476548281895452141361504758046912172990445095201600467116907398928121914044696019736684031540809788764933373977661699831709971549612587497927491418611604801603215090875385916628480322414319807015596213035458005941769255217980433071995775018723179628119938196578570733488524683754150414601818847697792652547252811384374723370077743946578739997116135719032477947010071406130865741830634271749872196065463120444908488755387848145499166298071034337425255465035534410375966782269284606306738752675966206889536576966408649998572214234263747622403684122112127799795987655371673500423317444388638732544061807617390516335075981747706807166692486417803674473789282058005553629237090696700946745171264846487347089107926735546508130056857450405051007045967516235510784498036384266572512327140303829367497425095835524997905553751624913591562458204048516297676787803059202395767143661148107810573967840822386352770099009563649582343594599099029261695753901062626193569650004587096848534456540730911248374018890872797408634222399498353546795272120651793801549543039546741116466383072701978420880009260229821471238063786803783636362092510933486384507678455292334940370800076474525823686975791467799756620979614618957836680374252139371701222136752008101051643835371958601662617250767931299306621130234785555624754763332716333538398577213985590343064078740815484894491019332700414875510569230640755704879607758819393658674675173881234568126538988958908708360798105871065846710267072059797190134584531629947929372396421783959356124784212697907504076044354796761049461094576843313155905693800591766319707616467823695350977876107650644088009693295213245696815854521109490578566589397098391217084121993238265621233633355745345013619222535479936250726900611846337029031360179806601559497873932015302351879656294892849565923660866426139967979474039343254986463678854495291639246861154766026634701513643514967155094638207506330006072642975299202646320848434274785760458486002224647188089735666517181909680145776653457902733709164898988906615586491715549733677743767253120899582876559904069521018213486477680822280467351471308574143938198935382696162469102550557318076176741061557111194318856754429962320692822715993315193235642502294252245512642793079570299197145486278969521436921776033978560541025683437221200945071508847197802530060840796711682404200320781456427761485404772441460743553784019335215393824235900515480819882853253240389644051976427661276866309918331346913131748852320586598351282527458304973510092171973255741941942935199103153830499187130014772859366547256826723545802142469745918783230669569046760262821766373574376534246338925719094288580284053218388096571543733871417679614838419182875113166925584563572644717624662592219205637572540064381317112507630470745137513609005655586628420509147191480732766804277328916598200971907437564305479105308511112199598652370104292118669610215829877022901326353988664386716483553523188500500971392554984282495849216160930331002704066805171797019305567732240243645921704852957193644076245228520366053928700001553143268148109489883860508086778545851553521768298457813669334702215671748492381499772242041939090543793833589570039094568691724785039536894468637379443201463992455036531159146113565406471533977084765293457268288275243916457670335605192198770802959732625454321481223797943726950745073421237075150804381506028431722089123993782910411709322610711166243107279576683966238711588718697889468038788639338285219432502958341632589041660761015802024919307375619514884880844197651583111771914882860428973165938066743803247631959590023225139649657908561965123918392167245705311358508649451932220486096453193936554400788779502072761169364971675875378861577507671944623878112790842171745129883705035841007374359743026109727902975855886634109796594109181775025302205633573117473420947458635426274389255604553944009622308899616160061535199537358883386468873066686705633082397489473741876722196276249767505293931782857181762544373966074970593921112025010175658579200775686207854945769276978313240392564604862120040204771002325644993408316579709130868367078914180918705754030357979947929717222794099498865444769632376079372178354074277004964500087737068596738335566113066363479634742275334026326978024681014438951072787661889489749199324672769407073759778225212642838269035120628132681010551844062661543417590600500561040494528951350512147776911967335735136371909399611534265430293977916835585963575084712844353596062019832080732884756550623079228033498184384206442669284954688007133379024370961707971781877542798157228366949871716717141775500259463199125570383569278572401872429921042825533967019389713894009584819745768386847142964964679936757009513509655278297299661692582725604132554363058522448260523096791234215720179170873396865400241244619582978431692507090625006269410515204437157217542642541485445432282530646193287050739317244403536053079113443561661212772471369259612124812725895675806598029312874560674867150881949232875548016084031861025999138951239943044361262832594154345401892011630585555964169549205119019918635744252690876427452876808658145286658671801754461698742525395588456654444351052457003396569909551970569635757501697750071024590947350503374751691558340494341113132529304009066422644784550803073678070957018164950016707039711321329125244220108060085330088921901707051905607747324870838441405728930120293968545443692811299483041055043700898001903098483710554840210984030998449738967869945370080995458517686227666744616078187252923244644544688037005243691411809870825404476653560030147489787778747268340701406468412803058994934569218844845782238590256568177669756355038043628350237995470165802288803233733418631455605270599015759707698594112273388136399572185209995539865236991292465463964921664005466259897834722296144225719536348685485329769298329585766438747064857316693578673435143871524206105472557501213093998188720686363266225951363111360876392267693193755531644546865079165203986215861721728326806526864288543774392757679486174649897904171336754559301798420400965665894265548395808378225447337271605359087231673075521994462162304747662489479959008220494562317766706541798726154003682966903028908741437605818659520623938865552949367230963016121218419139692494245115368591774971160980281224371302328086815793421123257338054392468802935769410113051896692769427649047211170387777302456690748521130956460863636647585633255272642676515138627719195002249438994240953899100356423107379581079934354910043603599746221354278229525654578744632628959996163613641109609735377807027272217295791470330123301208617514630463031404464538752076067589801099792836801835756754741683541922750773534418485599885108596696307683378673211334072787795347394438393638954528508683276075649594605077406198817361130531402360103579008201378367535516159309816387764510708068037056744782580356917480748531258810233488788332779993556056636777428983448600991177093122906977937710561364638047793961478116494552510141838560695751263581296390085479989166025624188174745350658085890763626801678060643123532053876346101321234613839408496893995688595033017373076277963554883657606767028044036317024735143151989600074946686786748253136057315798825214812037086848390882045189361612875691999797821222548382801523468850589850124563408173573637621656989783386619044175334112965512836469669674803007111927916999193365549912702182308941850922593297926062837426333315098106817347169604681969045466104153616668142413154335297913916327175715624195275877095940937038596107713594340367820218789925297225302675228587593556931996605656598955646205666154430444904677202673360627611444171754603069486975565917969058147165467821451340546151512645367282641104061445675791623297868410408827620748300902265625867347248648078709048542771238443497939711231075338555214479179718672214919596425301426840196462755118458618067901930702275809052400775388993125680501263353626355960503692983808648964823953215878572964024511308418801396865152425021086216908277162855133379568081466607420442575215905103158236382317902989470224166317460585013859972067338378647050727208002463672016631496801009560000008721978648207381290238764736578765663853025695873067690043187992468528099893619319471470971983542245607808235228579821860208979562474764043667066662681439425098976707232608604181873591702301827557056358261524096423183876006564817239418115091940899820298542906167732220934215605658076728671557287665646686515522410303074143330490988897028793774215511569012432420963099399116935355433721660877573304785633775750675723852867636940947267210612488411554309007182032972391271120683715160776042427812954257008172081421894281466608034034606092559445957709736142685591717112300819334677306446806457670495441112985358017689086076836395006079502841554233910834369443954801012129630633256158469777028536556086713677998466451280860839418931946297651824663224050734201445384133875484762362333920438527033569789643819232208230134712986323535269558073858971378199234044438667683876628972051748170507266935645723406520080434391436956730290663849418914855388810850686061693105978219149246930485561436630033896802417870880898900152775024831297356534657438165379338932410013071947528203996766544073170821084558239908640384376127827266534998474963984805825699479074975641551205191104113758841514022761014033252790801126081778734616042960042904888593537096728116392915586009312947754876985699446694805495493183809007309382496482439769850079857380536445439696675208739501345510648242694564705430513511122899940150890354528487577371824297556794495550461926911848173194581381240123651426098048219342741136161016603404781823423699149583376118202399783851861035005247182507314523900147899436396068034176587373281700565543007077147192587943097317328041947537169076859934412151352375219822752538513992320657964938261257424533087671562048049332273970072823888420650319343247694804799576785032395893139493121012922918391294175068404625494425271609718799225438785088765999783452277471458663913488920472253526779620015512135844562311330962823756499809037540451444290964188877943648435718729827484695886254518601844281260589065478999903331221494654070743060947559019350375593456371394404748592817404416335559254960903335923078845905770760639489994380945858349887319365557482764935146029651672969538587486278441593222728582275886166874844894099297564637967292002321970744762775514103220439387059300828076010501560308472184594799364907996685801293478771443315328523805710897602116451759262691078192313859777402521629792956523733520225916302713956709654180656283457759482229840929949998623035061729633221548075405109996457558987967374857660816859214611315991251281839469989158399965052593703216313836619561840556481891569419279723178058615789446101093110294606907991859688731007437551159619458592316181670138611142645882509041882946040278461311843203110506415321036009940794386751311202359418886447973931158678826898880189990467405875347443512030658279138525066611252522838335909323423595731253575027146964090936779894203730122879408610959756755639367023381957884900769272445059671106622108264490297664307039656792599458191013180230645854634615190308088817079312395672513016678823679747104802211782680003131954357788559619638578718631091026515386385538844509385331466631677727039395527457228855348273323114917088751403787776047525905816158967214495063435495478348513563549222877823836016225611106054369716777906120612443125182610921967347254952900703461078956115071288755303454320679772199274845760938507035839958809378801582055955228470764251141888803391166821873251621462700818326336321458508680628691713346178050974396876690810970315599016146593487548460366394851109277633193853942499678329706188782052432266358019329111694801518793196601586403708064035743350522272561566480897709703504196670471036529286486887891804352662549094872847937932821379341505878565899014257225380134583357909936429995204741957342593265043108862221888164326884709665182661800745673523230580811673416530350285630396325690545309580303840128370739526452633768804725580279894238550162268455878886489785723194994445693899350043095222354572734749246056006212773797824852501991577689981876194316542318920121832439249680305108759213060825743936557611065753050362234280685857096870314136252563081911296957181250830319234937676536587837893348217322790718114680653508150992054478153190190531942589485414038620458567814114553353625096513226051491682506448251116353560197578872676361661720471800336739068277826498322759697631049536844282363561941204651800699038010530767710106253498005536367366071103101977404516523770943089364993644630478695856074320569205301583013915665233113222973124772176750245139586946440646856245068939183837222680577435723979736434918838550677078482488185509852598304922363728721328518406837293454909105408765884950339986769769227975358777351208426904531726488307142796828991335634510258118897785334514683137276103776511853428425220469096025213964036834714430708890241396171147122988410211510046402378636632139398883528781189578183123543794851547905713988031619089921675419814957981711060035665592760244692383070774885115725182824930908883474673122188949711068084213377855257233654265549509869391672191543385552220100131527742473812202642160155981242655189966889483998193541062271946860839475809864545646389171131210216811241103287280766003111015666118847866723013497834020773024879613857021774785577836546410068623892628481155157290471922213909799067221213569700649493959212221605664453025546725098883255859401869954155283164169834271802297679212165612821592626768436245259268321079845682742789038105798717519183806337385261193066756870773845817116390970027168641507157516799761964137153258322165599534070221606900670125921624540464612923786891812050922104117688402704698445536339139609336789994117502522061864826719333515509323607694488102014324728702571580912949724665537030533806456393372059516245825451629646626562135959206481593697489683191576559047165213891857629239056696093988225243975829663399211125122608921594521202471841873957216906487840962295975769321026703968480533754267189016776806889575055371212927576387677066560634260241201247471913462326343903232719412369470301098256934497513579158325689845046888021249538236985211436325287588658044290438961268187197181379403026727553292469658168018858608306742142406722791228549633397072598308935134280611687373384121490401143560522530138876823692415513942904025143496495973758585329806231120486216446685604873933918426668762726193475240908915864847004267104604559469525197336443007923940916785597227321750385843645820313612009560693812946786190408901228764751014459758867983158259959932841760635123664020970541216954137417482046006970073891487282360771875016311485504321741821201757221701937006803154837191360936200785081310454236681758311173893028024260524209560125413698796716327968622570455167387331935064359934053796885038833581221345665434939856063065565732358739404243602582605062844647384933911875745292562557664250675847897641834632448019467964632598704243765184070418910815192792396923989641931265796895172676731990318557588774226822836855368198798388486050621698165739998953195596571480681399488481880576033316094159642684459554342450877947510403208981013775792409688554442780193304940077253788985579587112493924416854800667265766124423704681621323201226474375526006290919223257312636580353044498419153095506363389047163844826673262055193240617560983442655681190239730128716113405570320087169635068115354074317759306292881437532330755328538074846282046957361036838497712473349822084083343376966834824002057258902300044116666196618705800716098613472297783571855690161616185134133778957322668325555973441341197893920206975112837094270157068269900421572964799981691825728186503013280627447347553731133692753802685598255642636606396053982880489494042636707833904752478196781736109131459948675190824445877726135192662805840352386018439411127016885416906355882651223048902319416151286808309046150805072914250705600971500831051665933483005436566149299604165685482961517899280586804186278057033403941882244685848360298645211377319673644059026147925732812016599639081899029829647163573315314400454396520657878284675472911329653926161622924951356901301414810614851254726251798927232234740155773404785656204708417692985837821398963289405950556246592558418934362918225935233009238776243135526338589836230755728531478265411923637705276585100058839394563133731084697459851903920804298976618030184227621620917978264782214688154675167468747275382299506033429370900258787224187951750660895544657745097442149705108059467225223326910309648576976749154951810705106790956067023566834951232815560335297884089834214246778301806667083611126498771173324251455797146443188180970908474297061147455119658901384522959130401215573397721095946933247165418446432719779642587515358870740821813637064505194385790868001328500415387270489799278998728964204971454615670537220751442753164096501863583011584428589024512032427298516321362457426672658341629924654091854075173357345370433510199371706597589953038319301672590027086435479165260343891690054579508833247330795635715930443102579961377645048880695199168284086157042230230797438164607016142963712414768611164756527497551556169443676324076034479518192149561999151735201267902879114047689406509160792917737303743726899438949066795889648032960291089323114710105017953936306169569420401296565648243438964557169285670863018006896565601368996432103172244910932162516255282946480359146636295035200626064678914379817831098344235568916265519952708564184305617520080490227119503031134585928110272692581839837186123532508352426243177409287690260065081148931682994523816798284950107162843050397388385768483759845219609404302494497781932061823181542599623701069685640673140470921999978556027800382336870941248080909184129584795803249826550768429040470879591465086733819344899934084531281888614305203189747320065184667477407022538853021280581519687216896144597326864599135340400093106369108664784272819951477849289040346671747472346409732558037503163796928853646803869172393133193381276079860065578293648602452590328109295229373196615610501621810391701510980711690654494443611571780743745099568495141967528766043091983290604092288699539036268869780409124511321878535362368379508792007937832818442289091620219538365215075233038422156641789758821618462445716602542149450324885809120503334705185258217116585167387576828211678493109204758836032227940881264345839330365603373398240089530559907546910361287229345392283692107213425624050285474450349376594655560991762624460479857398515856470505128306708774261977683339675798756241259851672915750301467931437158517441414658178263306536447798758642000198671762951344612845840971219324644021785695145696295250835605909870611318466471604387179203356289208099680038995749884370672826612045546764697026567899369120958837920816087221199521890160804321338680357372519326046289366064661396916172411994414680500857484502840596855323171292989949295571063063201099995937369057128842665969568828206286820832331106833847709673497846463528297031085528363852292064578953900832607960112937232463729338447874843110299025135236045668628547175205483396232949472813063107363196296567183824773024216794999695504416641108849109083207521840153560098329006765459013831412279897962776645177112315820258245643458299247949827347803224332738802612197595559308185640569356750923375317331738639124991778055378998154250795281605456900829515639714299780721971937142600049824076374942807067814765346971550009151140034391263396298206922137922724195133055220792007453956486640875539641606186485693962281074486210274609712236499208040386134184990564426515442152445053395002949299180446352792805318517992503435963881207707122141413608167275868935994478643927033828801122614050355081025549097274928803428116651299081559295725936756604156394341201513264192996743125557312242130270812375792316970350256348869370414910379750619310237920649661058146918085808823392326190398715479809045921132657385501456379010433586596508720577208232354169468095213806762385160962156394932068118647382994435229815192128051737100652537912073970517593987782558473960213205451566892915707877389998074489394385206197485211054622827632704469960734603642939643422131901854313209399325140837196511169085048094111845556787802909326455063540115338469446743389378245910179270435958259848432338398994186619104454129659814300226596313894056366555429856959430791880831889279168557192798726245553487652348840495648939370555921017717336128553184081241680472010848859149719608274236711147463750151960890598267960053704844716176738821036128098692083695626665319228474742097559126369094957387672516807354638590967602044276354185789196723184513646178640454901276661288642260218632536905203188872234110513300398410564868556131787480010522719750807966192997364509761146024222896606385211360165466509910036943968819319392810486345726658604684929097123707861506367834403860363783924562693080514773468972004184686167836438579302573419965075044468175306010110894447157484292001433500588072843575687669515154004627154254669080147663298928228547647060691369952146031049274750052871215309086242541101646167698800513755485554456684627263372065668416844461022417325325335818301448351699177070949214889990690392263122842936030465501153234176949303645565452189122713960583849617661955650482980951313276844922729576812734064728378298183443418242711316887381163774110519794272861161326423474412388869790332102160293336240663385660512595792289053722279840360972845007492682759903704551683762484797822323761957987644916327121123728492504060894946468588930046220271409495837956933595240730914807319727441860620551326124518975926886643384628635981916848645663513983907575587948922796045359028967156899243614708421247291731223403695019876503967505927739520435160251024362993413272772430313162789380085469636624250425756299141306588635174318702647131287152527504315406460881348769257694052820023132884775827927040491899433535804021948250577069305950725801572625100468755040184033926700231878415245301145615900848668149636153615775774613259490482704541877059243868109060195569454130929767971530975915467869696934756283661760502068968740602084702397689417194839703460417206933511441412739623054065364690739998436969965668397712488186136203945447610842895509118627649378097693216932735737848263734875994051391181865815902085822371225744126387993139623487011567677943377415388326692602613307479403462997783648860930311736940744134122410761911376443045791059766433265507057505237881571212755490175684401634415454863613436690824353912150033020692710163335862038753014831459011235981280617693820581672101803171349491738581409339109249853774878384766616272278643956329036257575048834475325190970497940061003879787022406664878871574339951363162478151438981233802058904539744258964877773719967915701521434350638261494102865328216942086260322069973095617667822455543530636580460686424084250971824013686671227970113212857220357766123398368481637811626083526209807972115142795507726238656654634542095166234494732006336514580723482077313407437416557362580488639112164807922420947549879796567386699148779170917566309331151248670517621023169424469790736212233017862467071076079138807723183822382146761295999307546582055719574366544577969418655334860582456557228308980966358106502489666360196297582689712959155137107331225869376591515300776388068285374332726967540136952823461065615785482710357705120367788748488043460889597521622706114285996156032679472395442687313957837791526840739314803082668477150259131789046072130726122792422873759412095289904977772297680870096144991164156652023011597379106986685733485890679904560692397659460129956211685505831945287639238723715891089440714630522417518309197411879279887202406310140334060314598676354051857372740627844069901395818008519804513489823228476213966460935850261015117747267723110316478904253409181852535680046368838418672533725022312111605757392898301952574535518171334732694955853423106544098362706431944670977974827199739007875742829386624722207166619050345580883225727237550836612686349689440706366124023130029748143979585553935491863314326290572645887362388969139754839967487695203827133624079217089428757401877635716517205595203580903892298614032947576336595528075964844765434910149607579204290870048723175012301438929653059555626145603906217939849807951248110422561171580453616473741039866338631714467059855325934835030586933480087448467235473758464891556487594402227529954662461811264244175818531174709454082645388296537153405519885337578784965332811744026507381784787310632880867038236376972004897554865524073057523404952206502599268516133823169171010302716656457982863175734464832850271657795167095375795533727233671405724090760533426939087099982565474748374333693863434237740744230507169765244072268707441256477823918581025400384329541978689915314009614595158369678676529904879319667699603504113444691326651965912732119275377549232380122404526090955543685847647974431808847407595608027840841205651621351915693437370274665649664649022046137716235219205447504651175188753235712146586193548720130808109216706906824531332021993562214314207091787674575822770274743239458016531625132245069239506134238554438247272912120598048124099917834964234423115661311883114262878304788552733688842703515303512227145997019669081876815012613156769372705363499283095958822796450210090092607555134399436467092538254227147299086664849773587020613025477963185932932168175739140685366224804312343826744129845212876456547814309755939421696257282556216189186819167823625400611542237623150933835760994422172451689079440650882980534764660418969444910249693776629507125526460835979909141879402217037664666042709099745668970250393932596952936430828072916588064884347965740621180267375715085740182369004726675742623217935261750361898726985243160974115716474665510033233695541331573525603667849127553105635732824190562885714340452245588823845233029211502584534814425437113048490657021539751585264967164527018267397280439732807458351076792899778143087160543794816654935850080253310894426435782080604717560102547923696840949373018706882175702414918955731704162396575668601021109923834792398890751392366868630669621655597793909851593281090441863610510395162893452110784762035269268503765322849603370210767010013479597447673339938053731243574529214915153645010925381729141424365729110314795502265136019954415614008333915895028992065249446117377854579215570137816483965913993672725202119110280925406104112006525510742345073143179402708702995556620132572522098780745015107399521281283475659725217954564546129882979337339042914940193647681398064391196438467671158892553100022451671371208613137109193760202459273433497814134103424546623542212653280503152121034969866635487127066886307515368479870500155962239201097175733412093471271229932947636455825056831363495110310545873594806005623432499009424303940680334453127605106321066839098750106137077424247992838431977547625138575717781368779556874839217218074338205257207250589804389329305113186624284354432431153117361256539597918915681706157016643698242646205958325707852963844477362716208682458321612903154677112966297945223232790790462655845738927761943075526259673379532435689831324565862077400937586083606844829803295502000918450269151495378110379098315849538229704607431425725748389413679693317794064909791363308469866366821007510306734591482395732180716409624688659722677776070374971951126676405365347512543954825972117129022505217241480352781580946139594591444436701032634981991369385664664863789242249538295801073615039825352128045326328505312780258830211188926392812542552284278273393921674065410553272554089414506812171138723074139290179921224559994786742973830603622367182191140513443182005121033770892437053818177111645508779724708412546036142096194293096837917020212685932527842550360220613866583118813228692316368450084342371038945752235868988953110398451820196879560357073197894518195102802678156668474918088844409106123169418897380939327111509855453442402290134203932615370798727164876479863012810821796353763022589594812665152892018916370076312869021935736568207234401038112382740336289400987087682496441400651092149570338698637771549146106714809645543001660620545550158334344774691081895442396886756899261069606106885630153481302521175835071254748966552439599590780396436294222782186529298588685015340398927496665272659460319275495302972716843358203469934236446114686016216729967223040268083748581111757481994972349431121933138884489328367944288531073953045273431629814392270066086400671449591952710604865147079651351027986398805127261960556637313339080838640992095715753070307175160730349558131766153968819253758768202092614902121193943383497696381966831220265081055796936447091741619477288468967628138559330079270705146555935657580434931598294713968031428910575796510090964893309060763886642521484113607216335211625846598588593808228851280233956256961478849499719341754077031481770572529209082382603273484528945895637385210634164157620929382213531133292525996753594541755697189361144408622235759268070195952536375064478753036661031595643354168168115005321693948601818889895003580783717304485737096399057646623706268349336633427456008527738941846434425333498334781276881807297596606346839590334579028514240559410981116613588395715429939182074476398623280553079555085954290710666380410919434097310136824159623278033828400503225147295671858476407329488996596919052753543189892964520901252423135579611590375508464806971748113442258803368696127120261257988169253676426473186617255166905823985305367665685722970365215021237918791154195409759254457477598721592329270725150762359163329492399802032543571252729007146686116750464293600079613243008863474563634526889637535342424017201299475957833746263933952321757842834523257075398866786198716834652962643746901438538943645891320667767277199270234371879911964138600105263499468815979681856742885849059637974268520589983249079138734679150958676811668451388666924212515523818205831594612417117160684513798643889810423349601334052576668921872793862311747928589190184838299211732798326771613791157835046753239303493623910542883698311080435956650473405214497128937558592043891382369695718427803278009871755374451761438188654358719238645916494504920642763402953621467078805335622831039304180054672383170703389274691759938476646380647245224788332473193670173626832464698929318330239457891192018018671652958543026273944993003906040816321156904307000439482879815173054268433691088226111701744997679604857008992703459181590152388349967654957609674435857364889847143636744437996327666405064736896014602417757238401882513205063121447342144544088012256812491377428149959234663960047349290274609983701497472821995791939601962603667802203636398386980173542243940470646204717446927623705524228771554500628771887924101761149471206884312541151274540370690512316164368388087400434449801751596911059867164906499375524979926539793613741352991656008880237389981246752092175976717101463432032189022456578376941914603920149831092570986918099857269017035979707879464841155381892251472908382903761596958229888509057752440302256585726524076754333052651512818139483162981013371386335456642212773347083648745595767973539792444225005830151751401871234465849184572605285443181832571976960778664463623554549909669724972503346002831636912908631665133392103292700967201776492873799980806201157970688907063563362278731624940368232315816963507247898831568110362886435137006746031517145928026983913723785502183825081929045946576219350629683681493564918676969554157546466372859218794343784201775522936688557121090744275268123667986566491673881350865588702850768543912978863239168328216092228855602403624879964299532676279967672811254190315220254245769099624794336903954035370091414678097597229633351158191232035953857181220810772461714856422604544775841381222122319420861753965229958352160239228370516537616826127905375617466340708462624892521069470422047969771353426253348045266437633087917045447953534434384765415517577296175218270766343039974319770400963961759398266403693563032268109407514229662473908417410928339564374176702956629962483983292598091273847169892992543469428129161790282319507494752426361868975134686978242404640317386115411497444094787269424022006382468256327167835559343757009378927964235135639220003510972399080474710918818349750760004631695559118482969503267767623959467444050777680860002362464337281965270803694314718977893022966498143820460469570577188863182975546182792326322014859006901461332280661686086133415097593085903595447422125373345373810597357975740460131812911237251030265068237558705038211608699510867914501148806778070925987871948672201103265960072201503953085838494464546310515662519801349131829653306660854169650324947505701732974713900416539910874450297897475473184968896427893449920682563480803860089351320222077106035157712856730214216989083983636139134825270721349654828764382910605966493848629749987693144251529019657988925820743991381872371138119963048255771846770292932842244822560402584262903765026503524865193417988247973714869231313911042176363152254608520261473289310387784161572294106291932496745861119716868957432209456445112661839734898534750513149589274819776675339620999784513801062061975472336515395024174535745402012771766722205814949004754401868181029449895958139133984995059128501940935984061353236352524798926695253748164278265590010362835809225103542550990520248666284548398565843205672771543042826982553680361286208702091816800348395434948401742454205421879161025690136038964378769083412958064555729342743452302529042481137198548878511518078685334822488318297711231337108055969316888143445948710118709451288318032263064300039307646038939399693532131223835045128269288471476605882333817413219779108285384224079469221508795855588456854352015714999593819876420224293588442410008863738950136691265896153819576572378829751674811099593807746208100881888726791275502279016487380535821907481224812925819939081722809728194260694765241256470507678320566920071386994276701873937090317475892237979166489389532931879130898004158713150523558972999953445715064044030820902183952600620321340033925515798345247144854708485848748219653609121788327344993325999921833549223123402561819687171908594301186622778303100631401268023224312915108518571802662424852469866345804963905218659122736087246266808511850540616623044620618841441836704950760023693581901665567487804029083379595267014111153147226243297793336990856105319728144267928541058969632561627646548831259777802547076524240002896779589142807130240174081450702947377478848177620257492656676453285584809393581349019528892823065114383343696128945200776269672720233276966712141687137358136588394964841701668698863790167133883645278944313083542676076864732296649880401886466559398041398575006740495942694818281083619272464905091040862854136130130391997127890661492973402151281434352335660796058096417623716548669953681577519471291407312990967466865232315696460368326900596442796714310047051678182318203371714093331314719066079987372523172162903551429761118837253380044544900153819342794993917980714955057818284258971225234557121054944223249470546275108634524408164962205282580705191337291947144136579995203252692546183549535861683672636971407015477055432175750198753106570757533637253198345600234683653241784607963342849527964769615902510958351333322228858064676176860087639210159904478111630647320035819089133637585434341249586234661584575704471609347712210519406847493541288074534751750179956894104376208721746577829842755986288806602193271920788405965215858379330125629945437410402898127639541356380786412025904326510378852290089004977558593226651577829658925613850794218458255220057835580978611035962353721799397335963165895321862613925939099056721613321473683546365296377267860871694850586998472984530626252295216666883114430920127918100063617506716231618817239571386343053732363570422040573761390992648079213255528236299580065595649164745357244443112169497110315914743223422854867510517341469713994960171565037270244124582766707493097819092414060093620071961109491308446433339640528236474561186303181882353496079393899883208132139773954735189839297535035015269604609408555184056042645538920846543732701447344821443092461495056697809882619642815902594624064809240410701808654724963876150801243115599042691135674548056551701752207098581927879614076437948393055297753605140049786485049839527710192652393262466473618813179612838668273539720656628764902544229883552049071887557729566205778975315249314685450382047239306111362234850611148505579782265907124218333605749620058579771142365950089986724522336782484861880041874068838355799080709200072880474303801303692817432658766537191815771749746522751062638274401327682460899277408060145794939670599380492070755110032701318257296934037234354058752195387586264255416274502244677264803350526232014759814764335086310539498242374652192414734156306121726993609948518032498330978851204466787103503102300938003832606710943013748843091320940047121852024200204027238965871877581880872093468158767804411284664097547873851378136308974333527778428030051460268665762149103122324789168853982541504444552983274278056392594699862545447638211871925723769492689787290289424828675223204118027179902147317167287136000862071042607981564078554349478684817142103132020642603979982482567922005537908324131016887717803424179222610140311100883044005346737217802414329671197662280045046136288733484268542257958723662565024979368377256622363304647256529932294799390256213614806440794265680812811094882689756605628499172906647658696479029437674392453807857876261840963551032263821170570101448085111998544479993131018216902856660517757789261557025206011551006717431464495450289182787808988354192131785401827368559996596872777612623357324996686133574738699219246949461270809106406182364098468962613944263378015931232644932653450995072261735399009047016215591169471402020402220320162435395047150543625637748587888285604596104964725628775548115179563093650639020312456662132356378113844554660477996043702360618598511135832332320895342495689434815759749931860714505275193991855046015093622999529981169584549702143360533402532902914120345610229923957863531523694979028916669853490515938107380986658895577111025066412827104204352127863214610925521853765792632535441056236932469719757561834385965996810085679233636083592132520781008171566947868191725138422316437087951577804488078667447794828106124865024930633624556834914051518044941665323675223007266792644520074619828359275866240420984886181708263885419717523366130106543832235670765634809220312367293700600289487778254755813047096575831428573327212883166644588279144979421380028607516633355354781329218111463134089113111631230525332612342904042527691278259874579633656551223773964693614715246386079370583302106653724395975823730992244560130932086293320360430068393568321624823959602202302797222676585970598396000993279697634492682573123422286592901938716315443372162300680546744131806601910760228776149254420839938328194745052305991081917051695471101421346985603153814703464284104132904707936621811784500190861595205370527868741036325378172639606427235863553356961435221892156912012163445964178293630159680654726601224378580819871425474038821561027894609196469083554391586526089655575162937349858935693457266154284751173230763895680957794106211634450379074790924661471207490032228108457918218532249247925639182842128684183837591291649221118083170528826379402529607151604636861576491034935120798144110528795113748231945093752856030164549924855687834910152408412133142850130113927306624487332587143814185840283002597677087559830576908359734833841957551133657116553105698612881946360298080682459612058542604658306331977060875649810705549938153273150352133531110522606996040159893416893336086209220714144105759587156828028734013212844292167433220142180521468371370735620368708526701968052331706444545325039165043730061182081776318188103765631336936640803300496222578310980120584567024203740618028144947832931646902545836822176575104473768993787973930641169933718806994989065864448146104900786316720135316241541910834207460778159316623670765539512154229524259788301072384748485041664623085487539706221789738792240899010524943692924162678811882321727848142315415331814370644402518078722593303665102343877705240339285442765363639753394866119918461213742643631255435938436119230469056918893388348743321234238913714154302420221579771425784349142616215376249137361604832141466950199633862969420859014794696155862661645821005640870095990183522458864974030230903956267391145209514687859768891340679972330494270352582765122439359324542035896377811067710184626124031296613152599363426376233837182919742153295675343222162746121708080722080516378617834458447451308573238768641724164903123436362385304243962404745911128994475508020235554835523995814485507680578680751319926486633861334069308530297508543570729176941349227091836197658365448901641101438317990347206184348850217982354175914598911587384545732137972498972284321223462091629523638045969906598446689439797717163305320474969135834501288757871890571561806622968291820373387648027387292522051394049107973893570996579673130581947432285211853247099828521551922670407022729285389391254389620464145804267529055446433322634514983432440895668002505323311054814142792968499128685051770766212813069904206200224894110865996882717222647103019277905751167270753966305749827942781438080696040191216206689629803885715236449467709290016820462631940013267707913806930266029832690061032480537542257148110392164608499743728512656564945891083169575924994042271533972693852944125861332742879553270938607852966325369604592269350647216680876779607510047473259543416021880389406135801735404438524321954352750892837201121760627941360578298654196028616258289476083305322570720300863701162241464022852474978189363300579115019869530107383130340884586326372306794110158146249671974744250317990171168855233468234778325774549546370700826864631018024078385149446334801487751357150905204240735317339322557723589106629879530095425903219692399968792143323663181686691705117265233612307972159738410582252374305880190560954457264083289268568496160635832260809650382010573699466183990175280674175884608054057043279689826432577235240436449601886168781125562328561946113180332891589506227949161089802549241076818739966730438653147461288865253884962461317338596248116796502304506185632191001522799927270330219329464642172336533729287049968125065972702876684725010156019600100709473195631538778415963720114739943648962317056604665600898500332649730349812145259476055816933407279704999255025232146693244762806090067946770135342416798576888140379020317967717129702362311793191239585758738423987490280645203711722444680285296094362128239653083984083728727793106363385925580911018880735257430996059242230881621032005174645999774139447925063734959042767565607271404612747781726422664938766815726452245661028123879273825549240044433979060665954469447058990286507198820375873856251789396455051648230015529440397877996710843624274765858750829457471767716235676945482388906914593004195800548595081262159884016342181386477300653987307216106995949949475914410496970779337663462348773710616638805044205481777931680487230015965497918195769911424552016220859234616437716517762333639354560006938071907096532421090841298096819135304260602274183741516239947531592665506273653832913581710947478390859745588538400694684689117969722104774526112298363172013810398912100259720520600849429958867528671654563244156861960592276454559503655943788115610942509488269017655534188136242320754636140296854521941656555593930496047352015651563616910077020950131185265634856327815583868120509448422199931103634234994848705467356346963926669035080051905081300272013995995898944396499821339714478052899010380798042717252542631295091660007437047092104698277230090204267381747986621299089802187981693238302126014195899455696792709915920035617190796235944302653576188413213381003922516668126843083514679683245789825713651467009039902048438310498401158134513160585980879922024855748652443261569041152704148595919730115524689015634614455538447202056966502891137490612545606115883669136829725636654202786124647915016456401361508335697325268733472092154071829451231320967317250808703778937152060952708263144283727197888949665987951739140871270877151579268605180798951113073973628750883511831244827443715037297923841057656145648751311899366106025566444850472934835868170465232594214246008437966437608621142471525436579575713689169859871648470253989217437742398424175641281727748219461865769522215772780879986529319277317848382597698370393476532668103079480759976752611532192151808248905598003869373156737865233727865196687806952799077811572121926279166759411927922709689127235702167240206691802920347559925726397572383885892475643780428448091243058246387102620611961676278525175667998166169423824886672424336678702646572576275783706809286217959721263557949437447801190429202952155551968462757220893487027996146302895996134501379296258076418199753120546934445404015151453505744756718110030517038951604701421270202854200474840611310298771521868476021303441964605158740520790968259845896433791274696867774349871072422881767159107937798919743352814379883504455469917425494659797618148495459581614937054548818296340461212433701566841246488585873459215343504268085834096521813191238891212499271386404789436684365832244686268912542799669513058300113497441006119170778063625259295873633564812328272812476183200614221242080593996166352094829881320771536738020416528472927620054523201558451570902396343649179694473159426903899165403884644610091124193955758269822249872168151169531972582865808772544623392062620199497343775728314432500671737968653092388958106374271179529992851695218317974397599573178055358976127860467849041790250642426903716492380710995756317788311047702838194179411036947225640788580062057322972846048569690238281115506397938997579208694449716740388803961990826754146948592333712365847909351236972708032232418980962308334699753245557542162726674639177509213285727237499902222540211968619399946927501656836778536535562538645312434520569943850483482199287482325422515465394813832491031414550881520440160559223093210812980822468996096729725625099962668134385194008632454121605686052748739617440893339506965603468505010044823549122303277198180039823409017776387186952049842108186778671608794519160841869922815986285405478767243378636345840858840497617188729730806558608960510731298276164309383401359676194445642157626173803468604120930408377991038592925233096182118762624667782909023236916753738072805834305324383506696217024472902178754800377165580385496381735204733096965622107961447416994022543329336729981055842873387386008611237877381879997318848742435005859291574331915190997574104826355765203448496696546538399351840815888551717329083296340239697776313769142852255971496829770906013460722046156281849082052841879666743016540595999453434503746050141005997296417092538258230732152727602191649484115883329392851630171144136354104062085762322506526060043795646985218809163582813401963224112606347843989171565402655116835655713259516545573761143690352624806887868683008523281924649402831477987202132046414094440132666563522488464890884751469820046243898491356825489207272966294278055621296580676848582318607547552334555373388857545296965669680932553471773296571039784888471007302435607817568260540696396093144161510149766502169698527122306793035200928519951335870078122566202175013551117664221121448361199032030732440991252422709075053137748985220348852276652810713950492290264887355344659346832209345615073291519528501109019741977433706383956005572899830964782177660726795136563834699832868370379322931138662225144532495938506053035405151969713682324788100455222745459546878999845400410282125148729704708937407603612668079498782614761297072489117471529503245937782394660569692776747842883606929514629452006515700746480003115567565436494990249529488509763011232634067903530897410782195841291167158467584415298957825610007651798132674558579717701699809975730145817733619107372165804513991806293575379145436675079243300901831265584972177288404851366616896640673786942851856155098253599987909606248000050314051574744990740393956511754563231287833853899483075477997566311658042238462188455097832634122147531354123568836176649261918048149073255980931342803254975525222150650235373227770015950888390550874781321627888546468003934957534637011652535869680738791937251153717658994913083826606187217853266252704229574613610678930792492357259124043018493941027746296205522697288435654293777658396164388323565042162820503858323043001068724679142755651912148098317069231086225255200025332159055631185550870547835229661145705761720240839830655172028014573786479295902040783584066863319912160244961719142331535175817351602705987323406976939475122668853269964547319803337462957647725235845641250520365692143881072082040949490736539765891075064118349566344673173192196891095570775175393922112560341164193980340717144495343349778102078197886132810802488689819976679315390887121272679940570635409022560768273948239557162570003839008205619388049847430240807557335222407823287854970212625068350918517185394713132900932136036201590234915925730479531457526651219291187647409318740545065879443354004493140403577045605433872340692466163366833509953716745689020777600544028518704225149410722604137960034730470965018430452208280729436211717693144252980808277885487925533537227285354029457153847158005477189891817336862220172045683937175198400456102173183437921476825732614258705996010289992140061410249743094675634824789824481102795451954923819857902491500519045224750708289419614055544526645621761459894125104407523687754122507462824577236176255628396662697092213877232641314453703320545392388301745616329910826363742874099012661479471050614556993598635075391781378585477310746489370492687535136963755242583879875765365136663660108040386223641084443483619987660374635771222964198616722360981190810387206419011923365478893509865486181560052741427973141701568380796032787678752435010715815424964588080771684475084753402223589164597733086165127645423383440612393747660384265830291275664329304171804339507198534871214060822641493902030573398410295114452994120507605660425558339597425851411330154063652288588874265557448895139041779179210719490589622414412050046083726198397924230339354785295430829609379116079210011038353399687708929250889508207325620991387217218790637757370275765902230344756928984527951461844569566186093634154988574464186180359302356195386094605625907896623804018685937339947076993612909585648926901945629677685609879514985936132725198089776610782456264000186662436336622347431678482421246471439588181101205895416977673837294061228822889132774825980242741546694708742751260733702089451973284923600454103961260037007140925278931761335880609066275273385707192695153324852733608694329717269830981196090906228580054441462883072586245466128728864022612855614354519647297431358720961883046122843018914403253344610937549694000149301537324150543479909591690654463360150995330470909641238446822822416590789351307996953727469233019621181477487765949741481433055212187963815409283392996584918963213897321433498933380315495034924024335922075303966757184046339402949608836244928848812248096527414931187499532538256013593738847290167293538314238214306931804552800973479728294395333558855774074408032002746010103309817493580486378345457213028221063330210071874283978448269136906532545327907279056721904759494019830685734787339646388326776887989286166542432230482428589636133243924383606097810180765510780480553566243014537815841473066899650295032590111019449921294059646037284098905804632941746535136954179532799766572823635528153714124526810086309981730692924520933464539470973160297105511912708023893924636388483081612514353645142710716716220546461570821789949961237127926334475598283116917248258124193138725574550586171398880406613045778740636239129406166080316406254694791572688653915709316392942855728412221436586361200177947263493285696492417829613501379794786904309156389804267174226927647876252764622531627090475152632798276578779706186002284670097099740917714377516490003138816400306157903694313094648170875383409048902589731766179818721631813251523798310687636008098642045064501387109622667666182881677909328082011929778955698332418453166529198359423756108149286296450885512433485530427171362170197033348701342003428776696722798147376720654975023566046571071705291617795117028396895378468079265931898237030377457544382328947242265430259916178961544795911273413309483772281514760107839983143399937935298095933303805276644716549084300509777088057997641799141886911504911485195289401639706527213982919316810836690232910505231070398196021961617550269314894410363025337933088243515081442535433869461109315580597231532176432261217675570398130761844877297668897643693204580247738600789492461391902691435171071682369044805166275651367392752231545330606405518245354536765996914212055388770229797270434548213572880442008615442237433824343473887426594865797227141677376850193357820538077630734475989518740236583535313044943621302802018534311876352748753418840514583169121452743083945497383179644684900708153286688738908806330785029906660941862208642464504821531999446147628091659779924817800289691994298599454887575300355205260257228490118225673948719042729289746694298348347229857742326053042709540166583216505925765774364548168276026262692911423818073028244719441342915127860072387807883803415843628011264519137321133674908682545169406540600708074404574198499404053679797853045442827826078015431760268065808083924930676368089513353182824019492843598449996154562563053456937278082524098532231710564782726827588068412068725851547525421562307831323107607780176539279629815657513797737732410030314042803870700927589023243497045999644325050418332570243629751908323498199832011674809985596999850260294402224641526003456909997567928968463158570675953786955254570441867069639336204105586931527218099146458147576540865176350391116599165058986434337751399112087911855080051133003672035797834441727111404989565189087850905618652803847862918714414718982274116849254954417543019403849411114834395376990780478682154706379805537496043103489682151740723348911271129405551043369189740045947428863642677730878242995477422286939031404683767911412562090322449336022968083020254206936201849773768230454035526159353188631452754190627902181382188102189131582078466745549039309225797947249094526493908232987840803077455818039443249389266473668436467647995908222388143201506146555975918454270252416331839655417564152142177880711446725720454783231033211608516127293833132101300203156796206015709006173966105624799258363481314250015047985128540847558445087555777796808585141835664253787288074068010205412518768715011491650170195244161820641747992951867071068732819835803516904738080820735631257324543411879235135282312533648287123927949620840291705901291814266314735092406801171036263508761435896237918136784309077760402039055053123245516160876844198074466665752763349836967695483844534302618502793295838756928236587892896086236596310796032933673107960742644594801484941814840295112442475697782364398218929608795630669205223708411767385993958492814974818452474455115837077388594812252532342552778054073156353431863579808693950368631153784592889055288693673609156281300314179040364498027852544158415440834978999758818064057666961738618322081351889769107089859414947060603217946092030530856320081833443214982951639548532982923762473754603154714067616375669998541770375062693374496890064833849105537823686790525711828383518984095806375128829332730912087288069383399183163686681678146807481029215061030060731649181856269597177669655765138605892227876199714877259862295390656424855006509640955497539279332459052744397133527435841538802185590094954381895976918477159072772673292431028755581591280124277299482167329550763604308360612380216740669538487729769705031910314124311597297328723299224748485360240358316101747111218650421278718576380049520735109566450124330076577662272460013217774872687025088476964176366844981635863368853909503911044520215476871710883494939249442023974228365753376405810847885626091871134950876503828852980525596949134353723454009402389475564184063921622503356823864782115438229371014249441814898396592220707216499745286701394927105719855424955194568669036182885338427856874714952305114569178055401822944743374078075001444606370880129626147291764798037240983355353421658360134936839707417851969568481851847069710833432196107334964730059125502446924398014106110871156838387410633708192421498875456804248849185986799294786784967928058590682128125444910149705564385646254121462043235811048424869434863262447113867705731499057028672254000574171833589952743623909279601564017240359481613564144065593751121694501786496156094287728511249710365974144369895369730029912436837745607246930947864181854154991087958160088384035934995352692243756846144102669718226950158618177236168128508741184945206422832099951192487438288556664613690286724145975443071155392389550179412770709085320187514386603154388741222406668591484592436375053340470685769152246152447669053420931674374202396897159109627981280077559028806694658870036692401288443255727561193887111056656337929898603269702803239601579718498348791613961617536853762967594772617056611606455431914046697672157446663665763082984052628795384904802514352286323740734999176822073224813819256851783873660845454203885870607703471043632468778840067341834081921023409191970905740085783823499371512314908626828611940929668823515966758162517789942184968021470039528092381482966128735373737602237791037017416041538808879335998086648880333573417759820868478551728647739929268287597529192405078134218081370426123331389377170671536922475437261684514977428743905232194568531808622175477168315069118177705577350503118387010283951424956040104709360600899885595013885156738198542214656967885370877079783118978450513112069652988329362609684922171648757480204999069829334152998867684941142109317907448782829379756429705662139760527835749847122340934600914766408324646252836396287239111677970435576292162182528232225044137716332221959265807377718775434618594720342017149529384801384108790288309755887555465841498757629871339347755069917146128721086268319078174246380894635595128444176730728909328771097875499178178796075369521326242051625571046801326867529945634759525681726322669993298989272633208697107326126998944918386653405190445705538759744309383575983798865272262125773023376893153757412817851231143306989453101497471850494226621402670830687838995415595996524179545063749885847535411242185631278904616256834828170094883709701300060819000631451216073088550338212936142482500024147343230270227259313334916151690388487146420246196659807041657602829306798958697084029562781143744417230123246106593243916895808340998255699447218759520995942759617912984116555348275288292489563836225875984316647275020339997492288911694718440777617120741577418205331713548914833676080578424922345875586601293392808200249953572362071228469465127089109371474455606668501743094443808725462423465224489555197992735417245148181813335460224653405649995959717939105096906041608611639561360562940270397763241843608394075464712139054228524658551953626615570181966582693514404066811160068822582813849510143359560235974584113778909129158307904231405025500824619778706966929693100995143701791474793081949272331495639714781077096799892828023066253382365014556872229370873295831967304669828918367403936027284664226221884303104153232236344437538698535603372640215329309033945665891423272411928303403822536317136615300724312556520834750814614640434768606919472927715546030039901245656004343897864187139416398499397947719831693712764688606759649799451080273198703212992869529386127732532143111922723206818532479177839832421635061126500196257922848261899892011434792832149233779055569961411156781694630648267736984603160591207584301129256681074465526502020464698287682548841000816619736759925751142755095580104585223080765189431188716923480041433102148278647444208971867727938045877314245802477116375025348829642415640675292852162982320134920587108265088996435498700803440733806226598482600249098652719100617226467481351190221174499358001782002739729717932907211472090115569737157298228500685236782317474673532761105715161003207328713404979411751568673335431340835561861614062408826718964322029852800764691282502338756314571057107616199982780621054573224894157244690999404097169458977059526370611657542246705986921497450672812761676001180882361592819403031870929800818997178110281033423510589274365553133993050004790889841471077113059161669330579865872504875101500012360982701489813623401348630734919118091124453459691450908367307078204821909745022172946802395591085259157605186661845512145120036029177960160752429086017306120214826643890167670960512304511957635600775254144593982778218614572996451383584253929728289043875876286798104171038636418856890732281997582918818392261338901706460909220501250402902288645525002126614682901671039551523434611057906987684985069858916963688626824670644407201382357096648529890287730286692115742057858104828318954349573947609994425472144742009007086148522924011970014999473324365162935642105692269549513951219700675342297400130066497635796531806166409443312438439675229571390484380601823847332730085093088317699641614601918167352745905532583564077541518074459149297938905436789341894998236899974535926138334105100229805046417618691384866772588876854709803799069739199116685844408331896816865027153473129477118331822191861877096035693662760496449622972364289538669861937972464690976937909087846338950774897855683799820192569044100975734641265600728809850211199558660878363619861805735157737132066281374913092551175327528186543892562979680400392993701533142324532383891240254032289103616124999551561421623300405234069218991410477854898300601679963971850381321812817844631724204002456313835303864130026099369781006710833970489730652819601231264136981875367084586293200277100281702580211984073191429559829021415608125443108647681466797031836909784717175919834497821756502038646862622474334638559400706255448619885952199947145692693941956886762551308383031663264642757922048775097783321850643886272791769171956502925401038000081997718074238307178532991852001052819471878865906304765859407005419043452187598861083472699757409274314009060332310815217708618416361493212654460901143543704432009608718601148207958399494556837420567620231555351123194153606531124576147266869967333451329359169661929671494163609534768251426030965377983860239849324456472605355035066150862230347566450903336327720967486396541245911926512227983281648644604605276821377804583785619097957720605642616382990780269413676596389473873575638671986026543259698538418192071195335021138777964990179562404132121618438326051605489801883016938095282727906212850018343592932604641185778369820706844748928319718721971705711162324947357745478818106210645253731689128746781605607827047864282045749814694472563787484276148131895746939884628769472745274615964118927447234276902245069727202699546751464627214017896027094669409680855993778319295529698843471742752309119939516902465142890218307048509985473109532132359335630923049772637637649338040981692515926967845897261454263883876979240643497321069681955385424491237501603474263464258513782021702558909606362711303830912243188568288615221459334356984878337782082064542858772719208865165891269407348638228042611924702598445792099377467468721713029888760918881307779525198616217498313181837673733834385157743066471617661680706407025303549796104995030045815509687810676670125477479467147338175103467498567506196228880679553393517547159883008125677953822811189330491342772180974143361060257602806849259382473827588457292277806626072586819791773635471379817901099733343671659883936885542433174086548527248483515236832469850281051847404248888714555947069834104823268224500574740036530521582904728047742606029984764705746765367164240625297024194218689465269975164164542706630144074650932838037196639095383238768676085456090938616328869149266073040216303470146374722541543489727312495859279570651067370255826439458529124074931690336708654471944708025830240765219210546732241938706739326914109452180337095353976512222577103690962638236462848975928486867896605566952672750819050623555685742477776056531643726916638257712034394279367866958422608215588997516648864367192786576636622260695761507153233757124061842644248105732447880903825173673634581094063639883418730841272826384273497575141381971615988774123288462758454729934636546141848819841888294267880258890661616846238271201419170052006019287619485577351102098438314657900406034719679126627748620376929227353708873929360357861858937936382624200495819568162437362664912347890681069262434240035845244747625107271108259646075455128185050750954693139680093989223235381106047872508941787793044585130660010980410146097822123879231116881591456320664615275991270667401189105831798455993936996495956557687321864685757959292547129917947824052107384605430626181076978759738311708464174460704827207469838154044543528851170993391671838448759549304499076299238183150106645122610199596899198133186095861051646939746545771822414950376737574553321690649862490868418994727131863933134644133479146602230635149937236712311479151537767878021877279372954019266802453917774237197223816934487708096404369726721175518301397965476381865687290780535901688130667276841359655456318151898580977524103824927534439256077115225079088963168936939208729796455578216710929283702615910402615129266207803575486739077333905251837020432109610547678901270748029891821245854812324596541409274823625170303872377459500206201208071819573626307106992473393233998843728067731965045309163333771512042066926012527978542356830975629059235193501517731016300830997186503916083156136848886256269871983822365038921066329746629183437249306349555104366436691813362924700130675346689603486629833642033994022531448126444278401593656733058655692300140206548891608287545475967840025184123278131656880964715426328910562806914605969561100075049582262961107242870313230705249733662860659033740212562701994738305487010805386873081514157839045855526250252752669681700033545341292192849371718091718998568203461692370221388515494197799554080468191460653079009146907662435510285353821665760703106551636223951426502536836369411917483273996616541978766926852891554174010617531027236107258153013204719528090740406989594313832777400568504770073353146599201623466094432590505069746204161921434185680004729055307927270183441580938047343498766060597644056141419268124341260143986673185124957008557782073519826870329812262539676472079730904058878627593245317918208914567570055152984894385396226769033678501491893570168149767108992696739279890885343701501382862807454732578208884610214481308504490113434271281166623238585873002718642793870183866082724133518004437983539679749210291020927239831381632211636675791072726467750922977650661309544692083572995799344727374258405481860193944288991881691238161454147106433105232219333354499254163499078164069162934476474570376688177209754461800506352193584518906684725107032636590530540434807090423546534945789097303819899066842153772778936553793292382410416434053673836410188082879469133391335603888510945731360071637028152565573043724988068227158126006146341145399458470111027334391631054340471254661554954034881162580080838224921008448518143685062704028187893316844949122308025158438913432736980100903115279148580864905045803542219269674033405608441592412135673312562394811544227035905320529770089685898487558806410878870721008958934375321687113602100496522649340093228134831536387332970331933353036841274371816590234726610497976878095143677725110006465922575014308818353536117732816260239480704721163579444383143232400237338721013902159375756663263916632321573816315038985520736809775838316093096598623289042482381979575485888694327680532474311729563973294843149125488652538463203702932373482395835009730707779870139502143900885022193791982394939113142204392685669400114915191146490336904888902173306119640343280737618435092583520095285129030673135577312249152068332022517458035747534041469774726505924781461846667774232070691985687151309304305797033302542151234641724571511942682226641583750399519336904095920620122677173635419736342647886560348609021668031384018857516038482703594894438913286835111231135132085516438501448408644302826708994185112017362465561047675672657716469866703362076720416277762942144895250055455732015727159778525321526968456163901612603095925040602099336173659100243720066656662967424323983934205511711984467708969584240562044250492774985175094031647097843781830206896626054810252562683899383066660497272295005218776201915229672274777455885568081231464998732890220809438667402191400428226233564843777965649382560478506161386673298701857163988275489034103342357006796526268105832918924694914754840720040069745715124656388092709178584215448118593617097024670523850919806119710680951960778062201328208636418334116699774229875038729400203178281450830694122706902696937809471470079200563577536328892342958220593404539900789746621033324934821822157437801364897729431943141370728257854447367409961252478762199896512453310650910139920189793820341055880226677801499635699403301001553978284027662976883270673507826255101468798038231490041828285474602699203999241425064059561649050023124242357918105600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000